home *** CD-ROM | disk | FTP | other *** search
- // xloctime internal header (from <locale>)
-
- #if _MSC_VER > 1000
- #pragma once
- #endif
-
- #ifndef _XLOCTIME_
- #define _XLOCTIME_
- #include <ctime>
- #include <xiosbase>
-
- #ifdef _MSC_VER
- #pragma pack(push,8)
- #endif /* _MSC_VER */
- _STD_BEGIN
- // STRUCT time_base
- struct _CRTIMP time_base : public locale::facet {
- enum _Dateorder {no_order, dmy, mdy, ymd, ydm};
- _BITMASK(_Dateorder, dateorder);
- time_base(size_t _R = 0)
- : locale::facet(_R) {}
- };
- _BITMASK_OPS(time_base::_Dateorder);
- // TEMPLATE CLASS time_get
- template<class _E,
- class _II = istreambuf_iterator<_E, char_traits<_E> > >
- class time_get : public time_base {
- public:
- typedef _E char_type;
- typedef _II iter_type;
- static locale::id id;
- dateorder date_order() const
- {return (do_date_order()); }
- _II get_time(_II _F, _II _L, ios_base& _X,
- ios_base::iostate& _St, tm *_Tp) const
- {return (do_get_time(_F, _L, _X, _St, _Tp)); }
- _II get_date(_II _F, _II _L, ios_base& _X,
- ios_base::iostate& _St, tm *_Tp) const
- {return (do_get_date(_F, _L, _X, _St, _Tp)); }
- _II get_weekday(_II _F, _II _L, ios_base& _X,
- ios_base::iostate& _St, tm *_Tp) const
- {return (do_get_weekday(_F, _L, _X, _St, _Tp)); }
- _II get_monthname(_II _F, _II _L, ios_base& _X,
- ios_base::iostate& _St, tm *_Tp) const
- {return (do_get_monthname(_F, _L, _X, _St, _Tp)); }
- _II get_year(_II _F, _II _L, ios_base& _X,
- ios_base::iostate& _St, tm *_Tp) const
- {return (do_get_year(_F, _L, _X, _St, _Tp)); }
- explicit time_get(size_t _R = 0)
- : time_base(_R) {_Init(_Locinfo()); }
- time_get(const _Locinfo& _Lobj, size_t _R = 0)
- : time_base(_R) {_Init(_Lobj); }
- static size_t __cdecl _Getcat()
- {return (_LC_TIME); }
- _PROTECTED:
- virtual ~time_get()
- {delete[] _Days;
- delete[] _Months; }
- protected:
- void _Init(const _Locinfo& _Lobj)
- {_Days = _MAKLOCSTR(_E, _Lobj._Getdays());
- _Months = _MAKLOCSTR(_E, _Lobj._Getmonths()); }
- virtual dateorder do_date_order() const
- {return (mdy); }
- virtual _II do_get_time(_II _F, _II _L, ios_base& _X,
- ios_base::iostate& _St, tm *_Tp) const
- {const _E _Colon = _WIDEN(_E, ':');
- _St |= _Getint(_F, _L, 0, 23, _Tp->tm_hour);
- if (_St != ios_base::goodbit || *_F != _Colon)
- _St |= ios_base::failbit;
- else
- _St |= _Getint(++_F, _L, 0, 59, _Tp->tm_min);
- if (_St != ios_base::goodbit || *_F != _Colon)
- _St |= ios_base::failbit;
- else
- _St |= _Getint(++_F, _L, 0, 59, _Tp->tm_sec);
- return (_F); }
- virtual _II do_get_date(_II _F, _II _L, ios_base& _X,
- ios_base::iostate& _St, tm *_Tp) const // Dec 2, 1979
- {_F = get_monthname(_F, _L, _X, _St, _Tp);
- if (_St != ios_base::goodbit || *_F != _WIDEN(_E, ' '))
- _St |= ios_base::failbit;
- else
- _St |= _Getint(++_F, _L, 1, 31, _Tp->tm_mday);
- if (_St != ios_base::goodbit || *_F != _WIDEN(_E, ','))
- _St |= ios_base::failbit;
- else if (++_F == _L || *_F != _WIDEN(_E, ' '))
- _St |= ios_base::failbit;
- else
- _F = get_year(++_F, _L, _X, _St, _Tp);
- if (_F == _L)
- _St |= ios_base::eofbit;
- return (_F); }
- virtual _II do_get_weekday(_II _F, _II _L, ios_base& _X,
- ios_base::iostate& _St, tm *_Tp) const
- {int _N = _Getloctxt(_F, _L, (size_t)0, _Days);
- if (_N < 0)
- _St |= ios_base::failbit;
- else
- _Tp->tm_wday = _N >> 1;
- return (_F); }
- virtual _II do_get_monthname(_II _F, _II _L, ios_base& _X,
- ios_base::iostate& _St, tm *_Tp) const
- {int _N = _Getloctxt(_F, _L, (size_t)0, _Months);
- if (_N < 0)
- _St |= ios_base::failbit;
- else
- _Tp->tm_mon = _N >> 1;
- return (_F); }
- virtual _II do_get_year(_II _F, _II _L, ios_base& _X,
- ios_base::iostate& _St, tm *_Tp) const
- {int _Ans;
- _St |= _Getint(_F, _L, 0, 2035, _Ans);
- if (_St & ios_base::failbit)
- ;
- else if (1900 <= _Ans)
- _Ans -= 1900;
- else if (2035 - 1900 < _Ans)
- _St |= ios_base::failbit;
- if (!(_St & ios_base::failbit))
- _Tp->tm_year = _Ans;
- return (_F); }
- private:
- static ios_base::iostate __cdecl _Getint(_II& _F, _II& _L,
- int _Lo, int _Hi, int& _V)
- {char _Ac[_MAX_INT_DIG], *_Ep;
- char *_P = _Ac;
- if (_F == _L)
- ;
- else if (*_F == _WIDEN(_E, '+'))
- *_P++ = '+', ++_F;
- else if (*_F == _WIDEN(_E, '-'))
- *_P++ = '-', ++_F;
- bool _Sd = false;
- while (_F != _L && *_F == _WIDEN(_E, '0'))
- _Sd = true, ++_F;
- if (_Sd)
- *_P++ = '0';
- for (char *const _Pe = &_Ac[_MAX_INT_DIG - 1]; _F != _L
- && '0' <= (*_P = (char)_NARROW(_E, *_F)) && *_P <= '9';
- _Sd = true, ++_F)
- if (_P < _Pe)
- ++_P;
- if (!_Sd)
- _P = _Ac;
- *_P = '\0';
- errno = 0;
- const long _Ans = strtol(_Ac, &_Ep, 10);
- ios_base::iostate _St = ios_base::goodbit;
- if (_F == _L)
- _St |= ios_base::eofbit;
- if (_Ep == _Ac || errno != 0 || _Ans < _Lo || _Hi < _Ans)
- _St |= ios_base::failbit;
- else
- _V = _Ans;
- return (_St); }
- _E *_Days, *_Months;
- };
- template<class _E, class _II>
- locale::id time_get<_E, _II>::id;
- // TEMPLATE CLASS time_get_byname
- template<class _E,
- class _II = istreambuf_iterator<_E, char_traits<_E> > >
- class time_get_byname : public time_get<_E, _II> {
- public:
- explicit time_get_byname(const char *_S, size_t _R = 0)
- : time_get<_E, _II>(_Locinfo(_S), _R) {}
- _PROTECTED:
- virtual ~time_get_byname()
- {}
- };
- // TEMPLATE CLASS time_put
- template<class _E,
- class _OI = ostreambuf_iterator<_E, char_traits<_E> > >
- class time_put : public time_base {
- public:
- typedef _E char_type;
- typedef _OI iter_type;
- _OI put(_OI _F, ios_base& _X, const tm *_Tp,
- const _E *_Ff, const _E *_Lf) const
- {const _E _Pct = _WIDEN(_E, '%');
- for (; _Ff != _Lf; ++_Ff)
- if (*_Ff != _Pct)
- *_F++ = *_Ff;
- else if (++_Ff == _Lf)
- {*_F++ = _Pct;
- break; }
- else
- {char _C = (char)_NARROW(_E, *_Ff);
- char _Q = '\0';
- if (_C != 'E' && _C != 'O' && _C != 'Q'
- && _C != '#')
- ;
- else if (++_Ff == _Lf)
- {*_F++ = _Pct, *_F++ = _C;
- break; }
- else
- _Q = _C, _C = (char)_NARROW(_E, *_Ff);
- _F = do_put(_F, _X, _Tp, _C, _Q); }
- return (_F); }
- _OI put(_OI _F, ios_base& _X, const tm *_Tp,
- char _C, char _M = 0) const
- {return (do_put(_F, _X, _Tp, _C, _M)); }
- static locale::id id;
- explicit time_put(size_t _R = 0)
- : time_base(_R) {_Init(_Locinfo()); }
- time_put(const _Locinfo& _Lobj, size_t _R = 0)
- : time_base(_R) {_Init(_Lobj); }
- static size_t __cdecl _Getcat()
- {return (_LC_TIME); }
- _PROTECTED:
- virtual ~time_put()
- {}
- protected:
- void _Init(const _Locinfo& _Lobj)
- {_Tnames = _Lobj._Gettnames(); }
- virtual _OI do_put(_OI _F, ios_base& _X, const tm *_Tp,
- char _C, char _M = 0) const
- {char _Fmt[5] = {"!%x\0"};
- size_t _I, _N;
- string _Str;
- if (_M == (_E)0)
- _Fmt[2] = _C;
- else
- _Fmt[2] = _M, _Fmt[3] = _C;
- for (_N = 16; ; _N *= 2)
- {_Str.append(_N, '\0');
- if (0 < (_I = _Strftime(_Str.begin(), _Str.size(),
- _Fmt, _Tp, _Tnames._Getptr())))
- break; }
- for (char *_S = _Str.begin(); 0 < --_I; ++_F)
- *_F = _WIDEN(_E, *++_S);
- return (_F); }
- private:
- _Locinfo::_Timevec _Tnames;
- };
- template<class _E, class _OI>
- locale::id time_put<_E, _OI>::id;
- // TEMPLATE CLASS time_put_byname
- template<class _E,
- class _OI = ostreambuf_iterator<_E, char_traits<_E> > >
- class time_put_byname : public time_put<_E, _OI> {
- public:
- explicit time_put_byname(const char *_S, size_t _R = 0)
- : time_put<_E, _OI>(_Locinfo(_S), _R) {}
- _PROTECTED:
- virtual ~time_put_byname()
- {}
- };
- #ifdef _DLL
-
- #pragma warning(disable:4231) /* the extern before template is a non-standard extension */
-
- extern template class _CRTIMP time_get<char,
- istreambuf_iterator<char, char_traits<char> > >;
- extern template class _CRTIMP time_get<wchar_t,
- istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
- extern template class _CRTIMP time_put<char,
- ostreambuf_iterator<char, char_traits<char> > >;
- extern template class _CRTIMP time_put<wchar_t,
- ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
-
- #pragma warning(default:4231) /* restore previous warning */
-
- #endif // _DLL
-
- _STD_END
- #ifdef _MSC_VER
- #pragma pack(pop)
- #endif /* _MSC_VER */
-
- #endif /* _XLOCTIME_ */
-
- /*
- * Copyright (c) 1995 by P.J. Plauger. ALL RIGHTS RESERVED.
- * Consult your license regarding permissions and restrictions.
- */
-