libstdc++
|
00001 // Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- 00002 00003 // Copyright (C) 2002-2019 Free Software Foundation, Inc. 00004 // 00005 // This file is part of the GNU ISO C++ Library. This library is free 00006 // software; you can redistribute it and/or modify it under the 00007 // terms of the GNU General Public License as published by the 00008 // Free Software Foundation; either version 3, or (at your option) 00009 // any later version. 00010 00011 // This library is distributed in the hope that it will be useful, 00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 // GNU General Public License for more details. 00015 00016 // Under Section 7 of GPL version 3, you are granted additional 00017 // permissions described in the GCC Runtime Library Exception, version 00018 // 3.1, as published by the Free Software Foundation. 00019 00020 // You should have received a copy of the GNU General Public License and 00021 // a copy of the GCC Runtime Library Exception along with this program; 00022 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 00023 // <http://www.gnu.org/licenses/>. 00024 00025 /** @file bits/c++locale_internal.h 00026 * This is an internal header file, included by other library headers. 00027 * Do not attempt to use it directly. @headername{locale} 00028 */ 00029 00030 // Written by Jakub Jelinek <jakub@redhat.com> 00031 00032 #include <bits/c++config.h> 00033 #include <clocale> 00034 #include <cstdlib> 00035 #include <cstring> 00036 #include <cstddef> 00037 #include <langinfo.h> 00038 00039 #include <vector> 00040 #include <string.h> // ::strdup 00041 00042 #include <ext/concurrence.h> 00043 00044 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) 00045 00046 extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; 00047 extern "C" __typeof(strcoll_l) __strcoll_l; 00048 extern "C" __typeof(strftime_l) __strftime_l; 00049 extern "C" __typeof(strtod_l) __strtod_l; 00050 extern "C" __typeof(strtof_l) __strtof_l; 00051 extern "C" __typeof(strtold_l) __strtold_l; 00052 extern "C" __typeof(strxfrm_l) __strxfrm_l; 00053 extern "C" __typeof(newlocale) __newlocale; 00054 extern "C" __typeof(freelocale) __freelocale; 00055 extern "C" __typeof(duplocale) __duplocale; 00056 extern "C" __typeof(uselocale) __uselocale; 00057 00058 #ifdef _GLIBCXX_USE_WCHAR_T 00059 extern "C" __typeof(iswctype_l) __iswctype_l; 00060 extern "C" __typeof(towlower_l) __towlower_l; 00061 extern "C" __typeof(towupper_l) __towupper_l; 00062 extern "C" __typeof(wcscoll_l) __wcscoll_l; 00063 extern "C" __typeof(wcsftime_l) __wcsftime_l; 00064 extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; 00065 extern "C" __typeof(wctype_l) __wctype_l; 00066 #endif 00067 00068 #endif // GLIBC 2.3 and later 00069 00070 namespace std _GLIBCXX_VISIBILITY(default) 00071 { 00072 _GLIBCXX_BEGIN_NAMESPACE_VERSION 00073 00074 struct Catalog_info 00075 { 00076 Catalog_info(messages_base::catalog __id, const char* __domain, 00077 locale __loc) 00078 : _M_id(__id), _M_domain(strdup(__domain)), _M_locale(__loc) 00079 { } 00080 00081 ~Catalog_info() 00082 { free(_M_domain); } 00083 00084 messages_base::catalog _M_id; 00085 char* _M_domain; 00086 locale _M_locale; 00087 00088 private: 00089 Catalog_info(const Catalog_info&); 00090 00091 Catalog_info& 00092 operator=(const Catalog_info&); 00093 }; 00094 00095 class Catalogs 00096 { 00097 public: 00098 Catalogs() : _M_catalog_counter(0) { } 00099 ~Catalogs(); 00100 00101 messages_base::catalog 00102 _M_add(const char* __domain, locale __l); 00103 00104 void 00105 _M_erase(messages_base::catalog __c); 00106 00107 const Catalog_info* 00108 _M_get(messages_base::catalog __c) const; 00109 00110 private: 00111 mutable __gnu_cxx::__mutex _M_mutex; 00112 messages_base::catalog _M_catalog_counter; 00113 vector<Catalog_info*> _M_infos; 00114 }; 00115 00116 Catalogs& 00117 get_catalogs(); 00118 00119 _GLIBCXX_END_NAMESPACE_VERSION 00120 } // namespace