char *_Getlname(_Linfo **pc, int cat, const char **pn) { /* build a locale name */ char *s; int based; size_t i, len, n; for (based = 0, len = 0, n = 0, i = 0; ++i < _NCAT; ) if ((_CATMASK(i) & cat) == 0) ; else if (pc[i] == pc[0]) based = 1; else { /* count a changed subcategory */ len += strlen(nmcats[i]) + strlen(pc[i]->_Name) + 1; ++n; } if (n == 0) { /* uniform or vacuous locale */ free((void *)*pn), *pn = 0; return (based ? (char *)pc[0]->_Name : 0); } if (based) len += strlen(pc[0]->_Name); else --len; if ((s = (char *)malloc(len + 1)) == 0) return (0); else { /* build complex name */ free((void *)*pn), *pn = s; if (based) s += strlen(strcpy(s, pc[0]->_Name)); for (i = 0; ++i < _NCAT; ) if ((_CATMASK(i) & cat) != 0 && pc[i] != pc[0]) { /* add a component */ if (based) *s++ = ';'; based = 1; s += strlen(strcpy(s, nmcats[i])); s += strlen(strcpy(s, pc[i]->_Name)); } return ((char *)*pn); } }
_CRTIMP2 _Locinfo& _Locinfo::_Addcats(int _C, const char *_Name) { // merge in another named locale const char *_Lname = 0; if (_C == 0) _Lname = setlocale(LC_ALL, 0); else if (_C == _M_ALL) _Lname = setlocale(LC_ALL, _Name); else for (int _Cat = 0; _Cat <= _LC_MAX; ++_Cat) if ((_CATMASK(_Cat) & _C) != 0) _Lname = setlocale(_Cat, _Name); _Nname = _Lname != 0 ? _Lname : "*"; return (*this); }
locale __cdecl locale::global(const locale& _X) { // change global locale locale _L; _Lockit _Lk; if (_Locimp::_Global != _X._Ptr) { // set new global locale delete _Locimp::_Global->_Decref(); _Locimp::_Global = new _Locimp(*_X._Ptr); category _Cmask = _Locimp::_Global->_Cat & all; if (_Cmask == all) setlocale(LC_ALL, _Locimp::_Global->_Name.c_str()); else for (int _Cat = 0; _Cat <= _LC_MAX; ++_Cat) if ((_CATMASK(_Cat) & _Cmask) != 0) setlocale(_Cat, _Locimp::_Global->_Name.c_str()); } return (_L); }
int _Getnloc(_Linfo **pc, int cat, const char *locname) { /* map locale name to profile */ _Linfo *p; int changed = 0; size_t i; if ((cat & _M_ALL) != cat) return (-1); /* bad category mask */ if (locname[0] == '\0') locname = _Defloc(); for (i = 0; ++i < _NCAT; ) if ((_CATMASK(i) & cat) != 0) { /* set a category */ if ((p = _Getloc(nmcats[i], locname)) == 0) return (-1); if (p != pc[i]) changed = 1; pc[i] = p; } if (cat == _M_ALL && (p = _Getloc("", locname)) != 0 && p != pc[0]) pc[0] = p, changed = 1; return (changed); }