From ac90ba9bce75ca3da74913c0a683726cfabfa4bc Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 25 Jun 2002 00:24:36 +0000 Subject: [PATCH] Authors: Huw D M Davies , Aric Stewart Fixed nasty bug for 2+ byte multibyte strings and GetStringType. Fleshed out GetStringType CTYPE3 from the unicode tables. CP_SYMBOL is not a valid codepage while CP_UTF7|8 are. --- memory/codepage.c | 54 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/memory/codepage.c b/memory/codepage.c index 2ed3ebb209..fdfb03e39d 100644 --- a/memory/codepage.c +++ b/memory/codepage.c @@ -131,7 +131,15 @@ UINT WINAPI GetOEMCP(void) */ BOOL WINAPI IsValidCodePage( UINT codepage ) { - return cp_get_table( codepage ) != NULL; + switch(codepage) { + case CP_SYMBOL: + return FALSE; + case CP_UTF7: + case CP_UTF8: + return TRUE; + default: + return cp_get_table( codepage ) != NULL; + } } @@ -393,7 +401,42 @@ BOOL WINAPI GetStringTypeW( DWORD type, LPCWSTR src, INT count, LPWORD chartype while (count--) *chartype++ = get_char_typeW( *src++ ) >> 12; break; case CT_CTYPE3: - FIXME("CT_CTYPE3 not supported.\n"); + { + WARN("CT_CTYPE3: semi-stub.\n"); + while (count--) + { + int c = *src; + WORD type1, type3 = 0; /* C3_NOTAPPLICABLE */ + + type1 = get_char_typeW( *src++ ) & 0xfff; + /* try to construct type3 from type1 */ + if(type1 & C1_SPACE) type3 |= C3_SYMBOL; + if(type1 & C1_ALPHA) type3 |= C3_ALPHA; + if ((c>=0x30A0)&&(c<=0x30FF)) type3 |= C3_KATAKANA; + if ((c>=0x3040)&&(c<=0x309F)) type3 |= C3_HIRAGANA; + if ((c>=0x4E00)&&(c<=0x9FAF)) type3 |= C3_IDEOGRAPH; + if ((c>=0x0600)&&(c<=0x06FF)) type3 |= C3_KASHIDA; + if ((c>=0x3000)&&(c<=0x303F)) type3 |= C3_SYMBOL; + + if ((c>=0xFF00)&&(c<=0xFF60)) type3 |= C3_FULLWIDTH; + if ((c>=0xFF00)&&(c<=0xFF20)) type3 |= C3_SYMBOL; + if ((c>=0xFF3B)&&(c<=0xFF40)) type3 |= C3_SYMBOL; + if ((c>=0xFF5B)&&(c<=0xFF60)) type3 |= C3_SYMBOL; + if ((c>=0xFF21)&&(c<=0xFF3A)) type3 |= C3_ALPHA; + if ((c>=0xFF41)&&(c<=0xFF5A)) type3 |= C3_ALPHA; + if ((c>=0xFFE0)&&(c<=0xFFE6)) type3 |= C3_FULLWIDTH; + if ((c>=0xFFE0)&&(c<=0xFFE6)) type3 |= C3_SYMBOL; + + if ((c>=0xFF61)&&(c<=0xFFDC)) type3 |= C3_HALFWIDTH; + if ((c>=0xFF61)&&(c<=0xFF64)) type3 |= C3_SYMBOL; + if ((c>=0xFF65)&&(c<=0xFF9F)) type3 |= C3_KATAKANA; + if ((c>=0xFF65)&&(c<=0xFF9F)) type3 |= C3_ALPHA; + if ((c>=0xFFE8)&&(c<=0xFFEE)) type3 |= C3_HALFWIDTH; + if ((c>=0xFFE8)&&(c<=0xFFEE)) type3 |= C3_SYMBOL; + *chartype++ = type3; + } + break; + } default: SetLastError( ERROR_INVALID_PARAMETER ); return FALSE; @@ -437,7 +480,12 @@ BOOL WINAPI GetStringTypeA(LCID locale, DWORD type, LPCSTR src, INT count, LPWOR if((srcW = HeapAlloc(GetProcessHeap(), 0, countW * sizeof(WCHAR)))) { MultiByteToWideChar(cp, 0, src, count, srcW, countW); - ret = GetStringTypeW(type, srcW, count, chartype); + /* + * NOTE: the target buffer has 1 word for each CHARACTER in the source + * string, with multibyte characters there maybe be more bytes in count + * than character space in the buffer! + */ + ret = GetStringTypeW(type, srcW, countW, chartype); HeapFree(GetProcessHeap(), 0, srcW); } return ret;