1    	// Wrapper for underlying C-language localization -*- C++ -*-
2    	
3    	// Copyright (C) 2001-2013 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.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   	//
31   	// ISO C++ 14882: 22.8  Standard locale categories.
32   	//
33   	
34   	// Written by Benjamin Kosnik <bkoz@redhat.com>
35   	
36   	#ifndef _GLIBCXX_CXX_LOCALE_H
37   	#define _GLIBCXX_CXX_LOCALE_H 1
38   	
39   	#pragma GCC system_header
40   	
41   	#include <clocale>
42   	
43   	#define _GLIBCXX_C_LOCALE_GNU 1
44   	
45   	#define _GLIBCXX_NUM_CATEGORIES 6
46   	
47   	#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
48   	namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
49   	{
50   	_GLIBCXX_BEGIN_NAMESPACE_VERSION
51   	
52   	  extern "C" __typeof(uselocale) __uselocale;
53   	
54   	_GLIBCXX_END_NAMESPACE_VERSION
55   	} // namespace
56   	#endif
57   	
58   	namespace std _GLIBCXX_VISIBILITY(default)
59   	{
60   	_GLIBCXX_BEGIN_NAMESPACE_VERSION
61   	
62   	  typedef __locale_t		__c_locale;
63   	
64   	  // Convert numeric value of type double and long double to string and
65   	  // return length of string.  If vsnprintf is available use it, otherwise
66   	  // fall back to the unsafe vsprintf which, in general, can be dangerous
67   	  // and should be avoided.
68   	  inline int
69   	  __convert_from_v(const __c_locale& __cloc __attribute__ ((__unused__)),
70   			   char* __out,
71   			   const int __size __attribute__ ((__unused__)),
72   			   const char* __fmt, ...)
73   	  {
74   	#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
75   	    __c_locale __old = __gnu_cxx::__uselocale(__cloc);
76   	#else
77   	    char* __old = std::setlocale(LC_NUMERIC, 0);
78   	    char* __sav = 0;
79   	    if (__builtin_strcmp(__old, "C"))
80   	      {
81   		const size_t __len = __builtin_strlen(__old) + 1;
82   		__sav = new char[__len];
83   		__builtin_memcpy(__sav, __old, __len);
84   		std::setlocale(LC_NUMERIC, "C");
85   	      }
86   	#endif
87   	
88   	    __builtin_va_list __args;
89   	    __builtin_va_start(__args, __fmt);
90   	
91   	#ifdef _GLIBCXX_USE_C99
92   	    const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args);
93   	#else
94   	    const int __ret = __builtin_vsprintf(__out, __fmt, __args);
95   	#endif
96   	
97   	    __builtin_va_end(__args);
98   	
99   	#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
100  	    __gnu_cxx::__uselocale(__old);
101  	#else
102  	    if (__sav)
103  	      {
104  		std::setlocale(LC_NUMERIC, __sav);
105  		delete [] __sav;
106  	      }
107  	#endif
108  	    return __ret;
109  	  }
110  	
111  	_GLIBCXX_END_NAMESPACE_VERSION
112  	} // namespace
113  	
114  	#endif
115