home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / crt / src / locale0.cpp < prev    next >
C/C++ Source or Header  |  1998-06-16  |  3KB  |  93 lines

  1. // locale0 -- class locale basic member functions
  2. #include <climits>
  3. #include <locale>
  4. _STD_BEGIN
  5.  
  6. static locale classic_locale(_Noinit);
  7. locale::_Locimp *locale::_Locimp::_Clocptr = 0;
  8. locale::_Locimp *locale::_Locimp::_Global = 0;
  9. int locale::id::_Id_cnt = 0;
  10.  
  11. const ctype_base::mask *ctype<char>::_Cltab = 0;
  12. const size_t ctype<char>::table_size = 1 << CHAR_BIT;
  13.  
  14. const locale& __cdecl locale::classic()
  15.         {       // get reference to "C" locale
  16.         _Init();
  17.         _Lockit _Lk;
  18.         return (classic_locale);
  19.         }
  20.  
  21. locale __cdecl locale::empty()
  22.         {       // make empty transparent locale
  23.         _Init();
  24.         return (locale(new _Locimp(true)));
  25.         }
  26.  
  27. const locale::facet *locale::_Getfacet(size_t _Id,
  28.         bool _Xp) const
  29.         {       // look up a facet in locale object
  30.         _Lockit _Lk;
  31.         const facet *_F = _Id < _Ptr->_Nfv ? _Ptr->_Fv[_Id] : 0;
  32.         return (_F != 0 || !_Xp || !_Ptr->_Xpar ? _F
  33.                 : _Id < _Locimp::_Global->_Nfv
  34.                         ? _Locimp::_Global->_Fv[_Id] : 0);
  35.         }
  36.  
  37. bool locale::_Iscloc() const
  38.         {       // test for underlying dummy C locale object
  39.         _Lockit _Lk;
  40.         return (_Ptr == _Locimp::_Clocptr || _Ptr->_Xpar
  41.                 && _Locimp::_Global == _Locimp::_Clocptr);
  42.         }
  43.  
  44. bool locale::operator==(const locale& _X) const
  45.         {       // compare locales for equality
  46.         return (_Ptr == _X._Ptr || name().compare("*") != 0
  47.                 && name().compare(_X.name()) == 0);
  48.         }
  49.  
  50. locale::_Locimp *__cdecl locale::_Init()
  51.         {       // setup _Global and "C" locales
  52.         _Lockit _Lk;
  53.         if (_Locimp::_Global == 0)
  54.                 {       // create new locales
  55.                 _Locimp::_Global = new _Locimp;
  56.                 atexit(&_Tidy);
  57.                 _Locimp::_Global->_Cat = all;
  58.                 _Locimp::_Global->_Name = "C";
  59.                 _Locimp::_Clocptr = _Locimp::_Global;
  60.                 _Locimp::_Clocptr->_Incref();
  61.                 new (&classic_locale) locale(_Locimp::_Clocptr);
  62.                 }
  63.         return (_Locimp::_Global);
  64.         }
  65.  
  66. void __cdecl locale::_Tidy()
  67.         {       // discard _Global locale
  68.         _Lockit _Lk;
  69.         if (_Locimp::_Global != 0)
  70.                 delete _Locimp::_Global->_Decref();
  71.         }
  72.  
  73. locale::_Locimp::_Locimp(bool _Xp)
  74.         : locale::facet(1), _Fv(0), _Nfv(0),
  75.                 _Cat(none), _Xpar(_Xp), _Name("*")
  76.         {       // construct an empty _Locimp
  77.         }
  78.  
  79. locale::_Locimp::~_Locimp()
  80.         {       // destruct a _Locimp
  81.         _Lockit _Lk;
  82.         for (size_t _N = _Nfv; 0 < _N; )
  83.                 if (_Fv[--_N] != 0)
  84.                         delete _Fv[_N]->_Decref();
  85.         free(_Fv);
  86.         }
  87. _STD_END
  88.  
  89. /*
  90.  * Copyright (c) 1996 by P.J. Plauger.  ALL RIGHTS RESERVED. 
  91.  * Consult your license regarding permissions and restrictions.
  92.  */
  93.