Resend: implement _ismbcalpha, _ismbcalnum

Dmitry Timoshkov dmitry at baikal.ru
Sat Nov 16 03:52:27 CST 2002


"Greg Turner" <gmturner007 at ameritech.net> wrote:

> It seems pretty clear from the examples already implemented in this unit 
> that, regardless of the platform endianness, the low order byte will be 
> the trailing byte, and the high-order byte will be the leading byte.  
> MultiByteToWideChar (and _mbtowc, which might be more appropriate here?  
> More on this below...) would seem to expect the bytes in the following 
> order: [leading byte, trailing byte], regardless of the endianness of 
> the platform.  So, I think, I should #ifdef the byte-swapping based on 
> the endianness of the target platform (little-endian hosts byte-swap, 
> big-endian hosts don't).... does that sound right?

I think there is no need for #ifdef's.
Something like this should work:

int _ismbcalpha(unsigned int ch)
{
    char mbch[2];
    WCHAR chW;
    WORD ctype;
    int n_chars;

    if (ch < 256)
    {
        mbch[0] = ch & 0xff;
        n_chars = 1;
    }
    else /* multibyte character */
    {
        mbch[0] = (ch >> 8) & 0xff;
        mbch[1] = ch & 0xff;
        n_chars = 2;
    }
    MultiByteToWideChar(CP_ACP, 0, mbch, n_chars, &chW, 1);
    GetStringTypeW(CT_CTYPE1, &chW, 1, &ctype);
    return (ctype & C1_ALPHA) != 0;
}

> Another issue that I haven't quite figured out:  In this function, I'm 
> supposed to respect the current multibyte code page, as can be get/set 
> by the _{get,set}mbcp functions.  The proposed implementation above 
> uses the ANSI codepage, but are those the same thing?  To me, it seems 
> like they aren't but I haven't really looked into it, because I've been 
> focusing on the byte ordering issue so far.

Frankly speaking, I don't know.

-- 
Dmitry.






More information about the wine-devel mailing list