totally untested, but it does compile, and seems logical enough. while i was at it, i added a few more. * dlls/msvcrt: mbcs.c, msvcrt.spec: Greg Turner <gmturner007@ameritech.net> - implemented some ismbc* functions according to the advice of Dmitry Timoshkov -- gmt "War is an ugly thing, but not the ugliest of things; the decayed and degraded state of moral and patriotic feeling which thinks that nothing is worth war is much worse. A man who has nothing for which he is willing to fight; nothing he cares about more than his own personal safety; is a miserable creature who has no chance of being free, unless made and kept so by the exertions of better persons than himself." -- John Stuart Mill diff -ur -x CVS -x 'bigdif*' ../wine.test/dlls/msvcrt/mbcs.c ./dlls/msvcrt/mbcs.c --- ../wine.test/dlls/msvcrt/mbcs.c 2002-11-13 08:34:00.000000000 -0600 +++ ./dlls/msvcrt/mbcs.c 2002-11-16 20:33:23.000000000 -0600 @@ -553,25 +553,231 @@ */ int _ismbcdigit(unsigned int ch) { - if (ch <0x100) - return isdigit(ch); - else - { - FIXME("Handle MBC chars\n"); - return 0; - } + WCHAR chW; + WORD ctype; + char mbch[2]; + int n_chars; + int cp = MSVCRT_current_lc_all_cp; + + if (cp < 0) { + ERR("disregarding negative codepage: -%d\n", -cp); + cp = CP_ACP; + } + + if (ch < 256) { + mbch[0] = ch & 0xff; + n_chars = 1; + } else { + mbch[0] = (ch >> 8) & 0xff; + mbch[1] = ch & 0xff; + n_chars = 2; + } + MultiByteToWideChar(cp, 0, mbch, n_chars, &chW, 1); + GetStringTypeW(CT_CTYPE1, &chW, 1, &ctype); + return ((ctype & C1_DIGIT) != 0); +} + +/********************************************************************* + * _ismbcgraph(MSVCRT.@) + */ +int _ismbcgraph(unsigned int ch) +{ + WCHAR chW; + WORD ctype; + char mbch[2]; + int n_chars; + int cp = MSVCRT_current_lc_all_cp; + + if (cp < 0) { + ERR("disregarding negative codepage: -%d\n", -cp); + cp = CP_ACP; + } + + if (ch < 256) { + mbch[0] = ch & 0xff; + n_chars = 1; + } else { + mbch[0] = (ch >> 8) & 0xff; + mbch[1] = ch & 0xff; + n_chars = 2; + } + MultiByteToWideChar(cp, 0, mbch, n_chars, &chW, 1); + GetStringTypeW(CT_CTYPE1, &chW, 1, &ctype); + return ((ctype & (C1_UPPER | C1_LOWER | C1_DIGIT | C1_PUNCT | C1_ALPHA)) != 0); +} + +/********************************************************************* + * _ismbcalpha (MSVCRT.@) + */ +int _ismbcalpha(unsigned int ch) +{ + WCHAR chW; + WORD ctype; + char mbch[2]; + int n_chars; + int cp = MSVCRT_current_lc_all_cp; + + if (cp < 0) { + ERR("disregarding negative codepage: -%d\n", -cp); + cp = CP_ACP; + } + + if (ch < 256) { + mbch[0] = ch & 0xff; + n_chars = 1; + } else { + mbch[0] = (ch >> 8) & 0xff; + mbch[1] = ch & 0xff; + n_chars = 2; + } + MultiByteToWideChar(cp, 0, mbch, n_chars, &chW, 1); + GetStringTypeW(CT_CTYPE1, &chW, 1, &ctype); + return ((ctype & C1_ALPHA) != 0); +} + +/********************************************************************* + * _ismbclower (MSVCRT.@) + */ +int _ismbclower(unsigned int ch) +{ + WCHAR chW; + WORD ctype; + char mbch[2]; + int n_chars; + int cp = MSVCRT_current_lc_all_cp; + + if (cp < 0) { + ERR("disregarding negative codepage: -%d\n", -cp); + cp = CP_ACP; + } + + if (ch < 256) { + mbch[0] = ch & 0xff; + n_chars = 1; + } else { + mbch[0] = (ch >> 8) & 0xff; + mbch[1] = ch & 0xff; + n_chars = 2; + } + MultiByteToWideChar(cp, 0, mbch, n_chars, &chW, 1); + GetStringTypeW(CT_CTYPE1, &chW, 1, &ctype); + return ((ctype & C1_UPPER) != 0); +} + +/********************************************************************* + * _ismbcupper (MSVCRT.@) + */ +int _ismbcupper(unsigned int ch) +{ + WCHAR chW; + WORD ctype; + char mbch[2]; + int n_chars; + int cp = MSVCRT_current_lc_all_cp; + + if (cp < 0) { + ERR("disregarding negative codepage: -%d\n", -cp); + cp = CP_ACP; + } + + if (ch < 256) { + mbch[0] = ch & 0xff; + n_chars = 1; + } else { + mbch[0] = (ch >> 8) & 0xff; + mbch[1] = ch & 0xff; + n_chars = 2; + } + MultiByteToWideChar(cp, 0, mbch, n_chars, &chW, 1); + GetStringTypeW(CT_CTYPE1, &chW, 1, &ctype); + return ((ctype & C1_LOWER) != 0); +} + +/********************************************************************* + * _ismbcsymbol(MSVCRT.@) + */ +int _ismbcsymbol(unsigned int ch) +{ + WCHAR chW; + WORD ctype; + char mbch[2]; + int n_chars; + int cp = MSVCRT_current_lc_all_cp; + + if (cp < 0) { + ERR("disregarding negative codepage: -%d\n", -cp); + cp = CP_ACP; + } + + if (ch < 256) { + mbch[0] = ch & 0xff; + n_chars = 1; + } else { + mbch[0] = (ch >> 8) & 0xff; + mbch[1] = ch & 0xff; + n_chars = 2; + } + MultiByteToWideChar(cp, 0, mbch, n_chars, &chW, 1); + GetStringTypeW(CT_CTYPE3, &chW, 1, &ctype); + return ((ctype & C3_SYMBOL) != 0); +} + +/********************************************************************* + * _ismbcalnum (MSVCRT.@) + */ +int _ismbcalnum(unsigned int ch) +{ + WCHAR chW; + WORD ctype; + char mbch[2]; + int n_chars; + int cp = MSVCRT_current_lc_all_cp; + + if (cp < 0) { + ERR("disregarding negative codepage: -%d\n", -cp); + cp = CP_ACP; + } + + if (ch < 256) { + mbch[0] = ch & 0xff; + n_chars = 1; + } else { + mbch[0] = (ch >> 8) & 0xff; + mbch[1] = ch & 0xff; + n_chars = 2; + } + MultiByteToWideChar(cp, 0, mbch, n_chars, &chW, 1); + GetStringTypeW(CT_CTYPE1, &chW, 1, &ctype); + return ((ctype & (C1_ALPHA | C1_DIGIT)) != 0); } /********************************************************************* * _ismbcspace (MSVCRT.@) */ -int _ismbcspace(unsigned int c) +int _ismbcspace(unsigned int ch) { + WCHAR chW; + WORD ctype; + char mbch[2]; + int n_chars; + int cp = MSVCRT_current_lc_all_cp; + + if (cp < 0) { + ERR("disregarding negative codepage: -%d\n", -cp); + cp = CP_ACP; + } - if (c<0x100) - return isspace(c); - FIXME("%c\n",c); - return 0; + if (ch < 256) { + mbch[0] = ch & 0xff; + n_chars = 1; + } else { + mbch[0] = (ch >> 8) & 0xff; + mbch[1] = ch & 0xff; + n_chars = 2; + } + MultiByteToWideChar(cp, 0, mbch, n_chars, &chW, 1); + GetStringTypeW(CT_CTYPE1, &chW, 1, &ctype); + return ((ctype & C1_SPACE) != 0); } /********************************************************************* diff -ur -x CVS -x 'bigdif*' ../wine.test/dlls/msvcrt/msvcrt.spec ./dlls/msvcrt/msvcrt.spec --- ../wine.test/dlls/msvcrt/msvcrt.spec 2002-11-13 08:34:00.000000000 -0600 +++ ./dlls/msvcrt/msvcrt.spec 2002-11-16 20:20:24.000000000 -0600 @@ -291,22 +291,22 @@ @ stub _ismbbprint #(long) @ stub _ismbbpunct #(long) @ cdecl _ismbbtrail(long) _ismbbtrail -@ stub _ismbcalnum #(long) -@ stub _ismbcalpha #(long) +@ cdecl _ismbcalnum(long) _ismbcalnum +@ cdecl _ismbcalpha(long) _ismbcalpha @ cdecl _ismbcdigit(long) _ismbcdigit -@ stub _ismbcgraph #(long) +@ cdecl _ismbcgraph(long) _ismbcgraph @ cdecl _ismbchira(long) _ismbchira @ cdecl _ismbckata(long) _ismbckata @ stub _ismbcl0 #(long) @ stub _ismbcl1 #(long) @ stub _ismbcl2 #(long) @ stub _ismbclegal #(long) -@ stub _ismbclower #(long) +@ cdecl _ismbclower(long) _ismbclower @ stub _ismbcprint #(long) @ stub _ismbcpunct #(long) @ cdecl _ismbcspace(long) _ismbcspace -@ stub _ismbcsymbol #(long) -@ stub _ismbcupper #(long) +@ cdecl _ismbcsymbol(long) _ismbcsymbol +@ cdecl _ismbcupper(long) _ismbcupper @ cdecl _ismbslead(ptr ptr) _ismbslead @ cdecl _ismbstrail(ptr ptr) _ismbstrail @ cdecl _isnan( double ) _isnan