windows-nt/Source/XPSP1/NT/base/crts/crtw32/stdcpp64/locale0.cpp
2020-09-26 16:20:57 +08:00

93 lines
2.8 KiB
C++

// locale0 -- class locale basic member functions
#include <climits>
#include <locale>
_STD_BEGIN
static locale classic_locale(_Noinit);
locale::_Locimp *locale::_Locimp::_Clocptr = 0;
locale::_Locimp *locale::_Locimp::_Global = 0;
int locale::id::_Id_cnt = 0;
const ctype_base::mask *ctype<char>::_Cltab = 0;
const size_t ctype<char>::table_size = 1 << CHAR_BIT;
const locale& __cdecl locale::classic()
{ // get reference to "C" locale
_Init();
_Lockit _Lk;
return (classic_locale);
}
locale __cdecl locale::empty()
{ // make empty transparent locale
_Init();
return (locale(new _Locimp(true)));
}
const locale::facet *locale::_Getfacet(size_t _Id,
bool _Xp) const
{ // look up a facet in locale object
_Lockit _Lk;
const facet *_F = _Id < _Ptr->_Nfv ? _Ptr->_Fv[_Id] : 0;
return (_F != 0 || !_Xp || !_Ptr->_Xpar ? _F
: _Id < _Locimp::_Global->_Nfv
? _Locimp::_Global->_Fv[_Id] : 0);
}
bool locale::_Iscloc() const
{ // test for underlying dummy C locale object
_Lockit _Lk;
return (_Ptr == _Locimp::_Clocptr || _Ptr->_Xpar
&& _Locimp::_Global == _Locimp::_Clocptr);
}
bool locale::operator==(const locale& _X) const
{ // compare locales for equality
return (_Ptr == _X._Ptr || name().compare("*") != 0
&& name().compare(_X.name()) == 0);
}
locale::_Locimp *__cdecl locale::_Init()
{ // setup _Global and "C" locales
_Lockit _Lk;
if (_Locimp::_Global == 0)
{ // create new locales
_Locimp::_Global = new _Locimp;
atexit(&_Tidy);
_Locimp::_Global->_Cat = all;
_Locimp::_Global->_Name = "C";
_Locimp::_Clocptr = _Locimp::_Global;
_Locimp::_Clocptr->_Incref();
new (&classic_locale) locale(_Locimp::_Clocptr);
}
return (_Locimp::_Global);
}
void __cdecl locale::_Tidy()
{ // discard _Global locale
_Lockit _Lk;
if (_Locimp::_Global != 0)
delete _Locimp::_Global->_Decref();
}
locale::_Locimp::_Locimp(bool _Xp)
: locale::facet(1), _Fv(0), _Nfv(0),
_Cat(none), _Xpar(_Xp), _Name("*")
{ // construct an empty _Locimp
}
locale::_Locimp::~_Locimp()
{ // destruct a _Locimp
_Lockit _Lk;
for (size_t _N = _Nfv; 0 < _N; )
if (_Fv[--_N] != 0)
delete _Fv[_N]->_Decref();
free(_Fv);
}
_STD_END
/*
* Copyright (c) 1996 by P.J. Plauger. ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
*/