Beispiel #1
0
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);
		}
	}
Beispiel #2
0
_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); }
Beispiel #3
0
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);
        }
Beispiel #4
0
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);
	}