From 415da61549527c1cdcfe5d2b461e41b44274ea49 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Sun, 16 Nov 2008 12:15:55 +0000 Subject: [PATCH] - Implement GetCPInfo. Now this function passes all Wine tests svn path=/trunk/; revision=37387 --- reactos/dll/win32/kernel32/misc/lang.c | 59 ++++++++++++++++++-------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/reactos/dll/win32/kernel32/misc/lang.c b/reactos/dll/win32/kernel32/misc/lang.c index 6c8e3611e3b..7fdb3e9e158 100644 --- a/reactos/dll/win32/kernel32/misc/lang.c +++ b/reactos/dll/win32/kernel32/misc/lang.c @@ -1238,29 +1238,54 @@ GetCalendarInfoW( /* - * @unimplemented + * @implemented */ BOOL STDCALL -GetCPInfo ( - UINT CodePage, - LPCPINFO CodePageInfo - ) +GetCPInfo(UINT CodePage, + LPCPINFO CodePageInfo) { - unsigned i; + PCODEPAGE_ENTRY CodePageEntry; - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + if (!CodePageInfo) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } - CodePageInfo->MaxCharSize = 1; - CodePageInfo->DefaultChar[0] = '?'; - for (i = 1; i < MAX_DEFAULTCHAR; i++) - { - CodePageInfo->DefaultChar[i] = 0; - } - for (i = 0; i < MAX_LEADBYTES; i++) - { - CodePageInfo->LeadByte[i] = 0; - } + CodePageEntry = IntGetCodePageEntry(CodePage); + if (CodePageEntry == NULL) + { + switch(CodePage) + { + case CP_UTF7: + case CP_UTF8: + CodePageInfo->DefaultChar[0] = 0x3f; + CodePageInfo->DefaultChar[1] = 0; + CodePageInfo->LeadByte[0] = CodePageInfo->LeadByte[1] = 0; + CodePageInfo->MaxCharSize = (CodePage == CP_UTF7) ? 5 : 4; + return TRUE; + } + + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + + if (CodePageEntry->CodePageTable.DefaultChar & 0xff00) + { + CodePageInfo->DefaultChar[0] = (CodePageEntry->CodePageTable.DefaultChar & 0xff00) >> 8; + CodePageInfo->DefaultChar[1] = CodePageEntry->CodePageTable.DefaultChar & 0x00ff; + } + else + { + CodePageInfo->DefaultChar[0] = CodePageEntry->CodePageTable.DefaultChar & 0xff; + CodePageInfo->DefaultChar[1] = 0; + } + + if ((CodePageInfo->MaxCharSize = CodePageEntry->CodePageTable.MaximumCharacterSize) == 2) + memcpy(CodePageInfo->LeadByte, CodePageEntry->CodePageTable.LeadByte, sizeof(CodePageInfo->LeadByte)); + else + CodePageInfo->LeadByte[0] = CodePageInfo->LeadByte[1] = 0; return TRUE; }