Reactos
at master 84 lines 2.1 kB view raw
1/*** 2*mbtoupr.c - Convert character to upper case (MBCS) 3* 4* Copyright (c) Microsoft Corporation. All rights reserved. 5* 6*Purpose: 7* Convert character to upper case (MBCS) 8* 9*******************************************************************************/ 10#ifndef _MBCS 11 #error This file should only be compiled with _MBCS defined 12#endif 13 14#include <corecrt_internal_mbstring.h> 15#include <locale.h> 16 17/*** 18* _mbctoupper - Convert character to upper case (MBCS) 19* 20*Purpose: 21* If the given character is lower case, convert to upper case. 22* Handles MBCS chars correctly. 23* 24* Note: Use test against 0x00FF instead of _ISLEADBYTE 25* to ensure that we don't call SBCS routine with a two-byte 26* value. 27* 28*Entry: 29* unsigned int c = character to convert 30* 31*Exit: 32* Returns converted character 33* 34*Exceptions: 35* 36*******************************************************************************/ 37 38extern "C" unsigned int __cdecl _mbctoupper_l( 39 unsigned int c, 40 _locale_t plocinfo 41 ) 42{ 43 unsigned char val[2]; 44 unsigned char ret[4]; 45 _LocaleUpdate _loc_update(plocinfo); 46 47 if (c > 0x00FF) 48 { 49 50 val[0] = (c >> 8) & 0xFF; 51 val[1] = c & 0xFF; 52 53 if ( !_ismbblead_l(val[0], _loc_update.GetLocaleT()) ) 54 return c; 55 56 57 if ( __acrt_LCMapStringA( 58 _loc_update.GetLocaleT(), 59 _loc_update.GetLocaleT()->mbcinfo->mblocalename, 60 LCMAP_UPPERCASE, 61 (const char *)val, 62 2, 63 (char *)ret, 64 2, 65 _loc_update.GetLocaleT()->mbcinfo->mbcodepage, 66 TRUE ) == 0 ) 67 return c; 68 69 c = ret[1]; 70 c += ret[0] << 8; 71 72 return c; 73 74 75 } 76 else 77 return (unsigned int)_mbbtoupper_l((int)c, _loc_update.GetLocaleT()); 78} 79unsigned int (__cdecl _mbctoupper)( 80 unsigned int c 81 ) 82{ 83 return _mbctoupper_l(c, nullptr); 84}