1 : // xlocinfo internal header for Microsoft
2 : #pragma once
3 : #ifndef _XLOCINFO_
4 : #define _XLOCINFO_
5 : #ifndef RC_INVOKED
6 : #include <xlocinfo.h>
7 : #include <cstdlib>
8 : #include <xstddef>
9 :
10 : #ifdef _MSC_VER
11 : #pragma pack(push,_CRT_PACKING)
12 : #pragma warning(push,3)
13 : #pragma warning(disable:4412)
14 : #endif /* _MSC_VER */
15 :
16 : _STD_BEGIN
17 :
18 : // CLASS _Timevec
19 : class _CRTIMP2_PURE _Timevec
20 : { // smart pointer to information used by _Strftime
21 : public:
22 : __CLR_OR_THIS_CALL _Timevec(void *_Ptr = 0)
23 : : _Timeptr(_Ptr)
24 : { // construct from ptr
25 : }
26 :
27 : __CLR_OR_THIS_CALL _Timevec(const _Timevec& _Right)
28 : { // construct from _Right
29 : *this = _Right;
30 : }
31 :
32 : __CLR_OR_THIS_CALL ~_Timevec()
33 : { // destroy the object
34 : free(_Timeptr);
35 : }
36 :
37 : _Timevec& __CLR_OR_THIS_CALL operator=(const _Timevec& _Right)
38 : { // transfer ownership of _Timeptr from _Right
39 : _Timeptr = _Right._Timeptr;
40 : ((_Timevec *)&_Right)->_Timeptr = 0;
41 : return (*this);
42 : }
43 :
44 : void *__CLR_OR_THIS_CALL _Getptr() const
45 : { // return pointer to time information
46 : return (_Timeptr);
47 : }
48 :
49 : private:
50 : void *_Timeptr; // pointer to time information
51 : };
52 :
53 : // CLASS _Locinfo
54 :
55 : // warning 4412 is benign here
56 : #pragma warning(push)
57 : #pragma warning(disable:4412)
58 : class _CRTIMP2_PURE _Locinfo
59 : { // summary of all stuff peculiar to a locale used by standard facets
60 : public:
61 : typedef ::_Collvec _Collvec;
62 : typedef ::_Ctypevec _Ctypevec;
63 : typedef ::_Cvtvec _Cvtvec;
64 : typedef std::_Timevec _Timevec;
65 :
66 : static _MRTIMP2_NPURE void __cdecl _Locinfo_ctor(_Locinfo *, const char *);
67 : static _MRTIMP2_NPURE void __cdecl _Locinfo_ctor(_Locinfo *, const string&);
68 : static _MRTIMP2_NPURE void __cdecl _Locinfo_ctor(_Locinfo *, int, const char *);
69 : static _MRTIMP2_NPURE void __cdecl _Locinfo_dtor(_Locinfo *);
70 : static _MRTIMP2_NPURE _Locinfo& __cdecl _Locinfo_Addcats(_Locinfo *, int, const char *);
71 :
72 : __CLR_OR_THIS_CALL _Locinfo(const char *_Pch = "C")
73 : #ifndef _M_CEE
74 : : _Lock(_LOCK_LOCALE)
75 : #endif
76 : {
77 : if (_Pch == 0)
78 : _THROW_NCEE(runtime_error, "bad locale name");
79 : _Locinfo_ctor(this, _Pch);
80 : }
81 :
82 : __CLR_OR_THIS_CALL _Locinfo(int _I, const char *_Pch)
83 : #ifndef _M_CEE
84 : : _Lock(_LOCK_LOCALE)
85 : #endif
86 : {
87 : if (_Pch == 0)
88 : _THROW_NCEE(runtime_error, "bad locale name");
89 : _Locinfo_ctor(this, _I, _Pch);
90 : }
91 :
92 : __CLR_OR_THIS_CALL _Locinfo(const string& locstr)
93 : #ifndef _M_CEE
94 : : _Lock(_LOCK_LOCALE)
95 : #endif
96 10 : {
97 10 : _Locinfo_ctor(this, locstr);
98 10 : }
99 :
100 : __CLR_OR_THIS_CALL ~_Locinfo()
101 10 : {
102 10 : _Locinfo_dtor(this);
103 10 : }
104 :
105 : _Locinfo& __CLR_OR_THIS_CALL _Addcats(int _I, const char *_Pch)
106 : {
107 : if (_Pch == 0)
108 : _THROW(runtime_error, "bad locale name");
109 : return _Locinfo_Addcats(this, _I, _Pch);
110 : }
111 :
112 : string __CLR_OR_THIS_CALL _Getname() const
113 : { // return the new locale name
114 : return (_Newlocname);
115 : }
116 :
117 : _Collvec __CLR_OR_THIS_CALL _Getcoll() const
118 : { // return collation stuff
119 : return (::_Getcoll());
120 : }
121 :
122 : _Ctypevec __CLR_OR_THIS_CALL _Getctype() const
123 10 : { // return ctype stuff
124 10 : return (::_Getctype());
125 10 : }
126 :
127 : _Cvtvec __CLR_OR_THIS_CALL _Getcvt() const
128 9 : { // return codecvt stuff
129 9 : return (::_Getcvt());
130 9 : }
131 :
132 : const lconv *__CLR_OR_THIS_CALL _Getlconv() const
133 9 : { // return localeconv stuff
134 9 : return (localeconv());
135 9 : }
136 :
137 : _Timevec __CLR_OR_THIS_CALL _Gettnames() const
138 : { // return names used by _Strftime
139 : return (_Timevec(::_Gettnames()));
140 : }
141 :
142 : const char *__CLR_OR_THIS_CALL _Getdays() const
143 : { // return names for weekdays
144 : const char *_Ptr = ::_Getdays();
145 : if (_Ptr != 0)
146 : { // capture names and free allocated C string
147 : ((_Locinfo *)this)->_Days = _Ptr;
148 : free((void *)_Ptr);
149 : }
150 : return (_Days.size() != 0 ? _Days.c_str()
151 : : ":Sun:Sunday:Mon:Monday:Tue:Tuesday:Wed:Wednesday"
152 : ":Thu:Thursday:Fri:Friday:Sat:Saturday");
153 : }
154 :
155 : const char *__CLR_OR_THIS_CALL _Getmonths() const
156 : { // return names for months
157 : const char *_Ptr = ::_Getmonths();
158 : if (_Ptr != 0)
159 : { // capture names and free allocated C string
160 : ((_Locinfo *)this)->_Months = _Ptr;
161 : free((void *)_Ptr);
162 : }
163 : return (_Months.size() != 0 ? _Months.c_str()
164 : : ":Jan:January:Feb:February:Mar:March"
165 : ":Apr:April:May:May:Jun:June"
166 : ":Jul:July:Aug:August:Sep:September"
167 : ":Oct:October:Nov:November:Dec:December");
168 : }
169 :
170 : const char *__CLR_OR_THIS_CALL _Getfalse() const
171 9 : { // return false name (no C source)
172 9 : return ("false");
173 9 : }
174 :
175 : const char *__CLR_OR_THIS_CALL _Gettrue() const
176 9 : { // return true name (no C source)
177 9 : return ("true");
178 9 : }
179 :
180 : int __CLR_OR_THIS_CALL _Getdateorder() const
181 : { // return date order
182 : return ::_Getdateorder();
183 : }
184 :
185 : private:
186 : #ifdef _M_CEE
187 : // in managed code we need to manually take the lock;
188 : // we use an empty structure to mantain the same size
189 : _EmptyLockit _Empty_lock;
190 : #else
191 : _Lockit _Lock; // thread lock, because global locale is altered
192 : #endif
193 : string _Days; // weekday names
194 : string _Months; // month names
195 : string _Oldlocname; // old locale name to revert to on destruction
196 : string _Newlocname; // new locale name for this object
197 : };
198 : #pragma warning(pop)
199 :
200 : // TEMPLATE FUNCTION _LStrcoll
201 : template<class _Elem> inline
202 : int __CRTDECL _LStrcoll(const _Elem *_First1, const _Elem *_Last1,
203 : const _Elem *_First2, const _Elem *_Last2,
204 : const _Locinfo::_Collvec *)
205 : { // perform locale-specific comparison of _Elem sequences
206 : for (; _First1 != _Last1 && _First2 != _Last2; ++_First1, ++_First2)
207 : if (*_First1 < *_First2)
208 : return (-1); // [_First1, _Last1) < [_First2, _Last2)
209 : else if (*_First2 < *_First1)
210 : return (+1); // [_First1, _Last1) > [_First2, _Last2)
211 : return (_First2 != _Last2 ? -1 : _First1 != _Last1 ? +1 : 0);
212 : }
213 :
214 : template<> inline
215 : int __CRTDECL _LStrcoll(const char *_First1, const char *_Last1,
216 : const char *_First2, const char *_Last2,
217 : const _Locinfo::_Collvec *_Vector)
218 : { // perform locale-specific comparison of char sequences
219 : return (_Strcoll(_First1, _Last1, _First2, _Last2, _Vector));
220 : }
221 :
222 : template<> inline
223 : int __CRTDECL _LStrcoll(const wchar_t *_First1, const wchar_t *_Last1,
224 : const wchar_t *_First2, const wchar_t *_Last2,
225 : const _Locinfo::_Collvec *_Vector)
226 : { // perform locale-specific comparison of wchar_t sequences
227 : return (_Wcscoll(_First1, _Last1, _First2, _Last2, _Vector));
228 : }
229 :
230 : // TEMPLATE FUNCTION _LStrxfrm
231 : template<class _Elem> inline
232 : size_t __CRTDECL _LStrxfrm(_Elem *_First1, _Elem *_Last1,
233 : const _Elem *_First2, const _Elem *_Last2,
234 : const _Locinfo::_Collvec *)
235 : { // perform locale-specific transform of _Elems [_First1, _Last1)
236 : size_t _Count = _Last2 - _First2;
237 : if (_Count <= (size_t)(_Last1 - _First1))
238 : _CRT_SECURE_MEMCPY(_First1, (_Last1 - _First1)* sizeof(_Elem), _First2, _Count * sizeof (_Elem));
239 : return (_Count);
240 : }
241 :
242 : template<> inline
243 : size_t __CRTDECL _LStrxfrm(
244 : _Out_cap_x_(_Last1-_First1) _Post_count_( return) char *_First1,
245 : _In_z_ char *_Last1,
246 : const char *_First2, const char *_Last2,
247 : const _Locinfo::_Collvec *_Vector)
248 : { // perform locale-specific transform of chars [_First1, _Last1)
249 : return (_Strxfrm(_First1, _Last1, _First2, _Last2, _Vector));
250 : }
251 :
252 : template<> inline
253 : size_t __CRTDECL _LStrxfrm(
254 : _Out_cap_x_(_Last1-_First1) _Post_count_( return) wchar_t *_First1,
255 : _In_z_ wchar_t *_Last1,
256 : const wchar_t *_First2, const wchar_t *_Last2,
257 : const _Locinfo::_Collvec *_Vector)
258 : { // perform locale-specific transform of wchar_ts [_First1, _Last1)
259 : return (_Wcsxfrm(_First1, _Last1, _First2, _Last2, _Vector));
260 : }
261 : _STD_END
262 : #ifdef _MSC_VER
263 : #pragma warning(pop)
264 : #pragma pack(pop)
265 : #endif /* _MSC_VER */
266 :
267 : #endif /* RC_INVOKED */
268 : #endif /* _XLOCINFO_ */
269 :
270 : /*
271 : * Copyright (c) 1992-2007 by P.J. Plauger. ALL RIGHTS RESERVED.
272 : * Consult your license regarding permissions and restrictions.
273 : V5.03:0009 */
|