From 083b0beb0b0110e9251ff4f874c0a609eb103123 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 19 Nov 2002 00:52:38 +0000 Subject: [PATCH] Implemented some ismbc* functions (based on a patch by Greg Turner). --- dlls/msvcrt/mbcs.c | 115 +++++++++++++++++++++++++++++++++++----- dlls/msvcrt/msvcrt.spec | 16 +++--- 2 files changed, 111 insertions(+), 20 deletions(-) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 0db7552f655..f38ffaeca44 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -31,7 +31,7 @@ #include "msvcrt/string.h" #include "msvcrt/wctype.h" - +#include "wine/unicode.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(msvcrt); @@ -39,6 +39,28 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcrt); unsigned char MSVCRT_mbctype[257]; int MSVCRT___mb_cur_max = 1; +static WCHAR msvcrt_mbc_to_wc(unsigned int ch) +{ + WCHAR chW; + char mbch[2]; + int n_chars; + + if (ch <= 0xff) { + mbch[0] = ch; + n_chars = 1; + } else { + mbch[0] = (ch >> 8) & 0xff; + mbch[1] = ch & 0xff; + n_chars = 2; + } + if (!MultiByteToWideChar(MSVCRT_current_lc_all_cp, 0, mbch, n_chars, &chW, 1)) + { + WARN("MultiByteToWideChar failed on %x\n", ch); + return 0; + } + return chW; +} + /********************************************************************* * __p__mbctype (MSVCRT.@) */ @@ -553,25 +575,95 @@ int _ismbbkana(unsigned int c) */ int _ismbcdigit(unsigned int ch) { - if (ch <0x100) - return isdigit(ch); - else + WCHAR wch = msvcrt_mbc_to_wc( ch ); + return (get_char_typeW( wch ) & C1_DIGIT); +} + +/********************************************************************* + * _ismbcgraph(MSVCRT.@) + */ +int _ismbcgraph(unsigned int ch) +{ + WCHAR wch = msvcrt_mbc_to_wc( ch ); + return (get_char_typeW( wch ) & (C1_UPPER | C1_LOWER | C1_DIGIT | C1_PUNCT | C1_ALPHA)); +} + +/********************************************************************* + * _ismbcalpha (MSVCRT.@) + */ +int _ismbcalpha(unsigned int ch) +{ + WCHAR wch = msvcrt_mbc_to_wc( ch ); + return (get_char_typeW( wch ) & C1_ALPHA); +} + +/********************************************************************* + * _ismbclower (MSVCRT.@) + */ +int _ismbclower(unsigned int ch) +{ + WCHAR wch = msvcrt_mbc_to_wc( ch ); + return (get_char_typeW( wch ) & C1_UPPER); +} + +/********************************************************************* + * _ismbcupper (MSVCRT.@) + */ +int _ismbcupper(unsigned int ch) +{ + WCHAR wch = msvcrt_mbc_to_wc( ch ); + return (get_char_typeW( wch ) & C1_LOWER); +} + +/********************************************************************* + * _ismbcsymbol(MSVCRT.@) + */ +int _ismbcsymbol(unsigned int ch) +{ + WCHAR wch = msvcrt_mbc_to_wc( ch ); + WORD ctype; + if (!GetStringTypeW(CT_CTYPE3, &wch, 1, &ctype)) { - FIXME("Handle MBC chars\n"); - return 0; + WARN("GetStringTypeW failed on %x\n", ch); + return 0; } + return ((ctype & C3_SYMBOL) != 0); +} + +/********************************************************************* + * _ismbcalnum (MSVCRT.@) + */ +int _ismbcalnum(unsigned int ch) +{ + WCHAR wch = msvcrt_mbc_to_wc( ch ); + return (get_char_typeW( wch ) & (C1_ALPHA | C1_DIGIT)); } /********************************************************************* * _ismbcspace (MSVCRT.@) */ -int _ismbcspace(unsigned int c) +int _ismbcspace(unsigned int ch) { + WCHAR wch = msvcrt_mbc_to_wc( ch ); + return (get_char_typeW( wch ) & C1_SPACE); +} - if (c<0x100) - return isspace(c); - FIXME("%c\n",c); - return 0; +/********************************************************************* + * _ismbcprint (MSVCRT.@) + */ +int _ismbcprint(unsigned int ch) +{ + WCHAR wch = msvcrt_mbc_to_wc( ch ); + return (get_char_typeW( wch ) & (C1_UPPER | C1_LOWER | C1_DIGIT | C1_PUNCT | C1_ALPHA | C1_SPACE)); +} + +/********************************************************************* + * _ismbcpunct(MSVCRT.@) + */ +int _ismbcpunct(unsigned int ch) +{ + WCHAR wch = msvcrt_mbc_to_wc( ch ); + return (get_char_typeW( wch ) & C1_PUNCT); } /********************************************************************* @@ -938,4 +1030,3 @@ unsigned char* _mbspbrk(const unsigned char* str, const unsigned char* accept) } return NULL; } - diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 52764e0081b..fbf3810a449 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -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) -@ stub _ismbcprint #(long) -@ stub _ismbcpunct #(long) +@ cdecl _ismbclower(long) _ismbclower +@ cdecl _ismbcprint(long) _ismbcprint +@ cdecl _ismbcpunct(long) _ismbcpunct @ 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