1  // Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*-
       2  
       3  // Copyright (C) 2002-2023 Free Software Foundation, Inc.
       4  //
       5  // This file is part of the GNU ISO C++ Library.  This library is free
       6  // software; you can redistribute it and/or modify it under the
       7  // terms of the GNU General Public License as published by the
       8  // Free Software Foundation; either version 3, or (at your option)
       9  // any later version.
      10  
      11  // This library is distributed in the hope that it will be useful,
      12  // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14  // GNU General Public License for more details.
      15  
      16  // Under Section 7 of GPL version 3, you are granted additional
      17  // permissions described in the GCC Runtime Library Exception, version
      18  // 3.1, as published by the Free Software Foundation.
      19  
      20  // You should have received a copy of the GNU General Public License and
      21  // a copy of the GCC Runtime Library Exception along with this program;
      22  // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      23  // <http://www.gnu.org/licenses/>.
      24  
      25  /** @file bits/c++locale_internal.h
      26   *  This is an internal header file, included by other library headers.
      27   *  Do not attempt to use it directly. @headername{locale}
      28   */
      29  
      30  // Written by Jakub Jelinek <jakub@redhat.com>
      31  
      32  #include <bits/c++config.h>
      33  #include <clocale>
      34  #include <cstdlib>
      35  #include <cstring>
      36  #include <cstddef>
      37  #include <langinfo.h>
      38  
      39  #include <vector>
      40  #include <string.h>	// ::strdup
      41  
      42  #include <ext/concurrence.h>
      43  
      44  #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
      45  
      46  extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l;
      47  extern "C" __typeof(strcoll_l) __strcoll_l;
      48  extern "C" __typeof(strftime_l) __strftime_l;
      49  extern "C" __typeof(strtod_l) __strtod_l;
      50  extern "C" __typeof(strtof_l) __strtof_l;
      51  extern "C" __typeof(strtold_l) __strtold_l;
      52  extern "C" __typeof(strxfrm_l) __strxfrm_l;
      53  extern "C" __typeof(newlocale) __newlocale;
      54  extern "C" __typeof(freelocale) __freelocale;
      55  extern "C" __typeof(duplocale) __duplocale;
      56  extern "C" __typeof(uselocale) __uselocale;
      57  
      58  #ifdef _GLIBCXX_USE_WCHAR_T
      59  extern "C" __typeof(iswctype_l) __iswctype_l;
      60  extern "C" __typeof(towlower_l) __towlower_l;
      61  extern "C" __typeof(towupper_l) __towupper_l;
      62  extern "C" __typeof(wcscoll_l) __wcscoll_l;
      63  extern "C" __typeof(wcsftime_l) __wcsftime_l;
      64  extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l;
      65  extern "C" __typeof(wctype_l) __wctype_l;
      66  #endif
      67  
      68  #endif // GLIBC 2.3 and later
      69  
      70  namespace std _GLIBCXX_VISIBILITY(default)
      71  {
      72  _GLIBCXX_BEGIN_NAMESPACE_VERSION
      73  
      74    struct Catalog_info
      75    {
      76      Catalog_info(messages_base::catalog __id, const char* __domain,
      77  		 locale __loc)
      78        : _M_id(__id), _M_domain(strdup(__domain)), _M_locale(__loc)
      79      { }
      80  
      81      ~Catalog_info()
      82      { free(_M_domain); }
      83  
      84      messages_base::catalog _M_id;
      85      char* _M_domain;
      86      locale _M_locale;
      87  
      88    private:
      89      Catalog_info(const Catalog_info&);
      90  
      91      Catalog_info&
      92      operator=(const Catalog_info&);
      93    };
      94  
      95    class Catalogs
      96    {
      97    public:
      98      Catalogs() : _M_catalog_counter(0) { }
      99      ~Catalogs();
     100  
     101      messages_base::catalog
     102      _M_add(const char* __domain, locale __l);
     103  
     104      void
     105      _M_erase(messages_base::catalog __c);
     106  
     107      const Catalog_info*
     108      _M_get(messages_base::catalog __c) const;
     109  
     110    private:
     111      mutable __gnu_cxx::__mutex _M_mutex;
     112      messages_base::catalog _M_catalog_counter;
     113      vector<Catalog_info*> _M_infos;
     114    };
     115  
     116    Catalogs&
     117    get_catalogs();
     118  
     119  _GLIBCXX_END_NAMESPACE_VERSION
     120  } // namespace