unsigned char * __cdecl _mbslwr( unsigned char *string ) { unsigned char *cp; _mlock(_MB_CP_LOCK); for (cp=string; *cp; cp++) { if (_ISLEADBYTE(*cp)) { #if defined (_WIN32) int retval; unsigned char ret[4]; if ((retval = __crtLCMapStringA(__mblcid, LCMAP_LOWERCASE, cp, 2, ret, 2, __mbcodepage, TRUE)) == 0) { _munlock(_MB_CP_LOCK); return NULL; } *cp = ret[0]; if (retval > 1) *(++cp) = ret[1]; #else /* defined (_WIN32) */ int mbval = ((*cp) << 8) + *(cp+1); cp++; if ( mbval >= _MBUPPERLOW1 && mbval <= _MBUPPERHIGH1 ) *cp += _MBCASEDIFF1; else if (mbval >= _MBUPPERLOW2 && mbval <= _MBUPPERHIGH2 ) *cp += _MBCASEDIFF2; #endif /* defined (_WIN32) */ } else /* single byte, macro version */ *cp = (unsigned char) _mbbtolower(*cp); } _munlock(_MB_CP_LOCK); return string ; }
unsigned int __cdecl _mbctoupper( unsigned int c ) { unsigned char val[2]; #if defined(_WIN32) && !defined(_POSIX_) unsigned char ret[4]; #endif /* _WIN32 */ if (c > 0x00FF) { val[0] = (c >> 8) & 0xFF; val[1] = c & 0xFF; if (!_ismbblead(val[0])) return c; #if defined( _WIN32 ) && !defined(_POSIX_) if (__crtLCMapStringA( __mblcid, LCMAP_UPPERCASE, val, 2, ret, 2, __mbcodepage) == 0) return c; c = ret[1]; c += ret[0] << 8; return c; #else /* _WIN32 */ if (c >= _MBLOWERLOW1 && c <= _MBLOWERHIGH1) c -= _MBCASEDIFF1; else if (c >= _MBLOWERLOW2 && c <= _MBLOWERHIGH2) c -= _MBCASEDIFF2; return c; #endif /* _WIN32 */ } else
extern "C" _CRTIMP unsigned int __cdecl _mbctoupper_l( unsigned int c, _locale_t plocinfo ) { unsigned char val[2]; unsigned char ret[4]; _LocaleUpdate _loc_update(plocinfo); if (c > 0x00FF) { val[0] = (c >> 8) & 0xFF; val[1] = c & 0xFF; if ( !_ismbblead_l(val[0], _loc_update.GetLocaleT()) ) return c; if ( __crtLCMapStringA( _loc_update.GetLocaleT(), _loc_update.GetLocaleT()->mbcinfo->mblcid, LCMAP_UPPERCASE, (const char *)val, 2, (char *)ret, 2, _loc_update.GetLocaleT()->mbcinfo->mbcodepage, TRUE ) == 0 ) return c; c = ret[1]; c += ret[0] << 8; return c; }
extern "C" int __cdecl _mbsicmp_l( const unsigned char *s1, const unsigned char *s2, _locale_t plocinfo ) { unsigned short c1, c2; _LocaleUpdate _loc_update(plocinfo); int retval; unsigned char szResult[4]; /* validation section */ _VALIDATE_RETURN(s1 != NULL, EINVAL, _NLSCMPERROR); _VALIDATE_RETURN(s2 != NULL, EINVAL, _NLSCMPERROR); if (_loc_update.GetLocaleT()->mbcinfo->ismbcodepage == 0) return _stricmp_l((const char *)s1, (const char *)s2, _loc_update.GetLocaleT()); for (;;) { c1 = *s1++; if ( _ismbblead_l(c1, _loc_update.GetLocaleT()) ) { if (*s1 == '\0') c1 = 0; else { retval = __crtLCMapStringA( _loc_update.GetLocaleT(), _loc_update.GetLocaleT()->mbcinfo->mblocalename, LCMAP_UPPERCASE, (LPCSTR)s1 - 1, 2, (LPSTR)szResult, 2, _loc_update.GetLocaleT()->mbcinfo->mbcodepage, TRUE ); if (retval == 1) c1 = szResult[0]; else if (retval == 2) c1 = (szResult[0] << 8) + szResult[1]; else { errno = EINVAL; return _NLSCMPERROR; } s1++; } } else c1 = _mbbtolower_l(c1, _loc_update.GetLocaleT()); c2 = *s2++; if ( _ismbblead_l(c2, _loc_update.GetLocaleT()) ) { if (*s2 == '\0') c2 = 0; else { retval = __crtLCMapStringA( _loc_update.GetLocaleT(), _loc_update.GetLocaleT()->mbcinfo->mblocalename, LCMAP_UPPERCASE, (LPCSTR)s2 - 1, 2, (LPSTR)szResult, 2, _loc_update.GetLocaleT()->mbcinfo->mbcodepage, TRUE ); if (retval == 1) c2 = szResult[0]; else if (retval == 2) c2 = (szResult[0] << 8) + szResult[1]; else { errno = EINVAL; return _NLSCMPERROR; } s2++; } } else c2 = _mbbtolower_l(c2, _loc_update.GetLocaleT()); if (c1 != c2) return( (c1 > c2) ? 1 : -1 ); if (c1 == 0) return(0); } }
int __cdecl _mbsicmp (const unsigned char *s1, const unsigned char *s2) { unsigned short c1, c2; #if defined (_WIN32) int retval; unsigned char szResult[4]; #endif /* defined (_WIN32) */ if ( _ISNOTMBCP ) return _stricmp(s1, s2); _mlock(_MB_CP_LOCK); for (;;) { c1 = *s1++; if (_ISLEADBYTE(c1)) { if (*s1 == '\0') c1 = 0; else { #if defined (_WIN32) retval = __crtLCMapStringA(__mblcid, LCMAP_UPPERCASE, s1 - 1, 2, szResult, 2, __mbcodepage, TRUE); if (retval == 1) c1 = szResult[0]; else if (retval == 2) c1 = (szResult[0] << 8) + szResult[1]; else { _munlock(_MB_CP_LOCK); return _NLSCMPERROR; } s1++; #else /* defined (_WIN32) */ c1 = ((c1 << 8) | *s1++); if (c1 >= _MBUPPERLOW1 && c1 <= _MBUPPERHIGH1) c1 += _MBCASEDIFF1; else if (c1 >= _MBUPPERLOW2 && c1 <= _MBUPPERHIGH2) c1 += _MBCASEDIFF2; #endif /* defined (_WIN32) */ } } else c1 = _mbbtolower(c1); c2 = *s2++; if (_ISLEADBYTE(c2)) { if (*s2 == '\0') c2 = 0; else { #if defined (_WIN32) retval = __crtLCMapStringA(__mblcid, LCMAP_UPPERCASE, s2 - 1, 2, szResult, 2, __mbcodepage, TRUE); if (retval == 1) c2 = szResult[0]; else if (retval == 2) c2 = (szResult[0] << 8) + szResult[1]; else { _munlock(_MB_CP_LOCK); return _NLSCMPERROR; } s2++; #else /* defined (_WIN32) */ c2 = ((c2 << 8) | *s2++); if (c2 >= _MBUPPERLOW1 && c2 <= _MBUPPERHIGH1) c2 += _MBCASEDIFF1; else if (c2 >= _MBUPPERLOW2 && c2 <= _MBUPPERHIGH2) c2 += _MBCASEDIFF2; #endif /* defined (_WIN32) */ } } else c2 = _mbbtolower(c2); if (c1 != c2) { _munlock(_MB_CP_LOCK); return( (c1 > c2) ? 1 : -1 ); } if (c1 == 0) { _munlock(_MB_CP_LOCK); return(0); } } }
_CRTIMP2_PURE size_t __CLRCALL_PURE_OR_CDECL _Strxfrm ( char *_string1, char *_end1, const char *_string2, const char *_end2, const _Collvec *ploc ) { size_t _n1 = _end1 - _string1; size_t _n2 = _end2 - _string2; int dstlen; size_t retval = (size_t)-1; /* NON-ANSI: default if OM or API error */ UINT codepage; //const wchar_t *locale_name; LCID _Locale; if (ploc == 0) { //locale_name = ___lc_locale_name_func()[LC_COLLATE]; _Locale = ___lc_handle_func()[LC_COLLATE]; codepage = ___lc_collate_cp_func(); } else { //locale_name = ploc->_LocaleName; _Locale = __acrt_LocaleNameToLCID(ploc->_LocaleName, 0); codepage = ploc->_Page; } if ((/*locale_name*/_Locale == 0) && (codepage == CP_ACP)) { if (_n2 <= _n1) { memcpy(_string1, _string2, _n2); } retval=_n2; } else { /* Inquire size of dst string in BYTES */ if (0 != (dstlen = __crtLCMapStringA(_Locale, LCMAP_SORTKEY, _string2, (int)_n2, NULL, 0, codepage, TRUE))) { retval = dstlen; /* if not enough room, return amount needed */ if (dstlen <= (int)(_n1)) { /* Map src string to dst string */ __crtLCMapStringA(_Locale, LCMAP_SORTKEY, _string2, (int)_n2, _string1, (int)_n1, codepage, TRUE); } } } return (size_t)retval; }