📄 xloctime
字号:
#if _HAS_CPP0X
virtual _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State, tm *_Pt,
char _Specifier, char = 0) const
{ // get formatted time for _Specifier (_Modifier ignored)
int _Ans = 0;
switch (_Specifier)
{ // process format specifier
case 'a':
case 'A':
_First = get_weekday(_First, _Last, _Iosbase, _State, _Pt);
break;
case 'b':
case 'B':
case 'h':
_First = get_monthname(_First, _Last, _Iosbase, _State, _Pt);
break;
case 'c':
_First = _Getfmt(_First, _Last, _Iosbase, _State, _Pt,
"%b %d %H : %M : %S %Y");
break;
case 'C':
_State |= _Getint(_First, _Last, 0, 99, _Ans);
if (!(_State & ios_base::failbit))
_Pt->tm_year = _Ans * 100 - 1900; // convert to century
break;
case 'd':
case 'e':
_State |= _Getint(_First, _Last, 1, 31, _Pt->tm_mday);
break;
case 'D':
_First = _Getfmt(_First, _Last, _Iosbase, _State, _Pt,
"%m / %d / %y");
break;
case 'H':
_State |= _Getint(_First, _Last, 0, 23, _Pt->tm_hour);
break;
case 'I':
_State |= _Getint(_First, _Last, 0, 11, _Pt->tm_hour);
break;
case 'j':
_State |= _Getint(_First, _Last, 1, 366, _Pt->tm_yday);
break;
case 'm':
_State |= _Getint(_First, _Last, 1, 12, _Ans);
if (!(_State & ios_base::failbit))
_Pt->tm_mon = _Ans - 1;
break;
case 'M':
_State |= _Getint(_First, _Last, 0, 59, _Pt->tm_min);
break;
case 'n':
case 't':
_First = _Getfmt(_First, _Last, _Iosbase, _State, _Pt,
" ");
break;
case 'p':
_Ans = _Getloctxt(_First, _Last, (size_t)0, ":AM:am:PM:pm");
if (_Ans < 0)
_State |= ios_base::failbit;
else
_Pt->tm_hour += _Ans * 12;
break;
case 'r':
_First = _Getfmt(_First, _Last, _Iosbase, _State, _Pt,
"%I : %M : %S %p");
break;
case 'R':
_First = _Getfmt(_First, _Last, _Iosbase, _State, _Pt,
"%H : %M");
break;
case 'S':
_State |= _Getint(_First, _Last, 0, 59, _Pt->tm_sec);
break;
case 'T':
case 'X':
_First = _Getfmt(_First, _Last, _Iosbase, _State, _Pt,
"%H : %M : S");
break;
case 'U':
_State |= _Getint(_First, _Last, 0, 53, _Pt->tm_yday);
break;
case 'w':
_State |= _Getint(_First, _Last, 0, 6, _Pt->tm_wday);
break;
case 'W':
_State |= _Getint(_First, _Last, 0, 53, _Pt->tm_yday);
break;
case 'x':
_First = _Getfmt(_First, _Last, _Iosbase, _State, _Pt,
"%d / %m / %y");
break;
case 'y':
_State |= _Getint(_First, _Last, 0, 99, _Ans);
if (!(_State & ios_base::failbit))
_Pt->tm_year = _Ans < 69 ? _Ans + 100 : _Ans;
break;
case 'Y':
_First = get_year(_First, _Last, _Iosbase, _State, _Pt);
break;
default:
_State |= ios_base::failbit; // unknown specifier
}
if (_First == _Last)
_State |= ios_base::eofbit;
return (_First);
}
_InIt __CLR_OR_THIS_CALL _Getfmt(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State, tm *_Pt,
const char *_Fmtfirst) const
{ // get formatted time for format NTBS
typedef ctype<_Elem> _Ctype;
const _Ctype& _Ctype_fac = _USE(_Iosbase.getloc(), _Ctype);
for (; *_Fmtfirst != '\0'; ++_Fmtfirst)
if (*_Fmtfirst == '%')
_First = do_get(_First, _Last, _Iosbase, _State, _Pt,
*++_Fmtfirst); // convert a single field
else if (*_Fmtfirst == ' ')
for (; _First != _Last
&& _Ctype_fac.is(_Ctype::space, *_First); ++_First)
;
else if (*_First != _MAKLOCCHR(_Elem, *_Fmtfirst, _Cvt))
{ // bad literal match
_State |= ios_base::failbit;
break;
}
else
++_First;
if (_First == _Last)
_State |= ios_base::eofbit;
return (_First);
}
#endif /* _HAS_CPP0X */
private:
ios_base::iostate __CLRCALL_OR_CDECL _Getint(
_InIt& _First, _InIt& _Last,
int _Lo, int _Hi, int& _Val) const
{ // get integer in range [_Lo, _Hi] from [_First, _Last)
const _Elem _E0 = _MAKLOCCHR(_Elem, '0', _Cvt);
char _Ac[_MAX_INT_DIG], *_Ep;
char *_Ptr = _Ac;
if (_First == _Last)
;
else if (*_First == _MAKLOCCHR(_Elem, '+', _Cvt))
*_Ptr++ = '+', ++_First; // copy plus sign
else if (*_First == _MAKLOCCHR(_Elem, '-', _Cvt))
*_Ptr++ = '-', ++_First; // copy minus sign
bool _Seendigit = false;
while (_First != _Last && *_First == _E0)
_Seendigit = true, ++_First; // strip leading zeros
if (_Seendigit)
*_Ptr++ = '0'; // replace one or more with single zero
for (char *const _Pe = &_Ac[_MAX_INT_DIG - 1]; _First != _Last
&& _E0 <= *_First && *_First <= _E0 + 9;
_Seendigit = true, ++_First)
{ // copy digits
*_Ptr = (char)((*_First - _E0) + '0');
if (_Ptr < _Pe)
++_Ptr; // drop trailing digits if already too large
}
if (!_Seendigit)
_Ptr = _Ac;
*_Ptr = '\0';
int _Errno = 0;
const long _Ans = _CSTD _Stolx(_Ac, &_Ep, 10, &_Errno);
ios_base::iostate _State = ios_base::goodbit;
if (_First == _Last)
_State |= ios_base::eofbit;
if (_Ep == _Ac || _Errno != 0 || _Ans < _Lo || _Hi < _Ans)
_State |= ios_base::failbit; // bad conversion
else
_Val = _Ans; // store valid result
return (_State);
}
void __CLR_OR_THIS_CALL _Tidy()
{ // free all storage
_DELETE_CRT_VEC((void *)_Days);
_DELETE_CRT_VEC((void *)_Months);
}
const _Elem *_Days; // ":Sun:Sunday:Mon:Monday..." for example
const _Elem *_Months; // "Jan:January:Feb:February..." for example
dateorder _Dateorder;
_Locinfo::_Cvtvec _Cvt; // conversion information
};
// STATIC time_get::id OBJECT
template<class _Elem,
class _InIt>
__PURE_APPDOMAIN_GLOBAL locale::id time_get<_Elem, _InIt>::id;
// TEMPLATE CLASS time_get_byname
template<class _Elem,
class _InIt = istreambuf_iterator<_Elem, char_traits<_Elem> > >
class time_get_byname
: public time_get<_Elem, _InIt>
{ // time_get for named locale
public:
explicit time_get_byname(const char *_Locname, size_t _Refs = 0)
: time_get<_Elem, _InIt>(_Locname, _Refs)
{ // construct for named locale
}
#if _HAS_CPP0X
explicit time_get_byname(const string& _Str, size_t _Refs = 0)
: time_get<_Elem, _InIt>(_Locinfo(_Str.c_str()), _Refs)
{ // construct for named locale
}
#endif /* _HAS_CPP0X */
protected:
virtual __CLR_OR_THIS_CALL ~time_get_byname()
{ // destroy the object
}
};
// TEMPLATE CLASS time_put
template<class _Elem,
class _OutIt = ostreambuf_iterator<_Elem, char_traits<_Elem> > >
class time_put
: public locale::facet
{ // facet for converting encoded times to text
public:
typedef _Elem char_type;
typedef _OutIt iter_type;
_OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, const tm *_Pt,
const _Elem *_Fmtfirst, const _Elem *_Fmtlast) const
{ // put formatted time from _Pt to _Dest for [_Fmtfirst, _Fmtlast)
_DEBUG_POINTER(_Dest);
_DEBUG_POINTER(_Pt);
const _Elem _Percent = _MAKLOCCHR(_Elem, '%', _Cvt);
for (; _Fmtfirst != _Fmtlast; ++_Fmtfirst)
if (*_Fmtfirst != _Percent)
*_Dest++ = *_Fmtfirst; // copy literal element
else if (++_Fmtfirst == _Fmtlast)
{ // treat trailing % as %%
*_Dest++ = _Percent;
break;
}
else
{ // get specifier after %
char _Specifier = _MAKLOCBYTE(_Elem, *_Fmtfirst, _Cvt);
char _Qualifier = '\0';
if (_Specifier != 'E' && _Specifier != 'O'
&& _Specifier != 'Q' && _Specifier != '#')
; // not [E0Q#] qualifier, treat as specifier
else if (++_Fmtfirst == _Fmtlast)
{ // no specifier, copy %[E0Q#] as literal elements
*_Dest++ = _Percent, *_Dest++ = _Specifier;
break;
}
else
{ // save both qualifier and specifier
_Qualifier = _Specifier;
_Specifier = _MAKLOCBYTE(_Elem, *_Fmtfirst, _Cvt);
}
_Dest = do_put(_Dest, _Iosbase, _Fill, _Pt,
_Specifier, _Qualifier); // convert a single field
}
return (_Dest);
}
_OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, const tm *_Pt,
char _Specifier, char _Modifier = 0) const
{ // put formatted time from _Pt to _Dest for _Specifier/_Modifier
return (do_put(_Dest, _Iosbase, _Fill, _Pt, _Specifier, _Modifier));
}
__PURE_APPDOMAIN_GLOBAL static locale::id id; // unique facet id
explicit __CLR_OR_THIS_CALL time_put(size_t _Refs = 0)
: locale::facet(_Refs)
{ // construct from current locale
_BEGIN_LOCINFO(_Lobj)
_Init(_Lobj);
_END_LOCINFO()
}
__CLR_OR_THIS_CALL time_put(const _Locinfo& _Lobj, size_t _Refs = 0)
: locale::facet(_Refs)
{ // construct from specified locale
_Init(_Lobj);
}
static size_t __CLRCALL_OR_CDECL _Getcat(const locale::facet **_Ppf = 0,
const locale *_Ploc = 0)
{ // return locale category mask and construct standard facet
if (_Ppf != 0 && *_Ppf == 0)
*_Ppf = _NEW_CRT time_put<_Elem, _OutIt>(
_Locinfo(_Ploc->c_str()));
return (_X_TIME);
}
protected:
virtual __CLR_OR_THIS_CALL ~time_put()
{ // destroy the object
}
void __CLR_OR_THIS_CALL _Init(const _Locinfo& _Lobj)
{ // initialize from _Lobj
_Cvt = _Lobj._Getcvt();
_Tnames = _Lobj._Gettnames();
}
virtual _OutIt __CLR_OR_THIS_CALL do_put(_OutIt _Dest,
ios_base&, _Elem, const tm *_Pt,
char _Specifier, char _Modifier = 0) const
{ // put formatted time from _Pt to _Dest for [_Fmtfirst, _Fmtlast)
_DEBUG_POINTER(_Dest);
_DEBUG_POINTER(_Pt);
char _Fmt[5] = "!%x\0"; // '!' for nonzero count, null for modifier
size_t _Count, _Num;
string _Str;
if (_Modifier == (_Elem)0)
_Fmt[2] = _Specifier;
else
_Fmt[2] = _Modifier, _Fmt[3] = _Specifier;
for (_Num = 16; ; _Num *= 2)
{ // convert into ever larger string buffer until success
_Str.append(_Num, '\0');
if (0 < (_Count = _Strftime(&*_Str.begin(), _Str.size(),
_Fmt, _Pt, _Tnames._Getptr())))
break;
}
for (string::const_iterator _Snext = _Str.begin();
0 < --_Count; ++_Dest) // skip literal '!'
*_Dest = _MAKLOCCHR(_Elem, *++_Snext, _Cvt);
return (_Dest);
}
private:
_Locinfo::_Timevec _Tnames; // locale-specific stuff for _Strftime
_Locinfo::_Cvtvec _Cvt; // conversion information
};
// STATIC time_put::id OBJECT
template<class _Elem,
class _OutIt>
__PURE_APPDOMAIN_GLOBAL locale::id time_put<_Elem, _OutIt>::id;
// CLASS time_put<wchar_t>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -