33 #define strcasecmp _stricmp
40#define WINVER DLL_EXPORT_VERSION
43#define LOCALE_NAME_USER_DEFAULT NULL
54#define NLSRC_OFFSET 5000
58#define LOCALE_LOCALEINFOFLAGSMASK (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP|\
59 LOCALE_RETURN_NUMBER|LOCALE_RETURN_GENITIVE_NAMES)
60#define MB_FLAGSMASK (MB_PRECOMPOSED|MB_COMPOSITE|MB_USEGLYPHCHARS|MB_ERR_INVALID_CHARS)
61#define WC_FLAGSMASK (WC_DISCARDNS|WC_SEPCHARS|WC_DEFAULTCHAR|WC_ERR_INVALID_CHARS|\
62 WC_COMPOSITECHECK|WC_NO_BEST_FIT_CHARS)
71 '\\',
'R',
'e',
'g',
'i',
's',
't',
'r',
'y',
'\\',
'M',
'a',
'c',
'h',
'i',
'n',
'e',
'\\',
'S',
'y',
's',
't',
'e',
'm',
'\\',
72 'C',
'u',
'r',
'r',
'e',
'n',
't',
'C',
'o',
'n',
't',
'r',
'o',
'l',
'S',
'e',
't',
'\\',
73 'C',
'o',
'n',
't',
'r',
'o',
'l',
'\\',
'N',
'l',
's',
'\\',
'L',
'o',
'c',
'a',
'l',
'e',0
77 '\\',
'R',
'e',
'g',
'i',
's',
't',
'r',
'y',
'\\',
'M',
'a',
'c',
'h',
'i',
'n',
'e',
'\\',
'S',
'y',
's',
't',
'e',
'm',
'\\',
78 'C',
'u',
'r',
'r',
'e',
'n',
't',
'C',
'o',
'n',
't',
'r',
'o',
'l',
'S',
'e',
't',
'\\',
79 'C',
'o',
'n',
't',
'r',
'o',
'l',
'\\',
'N',
'l',
's',
'\\',
80 'L',
'a',
'n',
'g',
'u',
'a',
'g',
'e',
' ',
'G',
'r',
'o',
'u',
'p',
's',0
87 const char *charset_name;
126 {
"ISO88591", 28591 },
127 {
"ISO885910", 28600 },
128 {
"ISO885913", 28603 },
129 {
"ISO885914", 28604 },
130 {
"ISO885915", 28605 },
131 {
"ISO885916", 28606 },
132 {
"ISO88592", 28592 },
133 {
"ISO88593", 28593 },
134 {
"ISO88594", 28594 },
135 {
"ISO88595", 28595 },
136 {
"ISO88596", 28596 },
137 {
"ISO88597", 28597 },
138 {
"ISO88598", 28598 },
139 {
"ISO88599", 28599 },
171static const WCHAR iCalendarTypeW[] = {
'i',
'C',
'a',
'l',
'e',
'n',
'd',
'a',
'r',
'T',
'y',
'p',
'e',0};
173static const WCHAR iCurrDigitsW[] = {
'i',
'C',
'u',
'r',
'r',
'D',
'i',
'g',
'i',
't',
's',0};
177static const WCHAR iFirstDayOfWeekW[] = {
'i',
'F',
'i',
'r',
's',
't',
'D',
'a',
'y',
'O',
'f',
'W',
'e',
'e',
'k',0};
178static const WCHAR iFirstWeekOfYearW[] = {
'i',
'F',
'i',
'r',
's',
't',
'W',
'e',
'e',
'k',
'O',
'f',
'Y',
'e',
'a',
'r',0};
183static const WCHAR iNegNumberW[] = {
'i',
'N',
'e',
'g',
'N',
'u',
'm',
'b',
'e',
'r',0};
184static const WCHAR iPaperSizeW[] = {
'i',
'P',
'a',
'p',
'e',
'r',
'S',
'i',
'z',
'e',0};
186static const WCHAR iTimePrefixW[] = {
'i',
'T',
'i',
'm',
'e',
'P',
'r',
'e',
'f',
'i',
'x',0};
198static const WCHAR sMonDecimalSepW[] = {
's',
'M',
'o',
'n',
'D',
'e',
'c',
'i',
'm',
'a',
'l',
'S',
'e',
'p',0};
199static const WCHAR sMonGroupingW[] = {
's',
'M',
'o',
'n',
'G',
'r',
'o',
'u',
'p',
'i',
'n',
'g',0};
200static const WCHAR sMonThousandSepW[] = {
's',
'M',
'o',
'n',
'T',
'h',
'o',
'u',
's',
'a',
'n',
'd',
'S',
'e',
'p',0};
201static const WCHAR sNativeDigitsW[] = {
's',
'N',
'a',
't',
'i',
'v',
'e',
'D',
'i',
'g',
'i',
't',
's',0};
202static const WCHAR sNegativeSignW[] = {
's',
'N',
'e',
'g',
'a',
't',
'i',
'v',
'e',
'S',
'i',
'g',
'n',0};
203static const WCHAR sPositiveSignW[] = {
's',
'P',
'o',
's',
'i',
't',
'i',
'v',
'e',
'S',
'i',
'g',
'n',0};
204static const WCHAR sShortDateW[] = {
's',
'S',
'h',
'o',
'r',
't',
'D',
'a',
't',
'e',0};
206static const WCHAR sTimeFormatW[] = {
's',
'T',
'i',
'm',
'e',
'F',
'o',
'r',
'm',
'a',
't',0};
208static const WCHAR sYearMonthW[] = {
's',
'Y',
'e',
'a',
'r',
'M',
'o',
'n',
't',
'h',0};
258 { LOCALE_IDIGITSUBSTITUTION,
NumShapeW },
269 while (
n > 1 && *
src)
335#if (WINVER >= 0x0600)
339static int charset_cmp(
const void *
name,
const void *
entry )
351 char charset_name[16];
355 for (
i =
j = 0;
name[
i] &&
j <
sizeof(charset_name)-1;
i++)
360 sizeof(charset_names)/
sizeof(charset_names[0]),
361 sizeof(charset_names[0]), charset_cmp );
385#if (WINVER >= 0x0600)
400 if (
data->win_name[0] &&
468 return (
data->matches < 4);
481 static const WCHAR sepW[] = {
'-',
'_',
'.',
'@',0};
482 static const WCHAR winsepW[] = {
'-',
'_',0};
483 static const WCHAR posixW[] = {
'P',
'O',
'S',
'I',
'X',0};
484 static const WCHAR cW[] = {
'C',0};
485 static const WCHAR latinW[] = {
'l',
'a',
't',
'i',
'n',0};
486 static const WCHAR latnW[] = {
'-',
'L',
'a',
't',
'n',0};
495 name->win_name[0] = 0;
559 name->codepage = find_charset(
name->charset );
563 if (
name->charset)
goto done;
595 switch(lctype & 0xffff)
597 case LOCALE_SSORTNAME:
604 case LOCALE_IDEFAULTEBCDICCODEPAGE:
625 case LOCALE_SNATIVECURRNAME:
630 case LOCALE_IDIGITSUBSTITUTION:
712 case LOCALE_SYEARMONTH:
716 case LOCALE_IPAPERSIZE:
728 if (default_id)
lcid = default_id;
740 switch(lctype & 0xffff)
768 static const WCHAR cplW[] = {
'C',
'o',
'n',
't',
'r',
'o',
'l',
' ',
'P',
'a',
'n',
'e',
'l',0};
769 static const WCHAR intlW[] = {
'I',
'n',
't',
'e',
'r',
'n',
'a',
't',
'i',
'o',
'n',
'a',
'l',0};
777 attr.RootDirectory = hkey;
781 attr.SecurityQualityOfService =
NULL;
787 attr.RootDirectory = cpl_key;
802 static const WCHAR formatW[] = {
'%',
'0',
'8',
'x',0 };
808 count =
sizeof(bufferW);
815 TRACE(
"updating registry, locale %s changed %s -> %08x\n",
822 for (
i = 0;
i < nb_values;
i++)
825 sizeof(bufferW)/
sizeof(
WCHAR) );
840 static const WCHAR acpW[] = {
'A',
'C',
'P',0};
841 static const WCHAR oemcpW[] = {
'O',
'E',
'M',
'C',
'P',0};
842 static const WCHAR maccpW[] = {
'M',
'A',
'C',
'C',
'P',0};
843 static const WCHAR localeW[] = {
'L',
'o',
'c',
'a',
'l',
'e',0};
844 static const WCHAR lc_ctypeW[] = {
'L',
'C',
'_',
'C',
'T',
'Y',
'P',
'E',0 };
845 static const WCHAR lc_monetaryW[] = {
'L',
'C',
'_',
'M',
'O',
'N',
'E',
'T',
'A',
'R',
'Y',0 };
846 static const WCHAR lc_numericW[] = {
'L',
'C',
'_',
'N',
'U',
'M',
'E',
'R',
'I',
'C',0 };
847 static const WCHAR lc_timeW[] = {
'L',
'C',
'_',
'T',
'I',
'M',
'E',0 };
848 static const WCHAR lc_measurementW[] = {
'L',
'C',
'_',
'M',
'E',
'A',
'S',
'U',
'R',
'E',
'M',
'E',
'N',
'T',0 };
849 static const WCHAR lc_telephoneW[] = {
'L',
'C',
'_',
'T',
'E',
'L',
'E',
'P',
'H',
'O',
'N',
'E',0 };
850 static const WCHAR lc_paperW[] = {
'L',
'C',
'_',
'P',
'A',
'P',
'E',
'R',0};
855 } update_cp_values[] = {
860 static const LCTYPE lc_messages_values[] = {
864 static const LCTYPE lc_monetary_values[] = {
873 static const LCTYPE lc_numeric_values[] = {
877 LOCALE_IDIGITSUBSTITUTION,
883 static const LCTYPE lc_time_values[] = {
901 static const LCTYPE lc_paper_values[] = { LOCALE_IPAPERSIZE };
913 sizeof(lc_messages_values)/
sizeof(lc_messages_values[0]) );
915 sizeof(lc_monetary_values)/
sizeof(lc_monetary_values[0]) );
917 sizeof(lc_numeric_values)/
sizeof(lc_numeric_values[0]) );
919 sizeof(lc_time_values)/
sizeof(lc_time_values[0]) );
921 sizeof(lc_measurement_values)/
sizeof(lc_measurement_values[0]) );
923 sizeof(lc_telephone_values)/
sizeof(lc_telephone_values[0]) );
925 sizeof(lc_paper_values)/
sizeof(lc_paper_values[0]) );
929 static const WCHAR codepageW[] =
930 {
'\\',
'R',
'e',
'g',
'i',
's',
't',
'r',
'y',
'\\',
'M',
'a',
'c',
'h',
'i',
'n',
'e',
'\\',
'S',
'y',
's',
't',
'e',
'm',
'\\',
931 'C',
'u',
'r',
'r',
'e',
'n',
't',
'C',
'o',
'n',
't',
'r',
'o',
'l',
'S',
'e',
't',
'\\',
932 'C',
'o',
'n',
't',
'r',
'o',
'l',
'\\',
'N',
'l',
's',
'\\',
'C',
'o',
'd',
'e',
'p',
'a',
'g',
'e',0};
940 while (codepageW[
len])
946 while (codepageW[
len] && codepageW[
len] !=
'\\')
len++;
951 for (
i = 0;
i <
sizeof(update_cp_values)/
sizeof(update_cp_values[0]);
i++)
954 bufferW,
sizeof(bufferW)/
sizeof(
WCHAR) );
975static const char* get_mac_locale(
void)
977 static char mac_locale[50];
981 CFLocaleRef
locale = CFLocaleCopyCurrent();
982 CFStringRef
lang = CFLocaleGetValue(
locale, kCFLocaleLanguageCode );
983 CFStringRef
country = CFLocaleGetValue(
locale, kCFLocaleCountryCode );
984 CFStringRef locale_string;
989 locale_string = CFStringCreateCopy(
NULL,
lang);
991 CFStringGetCString(locale_string, mac_locale,
sizeof(mac_locale), kCFStringEncodingUTF8);
992 strcat(mac_locale,
".UTF-8");
995 CFRelease(locale_string);
1005static BOOL has_env(
const char*
name)
1047 if (!has_env(
"LC_ALL" ) &&
1049 (!has_env( category_name ) &&
1052 const char*
override = get_mac_locale();
1057 static char messages_locale[50];
1059 if (!messages_locale[0])
1061 CFArrayRef preferred_langs = CFLocaleCopyPreferredLanguages();
1062 if (preferred_langs && CFArrayGetCount( preferred_langs ))
1064 CFStringRef preferred_lang = CFArrayGetValueAtIndex( preferred_langs, 0 );
1065 CFDictionaryRef
components = CFLocaleCreateComponentsFromLocaleIdentifier(
NULL, preferred_lang );
1068 CFStringRef
lang = CFDictionaryGetValue(
components, kCFLocaleLanguageCode );
1071 CFStringRef locale_string;
1075 locale = CFLocaleCopyCurrent();
1082 locale_string = CFStringCreateCopy(
NULL,
lang );
1083 CFStringGetCString( locale_string, messages_locale,
sizeof(messages_locale), kCFStringEncodingUTF8 );
1084 strcat( messages_locale,
".UTF-8" );
1086 CFRelease( locale_string );
1091 if (preferred_langs)
1092 CFRelease( preferred_langs );
1095 if (messages_locale[0])
1096 override = messages_locale;
1128 TRACE(
"got lcid %04x (%d matches) for LC_CTYPE=%s\n",
1131#define GET_UNIX_LOCALE(cat) do \
1132 if ((locale = get_locale( cat, #cat ))) \
1134 strcpynAtoW( buffer, locale, sizeof(buffer)/sizeof(WCHAR) ); \
1135 if (!strcmpW( buffer, ctype_buff )) lcid_##cat = lcid_LC_CTYPE; \
1137 parse_locale_name( buffer, &locale_name ); \
1138 lcid_##cat = locale_name.lcid; \
1139 TRACE( "got lcid %04x (%d matches) for " #cat "=%s\n", \
1140 locale_name.lcid, locale_name.matches, debugstr_a(locale) ); \
1152#ifdef LC_MEASUREMENT
1159#undef GET_UNIX_LOCALE
1254 if (
flags & MUI_LANGUAGE_ID)
1298 if (
flags & ~(MUI_LANGUAGE_NAME | MUI_LANGUAGE_ID | MUI_MACHINE_LANGUAGE_SETTINGS))
1303 if ((
flags & MUI_LANGUAGE_NAME) && (
flags & MUI_LANGUAGE_ID))
1335#if (WINVER >= 0x0600)
1343 if (
flags & ~(MUI_LANGUAGE_NAME | MUI_LANGUAGE_ID))
1348 if ((
flags & MUI_LANGUAGE_NAME) && (
flags & MUI_LANGUAGE_ID))
1402#if (WINVER >= 0x0600)
1418 TRACE(
"found lcid %x for %s, matches %d\n",
1428 WARN(
"locale %s not recognized, defaulting to %s\n",
1630 if ((
lctype & LOCALE_RETURN_NUMBER) ||
1706 if (lcflags & LOCALE_RETURN_NUMBER)
1731 if (
ret != -1)
return ret;
1752 for (
i = 0;
i < (
lctype & 0x0f);
i++)
p += *
p + 1;
1754 if (lcflags & LOCALE_RETURN_NUMBER)
ret =
sizeof(
UINT)/
sizeof(
WCHAR);
1758 for (
i = 1;
i <= *
p;
i++)
if (!
p[
i])
break;
1778 if (lcflags & LOCALE_RETURN_NUMBER)
1795 TRACE(
"(lcid=0x%x,lctype=0x%x,%p,%d) returning number %d\n",
1803 TRACE(
"(lcid=0x%x,lctype=0x%x,%p,%d) returning %d %s\n",
1809#if (WINVER >= 0x0600)
1819 if (!lcid)
return 0;
1834 case LOCALE_SPARENT:
1849 TRACE(
"IsValidLocaleName not implemented (lpLocaleName=%s)\n",
debugstr_w(lpLocaleName));
1860 TRACE(
"GetUserDefaultLocaleName not implemented (lpLocaleName=%s, cchLocaleName=%d)\n",
debugstr_w(lpLocaleName), cchLocaleName);
1924 static const WCHAR intlW[] = {
'i',
'n',
't',
'l',0 };
1963 WCHAR *lpD, *lpM, *lpY;
2170 if (
table->info.def_char & 0xff00)
2229 static const WCHAR utf7[] = {
'U',
'n',
'i',
'c',
'o',
'd',
'e',
' ',
'(',
'U',
'T',
'F',
'-',
'7',
')',0};
2239 static const WCHAR utf8[] = {
'U',
'n',
'i',
'c',
'o',
'd',
'e',
' ',
'(',
'U',
'T',
'F',
'-',
'8',
')',0};
2284 if (!lpfnCodePageEnum(
buffer ))
break;
2309 *--
p =
'0' + (
page % 10);
2312 if (!lpfnCodePageEnum(
p ))
break;
2352 static const signed char base64_decoding_table[] =
2354 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
2355 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
2356 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
2357 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
2358 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
2359 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
2360 -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
2361 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
2367 DWORD byte_pair = 0;
2370 while (
src < source_end)
2375 if (
src >= source_end)
2389 signed char sextet = *
src;
2406 sextet = base64_decoding_table[sextet];
2416 byte_pair = (byte_pair << 6) | sextet;
2429 while (
src < source_end);
2540 TRACE(
"cp %d %s -> %s, ret = %d\n",
2553 static const BOOL directly_encodable_table[] =
2555 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0,
2556 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2557 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1,
2558 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
2559 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2560 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
2561 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2562 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
2565 return codepoint <= 0x7A ? directly_encodable_table[codepoint] :
FALSE;
2602 static const char base64_encoding_table[] =
2603 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
2608 while (
src < source_end)
2627 DWORD byte_pair = 0;
2634 byte_pair = (byte_pair << 16) | *
src;
2652 byte_pair <<= (6 -
offset);
2715 if (defchar ||
used)
2724 if (defchar ||
used)
2740 defchar,
used ? &used_tmp :
NULL );
2745 if (defchar ||
used)
2769 defchar,
used ? &used_tmp :
NULL );
2783 TRACE(
"cp %d %s -> %s, ret = %d\n",
2822 TRACE(
"(0x%04X)\n", lcid);
2857 TRACE(
"(0x%04x) stub - returning success\n",
langid);
2944 TRACE(
"found lcid %x for %s, matches %d\n",
2958 return lpfnLocaleEnum(
buf );
2964 static const WCHAR formatW[] = {
'%',
'0',
'8',
'x',0};
2968 return lpfnLocaleEnum(
buf );
3028 (
LPWSTR)&neutral,
sizeof(neutral) /
sizeof(
WCHAR) ))
3097 static const unsigned char type2_map[16] =
3134 WARN(
"CT_CTYPE3: semi-stub.\n");
3138 WORD type1, type3 = 0;
3157 if ((
c>=0xFF21)&&(
c<=0xFF3A)) type3 |=
C3_ALPHA;
3158 if ((
c>=0xFF41)&&(
c<=0xFF5A)) type3 |=
C3_ALPHA;
3165 if ((
c>=0xFF65)&&(
c<=0xFF9F)) type3 |=
C3_ALPHA;
3168 *chartype++ = type3;
3220 FIXME(
"For locale %04x using current ANSI code page\n",
locale);
3281 if ((0x30A1 <= wch && wch <= 0x30F3) ||
3282 wch == 0x30F4 || wch == 0x30F5 || wch == 0x30FD || wch == 0x30FE)
3305 if ((0x3041 <= wch && wch <= 0x3093) ||
3306 wch == 3094 || wch == 0x3095 || wch == 0x309D || wch == 0x309E)
3317typedef WCHAR FULL2HALF_ENTRY[3];
3318static const FULL2HALF_ENTRY full2half_table[] =
3320#define DEFINE_FULL2HALF(full, half1, half2) { full, half1, half2 },
3322#undef DEFINE_FULL2HALF
3324#define GET_FULL(table, index) ((table)[index][0])
3325#define GET_HALF1(table, index) ((table)[index][1])
3326#define GET_HALF2(table, index) ((table)[index][2])
3329typedef WCHAR DAKUTEN_ENTRY[3];
3330static const DAKUTEN_ENTRY dakuten_table[] =
3332#define DEFINE_DAKUTEN(voiced, single1, single2, half1, half2) { voiced, single1, single2 },
3334#undef DEFINE_DAKUTEN
3336#define GET_VOICED(table, index) ((table)[index][0])
3337#define GET_SINGLE1(table, index) ((table)[index][1])
3338#define GET_SINGLE2(table, index) ((table)[index][2])
3344 const FULL2HALF_ENTRY *table1 = full2half_table;
3351 map_to_katakana(&ch, 1, &ch, 1);
3353 map_to_hiragana(&ch, 1, &ch, 1);
3362 if (0xFF01 <= ch && ch <= 0xFF5E)
3370 for (
i = count1 - 1;
i >= 0; --
i)
3372 if (GET_FULL(table1,
i) != ch)
3375 if (GET_HALF2(table1,
i) == 0)
3378 dst[
pos] = GET_HALF1(table1,
i);
3386 dst[
pos++] = GET_HALF1(table1,
i);
3387 dst[
pos ] = GET_HALF2(table1,
i);
3409 const FULL2HALF_ENTRY *table1 = full2half_table;
3410 const DAKUTEN_ENTRY *table2 = dakuten_table;
3425 if (0x21 <= ch && ch <= 0x7E)
3440 for (
i = count1 - 1;
i >= 0; --
i)
3442 if (GET_HALF1(table1,
i) != ch)
3445 if (GET_HALF2(table1,
i) == 0)
3448 dst[
pos] = GET_FULL(table1,
i);
3452 if (
srclen <= 1 || GET_HALF2(table1,
i) !=
src[1])
3459 dst[
pos] = GET_FULL(table1,
i);
3467 for (
i = count2 - 1;
i >= 0; --
i)
3469 if (GET_SINGLE1(table2,
i) != ch)
3472 if (
srclen <= 1 || GET_SINGLE2(table2,
i) !=
src[1])
3479 dst[
pos] = GET_VOICED(table2,
i);
3523typedef struct tagWCHAR_PAIR
3526} WCHAR_PAIR, *PWCHAR_PAIR;
3529static const WCHAR_PAIR s_sim2tra[] =
3531#define DEFINE_SIM2TRA(from, to) { from, to },
3533#undef DEFINE_SIM2TRA
3537static const WCHAR_PAIR s_tra2sim[] =
3539#define DEFINE_TRA2SIM(from, to) { from, to },
3541#undef DEFINE_TRA2SIM
3545static int compare_wchar_pair(
const void *
x,
const void *
y)
3547 const WCHAR_PAIR *
a =
x;
3548 const WCHAR_PAIR *
b =
y;
3549 if (
a->from <
b->from)
3551 if (
a->from >
b->from)
3556static WCHAR find_wchar_pair(
const WCHAR_PAIR *pairs,
size_t count,
WCHAR ch)
3558 PWCHAR_PAIR found =
bsearch(&ch, pairs,
count,
sizeof(WCHAR_PAIR), compare_wchar_pair);
3677 flags &= ~LCMAP_LOWERCASE;
3683 flags &= ~LCMAP_UPPERCASE;
3751 if (!once++)
FIXME(
"unsupported lparam %Ix\n",
handle);
3762 TRACE(
"(%s,0x%08lx,%s,%d,%p,%d)\n",
3765 flags &= ~LOCALE_USE_CP_ACP;
3808 TRACE(
"(0x%04x,0x%08x,%s,%d,%p,%d)\n",
3836 INT ret = 0, srclenW, dstlenW;
3867 goto map_string_exit;
3874 goto map_string_exit;
3880 goto map_string_exit;
3885 goto map_string_exit;
3891 goto map_string_exit;
3924 INT ret = 0, srclenW = 0;
3940 goto FoldStringA_exit;
3956 goto FoldStringA_exit;