1 // xlocnum internal header (from <locale>)
2 #pragma once
3 #ifndef _XLOCNUM_
4 #define _XLOCNUM_
5 #ifndef RC_INVOKED
6 #include <climits>
7 #include <cstdio>
8 #include <cstdlib>
9 #include <streambuf>
10
11 #ifdef _MSC_VER
12  #pragma pack(push,_CRT_PACKING)
13  #pragma warning(push,3)
14 #endif  /* _MSC_VER */
15
16         // TEXT-TO-NUMERIC CONVERSION FUNCTIONS
17 _C_STD_BEGIN
18 #if defined(__cplusplus) && !defined(MRTDLL) && !defined(_M_CEE_PURE)
19 _C_LIB_DECL
20 #endif
21 extern _CRTIMP2_PURE float __CLRCALL_PURE_OR_CDECL _Stofx(const char *,_Out_opt_ _Deref_post_opt_valid_ char **,
22         long, int *);
23 extern _CRTIMP2_PURE double __CLRCALL_PURE_OR_CDECL _Stodx(const char *,_Out_opt_ _Deref_post_opt_valid_ char **,
24         long, int *);
25 extern _CRTIMP2_PURE long double __CLRCALL_PURE_OR_CDECL _Stoldx(const char *,_Out_opt_ _Deref_post_opt_valid_ char **,
26         long, int *);
27 extern _CRTIMP2_PURE long __CLRCALL_PURE_OR_CDECL _Stolx(const char *,_Out_opt_ _Deref_post_opt_valid_ char **, int,
28         int *);
29 extern _CRTIMP2_PURE unsigned long __CLRCALL_PURE_OR_CDECL _Stoulx(const char *,_Out_opt_ _Deref_post_opt_valid_ char **,
30         int, int *);
31
32   #ifdef _LONGLONG
33
34 extern _CRTIMP2_PURE _LONGLONG __CLRCALL_PURE_OR_CDECL _Stollx(const char *,_Out_opt_ _Deref_post_opt_valid_  char **,
35         int, int *);
36 extern _CRTIMP2_PURE _ULONGLONG __CLRCALL_PURE_OR_CDECL _Stoullx(const char *,_Out_opt_ _Deref_post_opt_valid_  char **,
37         int, int *);
38   #endif /* _LONGLONG */
39
40 #if defined(__cplusplus) && !defined(MRTDLL) && !defined(_M_CEE_PURE)
41 _END_C_LIB_DECL
42 #endif
43 _C_STD_END
44
45   #ifdef _LONGLONG
46      #define _STOLL(buf, ptr, base, perr)        _Stollx(buf, ptr, base, perr)
47      #define _STOULL(buf, ptr, base, perr)    _Stoullx(buf, ptr, base, perr)
48   #endif /* _LONGLONG */
49
50 _STD_BEGIN
51
52  #define _VIRTUAL    virtual
53
54 #pragma warning(push)
55 #pragma warning(disable:4275)
56         // TEMPLATE CLASS numpunct
57 template<class _Elem>
58     class numpunct
59         : public locale::facet
60     {    // facet for defining numeric punctuation text
61 public:
62     typedef basic_string<_Elem, char_traits<_Elem>, allocator<_Elem> >
63         string_type;
64     typedef _Elem char_type;
65
66     __PURE_APPDOMAIN_GLOBAL static locale::id id;    // unique facet id
67
68     _Elem __CLR_OR_THIS_CALL decimal_point() const
69         {    // return decimal point
70         return (do_decimal_point());
71         }
72
73     _Elem __CLR_OR_THIS_CALL thousands_sep() const
74         {    // return thousands separator
75         return (do_thousands_sep());
76         }
77
78     string __CLR_OR_THIS_CALL grouping() const
79         {    // return grouping string
80         return (do_grouping());
81         }
82
83     string_type __CLR_OR_THIS_CALL falsename() const
84         {    // return name for false
85         return (do_falsename());
86         }
87
88     string_type __CLR_OR_THIS_CALL truename() const
89         {    // return name for true
90         return (do_truename());
91         }
92
93     explicit __CLR_OR_THIS_CALL numpunct(size_t _Refs = 0)
94         : locale::facet(_Refs)
95         {    // construct from current locale
96         _BEGIN_LOCINFO(_Lobj)
97             _Init(_Lobj);
98             if (_Kseparator == 0)
99                 _Kseparator =    // NB: differs from "C" locale
100                     _MAKLOCCHR(_Elem, ',', _Lobj._Getcvt());
101         _END_LOCINFO()
102         }
103
104     __CLR_OR_THIS_CALL numpunct(const _Locinfo& _Lobj, size_t _Refs = 0, bool _Isdef = false)
105         : locale::facet(_Refs)
106         {    // construct from specified locale
107         _Init(_Lobj, _Isdef);
108         }
109
110     static size_t __CLRCALL_OR_CDECL _Getcat(const locale::facet **_Ppf = 0,
111         const locale *_Ploc = 0)
112         {    // return locale category mask and construct standard facet
113         if (_Ppf != 0 && *_Ppf == 0)
114             *_Ppf = _NEW_CRT numpunct<_Elem>(
115                 _Locinfo(_Ploc->name()), 0, true);
116         return (_X_NUMERIC);
117         }
118
119 _PROTECTED:
120     _VIRTUAL __CLR_OR_THIS_CALL ~numpunct()
121         {    // destroy the object
122         _Tidy();
123         }
124
125 protected:
126     __CLR_OR_THIS_CALL numpunct(const char *_Locname, size_t _Refs = 0, bool _Isdef = false)
127         : locale::facet(_Refs)
128         {    // construct from specified locale
129         _BEGIN_LOCINFO(_Lobj(_Locname))
130             _Init(_Lobj, _Isdef);
131         _END_LOCINFO()
132         }
133
134     void __CLR_OR_THIS_CALL _Init(const _Locinfo& _Lobj, bool _Isdef = false)
135         {    // initialize from _Lobj
136         const lconv *_Ptr = _Lobj._Getlconv();
137
138         _Grouping = 0;
139         _Falsename = 0;
140         _Truename = 0;
141
142         _TRY_BEGIN
143         _Grouping = _MAKLOCSTR(char, _Ptr->grouping, _Lobj._Getcvt());
144         _Falsename = _MAKLOCSTR(_Elem, _Lobj._Getfalse(), _Lobj._Getcvt());
145         _Truename = _MAKLOCSTR(_Elem, _Lobj._Gettrue(), _Lobj._Getcvt());
146         _CATCH_ALL
147         _Tidy();
148         _RERAISE;
149         _CATCH_END
150
151         _Dp = _MAKLOCCHR(_Elem, _Ptr->decimal_point[0], _Lobj._Getcvt());
152         _Kseparator =
153             _MAKLOCCHR(_Elem, _Ptr->thousands_sep[0], _Lobj._Getcvt());
154
155         if (_Isdef)
156             {    // apply defaults for required facets
157             _Grouping = _MAKLOCSTR(char, "", _Lobj._Getcvt());
158             _Dp = _MAKLOCCHR(_Elem, '.', _Lobj._Getcvt());
159             _Kseparator = _MAKLOCCHR(_Elem, ',', _Lobj._Getcvt());
160             }
161         }
162
163     _VIRTUAL _Elem __CLR_OR_THIS_CALL do_decimal_point() const
164         {    // return decimal point
165         return (_Dp);
166         }
167
168     _VIRTUAL _Elem __CLR_OR_THIS_CALL do_thousands_sep() const
169         {    // return thousands separator
170         return (_Kseparator);
171         }
172
173     _VIRTUAL string __CLR_OR_THIS_CALL do_grouping() const
174         {    // return grouping string
175         return (string(_Grouping));
176         }
177
178     _VIRTUAL string_type __CLR_OR_THIS_CALL do_falsename() const
179         {    // return name for false
180         return (string_type(_Falsename));
181         }
182
183     _VIRTUAL string_type __CLR_OR_THIS_CALL do_truename() const
184         {    // return name for true
185         return (string_type(_Truename));
186         }
187
188 private:
189     void __CLR_OR_THIS_CALL _Tidy()
190         {    // free all storage
191         _DELETE_CRT_VEC((void *)_Grouping);
192         _DELETE_CRT_VEC((void *)_Falsename);
193         _DELETE_CRT_VEC((void *)_Truename);
194         }
195
196     const char *_Grouping;    // grouping string, "" for "C" locale
197     _Elem _Dp;    // decimal point, '.' for "C" locale
198     _Elem _Kseparator;    // thousands separator, '\0' for "C" locale
199     const _Elem *_Falsename;    // name for false, "false" for "C" locale
200     const _Elem *_Truename;    // name for true, "true" for "C" locale
201     };
202
203         // TEMPLATE CLASS numpunct_byname
204 template<class _Elem>
205     class numpunct_byname
206         : public numpunct<_Elem>
207     {    // numpunct for named locale
208 public:
209     explicit __CLR_OR_THIS_CALL numpunct_byname(const char *_Locname, size_t _Refs = 0)
210         : numpunct<_Elem>(_Locname, _Refs)
211         {    // construct for named locale
212         }
213
214 _PROTECTED:
215     _VIRTUAL __CLR_OR_THIS_CALL ~numpunct_byname()
216         {    // destroy the object
217         }
218     };
219
220         // STATIC numpunct::id OBJECT
221 template<class _Elem>
222     __PURE_APPDOMAIN_GLOBAL locale::id numpunct<_Elem>::id;
223
224         // TEMPLATE CLASS num_get
225 template<class _Elem,
226     class _InIt = istreambuf_iterator<_Elem, char_traits<_Elem> > >
227     class num_get
228         : public locale::facet
229     {    // facet for converting text to encoded numbers
230 public:
231     typedef numpunct<_Elem> _Mypunct;
232     typedef basic_string<_Elem, char_traits<_Elem>, allocator<_Elem> >
233         _Mystr;
234
235     static size_t __CLRCALL_OR_CDECL _Getcat(const locale::facet **_Ppf = 0,
236         const locale *_Ploc = 0)
237         {    // return locale category mask and construct standard facet
238         if (_Ppf != 0 && *_Ppf == 0)
239             *_Ppf = _NEW_CRT num_get<_Elem, _InIt>(
240                 _Locinfo(_Ploc->name()));
241         return (_X_NUMERIC);
242         }
243
244     __PURE_APPDOMAIN_GLOBAL static locale::id id;    // unique facet id
245
246 _PROTECTED:
247     _VIRTUAL __CLR_OR_THIS_CALL ~num_get()
248         {    // destroy the object
249         }
250
251 protected:
252     void _Init(const _Locinfo& _Lobj)
253         {    // initialize from _Locinfo object
254         _Cvt = _Lobj._Getcvt();
255         }
256
257     _Locinfo::_Cvtvec _Cvt;        // conversion information
258
259 public:
260     explicit __CLR_OR_THIS_CALL num_get(size_t _Refs = 0)
261         : locale::facet(_Refs)
262         {    // construct from current locale
263         _BEGIN_LOCINFO(_Lobj)
264             _Init(_Lobj);
265         _END_LOCINFO()
266         }
267
268     __CLR_OR_THIS_CALL num_get(const _Locinfo& _Lobj, size_t _Refs = 0)
269         : locale::facet(_Refs)
270         {    // construct from specified locale
271         _Init(_Lobj);
272         }
273
274     typedef _Elem char_type;
275     typedef _InIt iter_type;
276
277     _InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
278         ios_base& _Iosbase,    ios_base::iostate& _State,
279             _Bool& _Val) const
280         {    // get bool from [_First, _Last) into _Val
281         return (do_get(_First, _Last, _Iosbase, _State, _Val));
282         }
283
284     _InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
285         ios_base& _Iosbase,    ios_base::iostate& _State,
286             unsigned short& _Val) const
287         {    // get unsigned short from [_First, _Last) into _Val
288         return (do_get(_First, _Last, _Iosbase, _State, _Val));
289         }
290
291     _InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
292         ios_base& _Iosbase,    ios_base::iostate& _State,
293             unsigned int& _Val) const
294         {    // get unsigned int from [_First, _Last) into _Val
295         return (do_get(_First, _Last, _Iosbase, _State, _Val));
296         }
297
298     _InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
299         ios_base& _Iosbase, ios_base::iostate& _State,
300             long& _Val) const
301         {    // get long from [_First, _Last) into _Val
302         return (do_get(_First, _Last, _Iosbase, _State, _Val));
303         }
304
305     _InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
306         ios_base& _Iosbase, ios_base::iostate& _State,
307             unsigned long& _Val) const
308         {    // get unsigned long from [_First, _Last) into _Val
309         return (do_get(_First, _Last, _Iosbase, _State, _Val));
310         }
311
312  #ifdef _LONGLONG
313     _InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
314         ios_base& _Iosbase, ios_base::iostate& _State,
315             _LONGLONG& _Val) const
316         {    // get long long from [_First, _Last) into _Val
317         return (do_get(_First, _Last, _Iosbase, _State, _Val));
318         }
319
320     _InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
321         ios_base& _Iosbase, ios_base::iostate& _State,
322             _ULONGLONG& _Val) const
323         {    // get unsigned long long from [_First, _Last) into _Val
324         return (do_get(_First, _Last, _Iosbase, _State, _Val));
325         }
326  #endif /* _LONGLONG */
327
328     _InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
329         ios_base& _Iosbase, ios_base::iostate& _State,
330             float& _Val) const
331         {    // get float from [_First, _Last) into _Val
332         return (do_get(_First, _Last, _Iosbase, _State, _Val));
333         }
334
335     _InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
336         ios_base& _Iosbase, ios_base::iostate& _State,
337             double& _Val) const
338         {    // get double from [_First, _Last) into _Val
339         return (do_get(_First, _Last, _Iosbase, _State, _Val));
340         }
341
342     _InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
343         ios_base& _Iosbase, ios_base::iostate& _State,
344             long double& _Val) const
345         {    // get long double from [_First, _Last) into _Val
346         return (do_get(_First, _Last, _Iosbase, _State, _Val));
347         }
348
349     _InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
350         ios_base& _Iosbase, ios_base::iostate& _State,
351             void *& _Val) const
352         {    // get void pointer from [_First, _Last) into _Val
353         return (do_get(_First, _Last, _Iosbase, _State, _Val));
354         }
355
356 protected:
357     _VIRTUAL _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
358         ios_base& _Iosbase, ios_base::iostate& _State,
359             _Bool& _Val) const
360         {    // get bool from [_First, _Last) into _Val
361         _DEBUG_RANGE(_First, _Last);
362         int _Ans = -1;    // negative answer indicates failure
363
364         if (_Iosbase.flags() & ios_base::boolalpha)
365             {    // get false name or true name
366             typedef typename _Mystr::size_type _Mystrsize;
367             const _Mypunct& _Punct_fac = _USE(_Iosbase.getloc(), _Mypunct);
368             _Mystr _Str((_Mystrsize)1, (char_type)0);
369             _Str += _Punct_fac.falsename();
370             _Str += (char_type)0;
371             _Str += _Punct_fac.truename();    // construct "\0false\0true"
372             _Ans = _Getloctxt(_First, _Last, (size_t)2, _Str.c_str());
373             }
374         else
375             {    // get zero or nonzero integer
376             char _Ac[_MAX_INT_DIG], *_Ep;
377             int _Errno = 0;
378             const unsigned long _Ulo = ::_Stoulx(_Ac, &_Ep,
379                 _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
380                     _Iosbase.getloc()), &_Errno);
381             if (_Ep != _Ac && _Errno == 0 && _Ulo <= 1)
382                 _Ans = _Ulo;
383             }
384
385         if (_First == _Last)
386             _State |= ios_base::eofbit;
387         if (_Ans < 0)
388             _State |= ios_base::failbit;
389         else
390             _Val = _Ans != 0;    // deliver value
391         return (_First);
392         }
393
394     _VIRTUAL _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
395         ios_base& _Iosbase, ios_base::iostate& _State,
396             unsigned short& _Val) const
397         {    // get unsigned short from [_First, _Last) into _Val
398         _DEBUG_RANGE(_First, _Last);
399         char _Ac[_MAX_INT_DIG], *_Ep;
400         int _Errno = 0;
401         int _Base = _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
402             _Iosbase.getloc());    // gather field into _Ac
403         char *_Ptr = _Ac[0] == '-' ? _Ac + 1 : _Ac;    // point past any sign
404         const unsigned long _Ans =
405             ::_Stoulx(_Ptr, &_Ep, _Base, &_Errno);    // convert
406
407         if (_First == _Last)
408             _State |= ios_base::eofbit;
409         if (_Ep == _Ptr || _Errno != 0 || USHRT_MAX < _Ans)
410             _State |= ios_base::failbit;
411         else
412             _Val = (unsigned short)(_Ac[0] == '-'
413                 ? 0 -_Ans : _Ans);    // deliver value
414         return (_First);
415         }
416
417     _VIRTUAL _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
418         ios_base& _Iosbase, ios_base::iostate& _State,
419             unsigned int& _Val) const
420         {    // get unsigned int from [_First, _Last) into _Val
421         _DEBUG_RANGE(_First, _Last);
422         char _Ac[_MAX_INT_DIG], *_Ep;
423         int _Errno = 0;
424         int _Base = _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
425             _Iosbase.getloc());    // gather field into _Ac
426         char *_Ptr = _Ac[0] == '-' ? _Ac + 1 : _Ac;    // point past any sign
427         const unsigned long _Ans =
428             ::_Stoulx(_Ptr, &_Ep, _Base, &_Errno);    // convert
429
430         if (_First == _Last)
431             _State |= ios_base::eofbit;
432         if (_Ep == _Ptr || _Errno != 0 || UINT_MAX < _Ans)
433             _State |= ios_base::failbit;
434         else
435             _Val = _Ac[0] == '-' ? 0 -_Ans : _Ans;    // deliver value
436         return (_First);
437         }
438
439     _VIRTUAL _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
440         ios_base& _Iosbase, ios_base::iostate& _State,
441             long& _Val) const
442         {    // get long from [_First, _Last) into _Val
443         _DEBUG_RANGE(_First, _Last);
444         char _Ac[_MAX_INT_DIG], *_Ep;
445         int _Errno = 0;
446         const long _Ans = ::_Stolx(_Ac, &_Ep,
447             _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
448                 _Iosbase.getloc()), &_Errno);    // gather field, convert
449
450         if (_First == _Last)
451             _State |= ios_base::eofbit;
452         if (_Ep == _Ac || _Errno != 0)
453             _State |= ios_base::failbit;
454         else
455             _Val = _Ans;    // deliver value
456         return (_First);
457         }
458
459     _VIRTUAL _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
460         ios_base& _Iosbase, ios_base::iostate& _State,
461             unsigned long& _Val) const
462         {    // get unsigned long from [_First, _Last) into _Val
463         _DEBUG_RANGE(_First, _Last);
464         char _Ac[_MAX_INT_DIG], *_Ep;
465         int _Errno = 0;
466         const unsigned long _Ans = ::_Stoulx(_Ac, &_Ep,
467             _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
468                 _Iosbase.getloc()), &_Errno);    // gather field, convert
469
470         if (_First == _Last)
471             _State |= ios_base::eofbit;
472         if (_Ep == _Ac || _Errno != 0)
473             _State |= ios_base::failbit;
474         else
475             _Val = _Ans;    // deliver value
476         return (_First);
477         }
478
479  #ifdef _LONGLONG
480     _VIRTUAL _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
481         ios_base& _Iosbase, ios_base::iostate& _State,
482             _LONGLONG& _Val) const
483         {    // get long long from [_First, _Last) into _Val
484         _DEBUG_RANGE(_First, _Last);
485         char _Ac[_MAX_INT_DIG], *_Ep;
486         int _Errno = 0;
487         const _LONGLONG _Ans = ::_STOLL(_Ac, &_Ep,
488             _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
489                 _Iosbase.getloc()), &_Errno);    // gather field, convert
490
491         if (_First == _Last)
492             _State |= ios_base::eofbit;
493         if (_Ep == _Ac || _Errno != 0)
494             _State |= ios_base::failbit;
495         else
496             _Val = _Ans;    // deliver value
497         return (_First);
498         }
499
500     _VIRTUAL _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
501         ios_base& _Iosbase, ios_base::iostate& _State,
502             _ULONGLONG& _Val) const
503         {    // get unsigned long long from [_First, _Last) into _Val
504         _DEBUG_RANGE(_First, _Last);
505         char _Ac[_MAX_INT_DIG], *_Ep;
506         int _Errno = 0;
507         const _ULONGLONG _Ans = ::_STOULL(_Ac, &_Ep,
508             _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
509                 _Iosbase.getloc()), &_Errno);    // gather field, convert
510
511         if (_First == _Last)
512             _State |= ios_base::eofbit;
513         if (_Ep == _Ac || _Errno != 0)
514             _State |= ios_base::failbit;
515         else
516             _Val = _Ans;    // deliver value
517         return (_First);
518         }
519  #endif /* _LONGLONG */
520
521     _VIRTUAL _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
522         ios_base& _Iosbase, ios_base::iostate& _State,
523             float& _Val) const
524         {    // get float from [_First, _Last) into _Val
525         _DEBUG_RANGE(_First, _Last);
526         char _Ac[_MAX_EXP_DIG + _MAX_SIG_DIG + 16], *_Ep;
527         int _Errno = 0;
528         const float _Ans = ::_Stofx(_Ac, &_Ep,
529             _Getffld(_Ac, _First, _Last,
530                 _Iosbase.getloc()), &_Errno);    // gather field, convert
531
532         if (_First == _Last)
533             _State |= ios_base::eofbit;
534         if (_Ep == _Ac || _Errno != 0)
535             _State |= ios_base::failbit;
536         else
537             _Val = _Ans;    // deliver value
538         return (_First);
539         }
540
541     _VIRTUAL _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
542         ios_base& _Iosbase, ios_base::iostate& _State,
543             double& _Val) const
544         {    // get double from [_First, _Last) into _Val
545         _DEBUG_RANGE(_First, _Last);
546         char _Ac[_MAX_EXP_DIG + _MAX_SIG_DIG + 16], *_Ep;
547         int _Errno = 0;
548         const double _Ans = ::_Stodx(_Ac, &_Ep,
549             _Getffld(_Ac, _First, _Last,
550                 _Iosbase.getloc()), &_Errno);    // gather field, convert
551
552         if (_First == _Last)
553             _State |= ios_base::eofbit;
554         if (_Ep == _Ac || _Errno != 0)
555             _State |= ios_base::failbit;
556         else
557             _Val = _Ans;    // deliver value
558         return (_First);
559         }
560
561     _VIRTUAL _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
562         ios_base& _Iosbase, ios_base::iostate& _State,
563             long double& _Val) const
564         {    // get long double from [_First, _Last) into _Val
565         _DEBUG_RANGE(_First, _Last);
566         char _Ac[_MAX_EXP_DIG + _MAX_SIG_DIG + 16], *_Ep;
567         int _Errno = 0;
568         const long double _Ans = ::_Stoldx(_Ac, &_Ep,
569             _Getffld(_Ac, _First, _Last,
570                 _Iosbase.getloc()), &_Errno);    // gather field, convert
571
572         if (_First == _Last)
573             _State |= ios_base::eofbit;
574         if (_Ep == _Ac || _Errno != 0)
575             _State |= ios_base::failbit;
576         else
577             _Val = _Ans;    // deliver value
578         return (_First);
579         }
580
581     _VIRTUAL _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
582         ios_base& _Iosbase, ios_base::iostate& _State,
583             void *& _Val) const
584         {    // get void pointer from [_First, _Last) into _Val
585         _DEBUG_RANGE(_First, _Last);
586         char _Ac[_MAX_INT_DIG], *_Ep;
587         int _Errno = 0;
588
589  #ifdef _LONGLONG
590         int _Base = _Getifld(_Ac, _First, _Last, ios_base::hex,
591             _Iosbase.getloc());    // gather field
592         const _ULONGLONG _Ans =
593             (sizeof (void *) == sizeof (unsigned long))
594                 ? (_ULONGLONG)::_Stoulx(_Ac, &_Ep, _Base, &_Errno)
595                 : ::_STOULL(_Ac, &_Ep, _Base, &_Errno);
596
597  #else /* _LONGLONG */
598         const unsigned long _Ans = ::_Stoulx(_Ac, &_Ep,
599             _Getifld(_Ac, _First, _Last, ios_base::hex,
600                 _Iosbase.getloc()), &_Errno);    // gather field, convert
601  #endif /* _LONGLONG */
602
603         if (_First == _Last)
604             _State |= ios_base::eofbit;
605         if (_Ep == _Ac || _Errno != 0)
606             _State |= ios_base::failbit;
607         else
608             _Val = (void *)((char *)0 + _Ans);    // deliver value
609         return (_First);
610         }
611
612 private:
613     int __CLRCALL_OR_CDECL _Getifld(_Pre_notnull_ _Post_z_ char *_Ac,
614         _InIt& _First, _InIt& _Last, ios_base::fmtflags _Basefield,
615             const locale& _Loc) const
616         {    // get integer field from [_First, _Last) into _Ac
617         const _Mypunct& _Punct_fac = _USE(_Loc, _Mypunct);
618         const string _Grouping = _Punct_fac.grouping();
619         const _Elem _Kseparator = _Grouping.size() == 0
620             ? (_Elem)0 : _Punct_fac.thousands_sep();
621         const _Elem _E0 = _MAKLOCCHR(_Elem, '0', _Cvt);
622         char *_Ptr = _Ac;
623
624         if (_First == _Last)
625             ;    // empty field
626         else if (*_First == _MAKLOCCHR(_Elem, '+', _Cvt))
627             *_Ptr++ = '+', ++_First;    // gather plus sign
628         else if (*_First == _MAKLOCCHR(_Elem, '-', _Cvt))
629             *_Ptr++ = '-', ++_First;    // gather minus sign
630
631         _Basefield &= ios_base::basefield;
632         int _Base = _Basefield == ios_base::oct ? 8
633             : _Basefield == ios_base::hex ? 16
634             : _Basefield == ios_base::_Fmtzero ? 0 : 10;
635
636         bool _Seendigit = false;    // seen a digit in input
637         bool _Nonzero = false;    // seen a nonzero digit in input
638
639         if (_First != _Last && *_First == _E0)
Lines 640 ... 1038 are skipped.
1039 _PROTECTED:
1040     _VIRTUAL __CLR_OR_THIS_CALL ~num_put()
1041         {    // destroy the object
1042         }
1043
1044 protected:
1045     void __CLR_OR_THIS_CALL _Init(const _Locinfo& _Lobj)
1046         {    // initialize from _Locinfo object
1047         _Cvt = _Lobj._Getcvt();
1048         }
1049
1050     _Locinfo::_Cvtvec _Cvt;        // conversion information
1051
1052 public:
1053     explicit __CLR_OR_THIS_CALL num_put(size_t _Refs = 0)
1054         : locale::facet(_Refs)
1055         {    // construct from current locale
1056         _BEGIN_LOCINFO(_Lobj)
1057             _Init(_Lobj);
1058         _END_LOCINFO()
1059         }
1060
1061     __CLR_OR_THIS_CALL num_put(const _Locinfo& _Lobj, size_t _Refs = 0)
1062         : locale::facet(_Refs)
1063         {    // construct from specified locale
1064         _Init(_Lobj);
1065         }
1066
1067     typedef _Elem char_type;
1068     typedef _OutIt iter_type;
1069
1070     _OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
1071         ios_base& _Iosbase, _Elem _Fill, _Bool _Val) const
1072         {    // put formatted bool to _Dest
1073         return (do_put(_Dest, _Iosbase, _Fill, _Val));
1074         }
1075
1076     _OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
1077         ios_base& _Iosbase, _Elem _Fill, long _Val) const
1078         {    // put formatted long to _Dest
1079         return (do_put(_Dest, _Iosbase, _Fill, _Val));
1080         }
1081
1082     _OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
1083         ios_base& _Iosbase, _Elem _Fill, unsigned long _Val) const
1084         {    // put formatted unsigned long to _Dest
1085         return (do_put(_Dest, _Iosbase, _Fill, _Val));
1086         }
1087
1088  #ifdef _LONGLONG
1089     _OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
1090         ios_base& _Iosbase, _Elem _Fill, _LONGLONG _Val) const
1091         {    // put formatted long long to _Dest
1092         return (do_put(_Dest, _Iosbase, _Fill, _Val));
1093         }
1094
1095     _OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
1096         ios_base& _Iosbase, _Elem _Fill, _ULONGLONG _Val) const
1097         {    // put formatted unsigned long long to _Dest
1098         return (do_put(_Dest, _Iosbase, _Fill, _Val));
1099         }
1100  #endif /* _LONGLONG */
1101
1102     _OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
1103         ios_base& _Iosbase, _Elem _Fill, double _Val) const
1104         {    // put formatted double to _Dest
1105         return (do_put(_Dest, _Iosbase, _Fill, _Val));
1106         }
1107
1108     _OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
1109         ios_base& _Iosbase, _Elem _Fill, long double _Val) const
1110         {    // put formatted long double to _Dest
1111         return (do_put(_Dest, _Iosbase, _Fill, _Val));
1112         }
1113
1114     _OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
1115         ios_base& _Iosbase, _Elem _Fill, const void *_Val) const
1116         {    // put formatted void pointer to _Dest
1117         return (do_put(_Dest, _Iosbase, _Fill, _Val));
1118         }
1119
1120 protected:
1121     _VIRTUAL _OutIt __CLR_OR_THIS_CALL do_put(_OutIt _Dest,
1122         ios_base& _Iosbase, _Elem _Fill, _Bool _Val) const
1123         {    // put formatted bool to _Dest
1124         _DEBUG_POINTER(_Dest);
1125         if (!(_Iosbase.flags() & ios_base::boolalpha))
1126             return (do_put(_Dest, _Iosbase, _Fill, (long)_Val));
1127         else
1128             {    // put "false" or "true"
1129             const _Mypunct& _Punct_fac = _USE(_Iosbase.getloc(), _Mypunct);
1130             _Mystr _Str;
1131             if (_Val)
1132                 _Str.assign(_Punct_fac.truename());
1133             else
1134                 _Str.assign(_Punct_fac.falsename());
1135
1136             size_t _Fillcount = _Iosbase.width() <= 0
1137                 || (size_t)_Iosbase.width() <= _Str.size()
1138                     ? 0 : (size_t)_Iosbase.width() - _Str.size();
1139
1140             if ((_Iosbase.flags() & ios_base::adjustfield) != ios_base::left)
1141                 {    // put leading fill
1142                 _Dest = _Rep(_Dest, _Fill, _Fillcount);
1143                 _Fillcount = 0;
1144                 }
1145             _Dest = _Put(_Dest, _Str.c_str(), _Str.size());    // put field
1146             _Iosbase.width(0);
1147             return (_Rep(_Dest, _Fill, _Fillcount));    // put trailing fill
1148             }
1149         }
1150
1151     _VIRTUAL _OutIt __CLR_OR_THIS_CALL do_put(_OutIt _Dest,
1152         ios_base& _Iosbase, _Elem _Fill, long _Val) const
1153         {    // put formatted long to _Dest
1154         const size_t _Buf_size = 2 * _MAX_INT_DIG;
1155         char _Buf[_Buf_size], _Fmt[6];
1156         return (_Iput(_Dest, _Iosbase, _Fill, _Buf,
1157             ::sprintf_s(_Buf, _Buf_size, _Ifmt(_Fmt, "ld",
1158                 _Iosbase.flags()), _Val)));
1159         }
1160
1161     _VIRTUAL _OutIt __CLR_OR_THIS_CALL do_put(_OutIt _Dest,
1162         ios_base& _Iosbase, _Elem _Fill, unsigned long _Val) const
1163         {    // put formatted unsigned long to _Dest
1164         const size_t _Buf_size = 2 * _MAX_INT_DIG;
1165         char _Buf[_Buf_size], _Fmt[6];
1166         return (_Iput(_Dest, _Iosbase, _Fill, _Buf,
1167             ::sprintf_s(_Buf, _Buf_size, _Ifmt(_Fmt, "lu",
1168                 _Iosbase.flags()), _Val)));
1169         }
1170
1171  #ifdef _LONGLONG
1172     _VIRTUAL _OutIt __CLR_OR_THIS_CALL do_put(_OutIt _Dest,
1173         ios_base& _Iosbase, _Elem _Fill, _LONGLONG _Val) const
1174         {    // put formatted long long to _Dest
1175         const size_t _Buf_size = 2 * _MAX_INT_DIG;
1176         char _Buf[_Buf_size], _Fmt[8];
1177         return (_Iput(_Dest, _Iosbase, _Fill, _Buf,
1178             ::sprintf_s(_Buf, _Buf_size, _Ifmt(_Fmt, "Ld",
1179                 _Iosbase.flags()), _Val)));
1180         }
1181
1182     _VIRTUAL _OutIt __CLR_OR_THIS_CALL do_put(_OutIt _Dest,
1183         ios_base& _Iosbase, _Elem _Fill, _ULONGLONG _Val) const
1184         {    // put formatted unsigned long long to _Dest
1185         const size_t _Buf_size = 2 * _MAX_INT_DIG;
1186         char _Buf[_Buf_size], _Fmt[8];
1187         return (_Iput(_Dest, _Iosbase, _Fill, _Buf,
1188             ::sprintf_s(_Buf, _Buf_size, _Ifmt(_Fmt, "Lu",
1189                 _Iosbase.flags()), _Val)));
1190         }
1191  #endif /* _LONGLONG */
1192
1193     _VIRTUAL _OutIt __CLR_OR_THIS_CALL do_put(_OutIt _Dest,
1194         ios_base& _Iosbase, _Elem _Fill, double _Val) const
1195         {    // put formatted double to _Dest
1196         const size_t _Buf_size = _MAX_EXP_DIG + _MAX_SIG_DIG + 64;
1197         char _Buf[_Buf_size], _Fmt[8];
1198         streamsize _Precision = _Iosbase.precision() <= 0
1199             && !(_Iosbase.flags() & ios_base::fixed)
1200                 ? 6 : _Iosbase.precision();    // desired precision
1201         int _Significance = _MAX_SIG_DIG < _Precision
1202             ? _MAX_SIG_DIG : (int)_Precision;    // actual sprintf precision
1203         _Precision -= _Significance;
1204         size_t _Beforepoint = 0;    // zeros to add before decimal point
1205         size_t _Afterpoint = 0;    // zeros to add after decimal point
1206
1207         if ((_Iosbase.flags() & ios_base::floatfield) == ios_base::fixed
1208             && _Val * 0.5 != _Val)    // skip -Inf, 0, Inf
1209             {    // scale silly fixed-point value
1210             bool _Signed = _Val < 0;
1211             if (_Signed)
1212                 _Val = -_Val;
1213
1214             for (; 1e35 <= _Val && _Beforepoint < 5000; _Beforepoint += 10)
1215                 _Val /= 1e10;    // drop 10 zeros before decimal point
1216
1217             if (0 < _Val)
1218                 for (; 10 <= _Precision && _Val <= 1e-35
1219                     && _Afterpoint < 5000; _Afterpoint += 10)
1220                     {    // drop 10 zeros after decimal point
1221                     _Val *= 1e10;
Lines 1222 ... 1506 are skipped.
1507     _OutIt __CLRCALL_OR_CDECL _Put(_OutIt _Dest,
1508         const _Elem *_Ptr, size_t _Count) const
1509         {    // put [_Ptr, _Ptr + _Count) to _Dest
1510         for (; 0 < _Count; --_Count, ++_Dest, ++_Ptr)
1511             *_Dest = *_Ptr;
1512         return (_Dest);
1513         }
1514
1515     _OutIt __CLRCALL_OR_CDECL _Putc(_OutIt _Dest,
1516         const char *_Ptr, size_t _Count) const
1517         {    // put char sequence [_Ptr, _Ptr + _Count) to _Dest
1518         for (; 0 < _Count; --_Count, ++_Dest, ++_Ptr)
1519             *_Dest = _MAKLOCCHR(_Elem, *_Ptr, _Cvt);
1520         return (_Dest);
1521         }
1522
1523     _OutIt __CLRCALL_OR_CDECL _Putgrouped(_OutIt _Dest,
1524         const char *_Ptr, size_t _Count, _Elem _Kseparator) const
1525         {    // put char sequence [_Ptr, _Ptr + _Count) to _Dest with commas
1526         for (; ; ++_Ptr, --_Count)
1527             {    // put field with thousands separators for NULs
1528             const char *_Pend =
1529                 (const char *)::memchr(_Ptr, '\0', _Count);
1530             size_t _Groupsize = _Pend != 0 ? _Pend - _Ptr : _Count;
1531
1532             _Dest = _Putc(_Dest, _Ptr, _Groupsize);
1533             _Ptr += _Groupsize, _Count -= _Groupsize;
1534             if (_Count == 0)
1535                 break;
1536             if (_Kseparator != (_Elem)0)
1537                 _Dest = _Rep(_Dest, _Kseparator, 1);
1538             }
1539         return (_Dest);
1540         }
1541
1542     _OutIt __CLRCALL_OR_CDECL _Rep(_OutIt _Dest,
1543         _Elem _Ch, size_t _Count) const
1544         {    // put _Count * _Ch to _Dest
1545         for (; 0 < _Count; --_Count, ++_Dest)
1546             *_Dest = _Ch;
1547         return (_Dest);
1548         }
1549     };
1550
1551         // STATIC num_put::id OBJECT
1552 template<class _Elem,
1553     class _OutIt>
1554     __PURE_APPDOMAIN_GLOBAL locale::id num_put<_Elem, _OutIt>::id;
1555
1556  #if defined(_DLL_CPPLIB) && !defined(_M_CEE_PURE)
1557
1558 template class _CRTIMP2_PURE numpunct<char>;
1559 template class _CRTIMP2_PURE num_get<char,
1560     istreambuf_iterator<char, char_traits<char> > >;
1561 template class _CRTIMP2_PURE num_put<char,
1562     ostreambuf_iterator<char, char_traits<char> > >;
1563
1564 template class _CRTIMP2_PURE numpunct<wchar_t>;
1565 template class _CRTIMP2_PURE num_get<wchar_t,
1566     istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
1567 template class _CRTIMP2_PURE num_put<wchar_t,
1568     ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
1569
1570
1571
1572  #endif /* _DLL_CPPLIB */
1573
1574 #pragma warning(pop)
1575 _STD_END
1576
1577 #ifdef _MSC_VER
1578  #pragma warning(pop)
1579  #pragma pack(pop)
1580 #endif  /* _MSC_VER */
1581
1582 #endif /* RC_INVOKED */
1583 #endif /* _XLOCNUM_ */
1584
1585 /*
1586  * Copyright (c) 1992-2008 by P.J. Plauger.  ALL RIGHTS RESERVED.
1587  * Consult your license regarding permissions and restrictions.
1588  V5.05:0009 */
1589
1590
1591