1// Wrapper for underlying C-language localization -*- C++ -*- 2 3// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 4// Free Software Foundation, Inc. 5// 6// This file is part of the GNU ISO C++ Library. This library is free 7// software; you can redistribute it and/or modify it under the 8// terms of the GNU General Public License as published by the 9// Free Software Foundation; either version 2, or (at your option) 10// any later version. 11 12// This library is distributed in the hope that it will be useful, 13// but WITHOUT ANY WARRANTY; without even the implied warranty of 14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15// GNU General Public License for more details. 16 17// You should have received a copy of the GNU General Public License along 18// with this library; see the file COPYING. If not, write to the Free 19// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 20// USA. 21 22// As a special exception, you may use this file as part of a free software 23// library without restriction. Specifically, if other files instantiate 24// templates or use macros or inline functions from this file, or you compile 25// this file and link it with other files to produce an executable, this 26// file does not by itself cause the resulting executable to be covered by 27// the GNU General Public License. This exception does not however 28// invalidate any other reasons why the executable file might be covered by 29// the GNU General Public License. 30 31// 32// ISO C++ 14882: 22.8 Standard locale categories. 33// 34 35// Written by Benjamin Kosnik <bkoz@redhat.com> 36 37#include <cerrno> // For errno 38#include <locale> 39#include <stdexcept> 40#include <langinfo.h> 41#include <bits/c++locale_internal.h> 42 43_GLIBCXX_BEGIN_NAMESPACE(std) 44 45 template<> 46 void 47 __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, 48 const __c_locale& __cloc) 49 { 50 char* __sanity; 51 errno = 0; 52 float __f = __strtof_l(__s, &__sanity, __cloc); 53 if (__sanity != __s && errno != ERANGE) 54 __v = __f; 55 else 56 __err |= ios_base::failbit; 57 } 58 59 template<> 60 void 61 __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, 62 const __c_locale& __cloc) 63 { 64 char* __sanity; 65 errno = 0; 66 double __d = __strtod_l(__s, &__sanity, __cloc); 67 if (__sanity != __s && errno != ERANGE) 68 __v = __d; 69 else 70 __err |= ios_base::failbit; 71 } 72 73 template<> 74 void 75 __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, 76 const __c_locale& __cloc) 77 { 78 char* __sanity; 79 errno = 0; 80#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) 81 // Prefer strtold_l, as __strtold_l isn't prototyped in more recent 82 // glibc versions. 83 long double __ld = strtold_l(__s, &__sanity, __cloc); 84#else 85 long double __ld = __strtold_l(__s, &__sanity, __cloc); 86#endif 87 if (__sanity != __s && errno != ERANGE) 88 __v = __ld; 89 else 90 __err |= ios_base::failbit; 91 } 92 93 void 94 locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, 95 __c_locale __old) 96 { 97 __cloc = __newlocale(1 << LC_ALL, __s, __old); 98 if (!__cloc) 99 { 100 // This named locale is not supported by the underlying OS. 101 __throw_runtime_error(__N("locale::facet::_S_create_c_locale " 102 "name not valid")); 103 } 104 } 105 106 void 107 locale::facet::_S_destroy_c_locale(__c_locale& __cloc) 108 { 109 if (__cloc && _S_get_c_locale() != __cloc) 110 __freelocale(__cloc); 111 } 112 113 __c_locale 114 locale::facet::_S_clone_c_locale(__c_locale& __cloc) 115 { return __duplocale(__cloc); } 116 117_GLIBCXX_END_NAMESPACE 118 119_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) 120 121 const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = 122 { 123 "LC_CTYPE", 124 "LC_NUMERIC", 125 "LC_TIME", 126 "LC_COLLATE", 127 "LC_MONETARY", 128 "LC_MESSAGES", 129 "LC_PAPER", 130 "LC_NAME", 131 "LC_ADDRESS", 132 "LC_TELEPHONE", 133 "LC_MEASUREMENT", 134 "LC_IDENTIFICATION" 135 }; 136 137_GLIBCXX_END_NAMESPACE 138 139_GLIBCXX_BEGIN_NAMESPACE(std) 140 141 const char* const* const locale::_S_categories = __gnu_cxx::category_names; 142 143_GLIBCXX_END_NAMESPACE 144 145// XXX GLIBCXX_ABI Deprecated 146#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT 147#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \ 148 extern "C" void ldbl (void) __attribute__ ((alias (#dbl))) 149_GLIBCXX_LDBL_COMPAT(_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct, _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct); 150#endif // _GLIBCXX_LONG_DOUBLE_COMPAT 151