93 lines
2.8 KiB
C++
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.
|
||
|
*/
|