From add8be67c259a16ecfcb968075b8dd63af0a8803 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sat, 26 Jun 2004 20:10:50 +0000 Subject: [PATCH] remove duplicate stuff due to adding lcformat from wine impl. misc stuff from wine svn path=/trunk/; revision=9891 --- reactos/lib/kernel32/misc/lang.c | 630 ++++++------------------------- 1 file changed, 114 insertions(+), 516 deletions(-) diff --git a/reactos/lib/kernel32/misc/lang.c b/reactos/lib/kernel32/misc/lang.c index a72031093db..edd70e49f87 100644 --- a/reactos/lib/kernel32/misc/lang.c +++ b/reactos/lib/kernel32/misc/lang.c @@ -1,4 +1,4 @@ -/* $Id: lang.c,v 1.19 2004/06/13 20:04:56 navaraf Exp $ +/* $Id: lang.c,v 1.20 2004/06/26 20:10:50 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries @@ -21,69 +21,57 @@ #define LOCALE_USE_CP_ACP 0x40000000 #define LOCALE_LOCALEINFOFLAGSMASK (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP|LOCALE_RETURN_NUMBER) -static LCID SystemLocale = MAKELCID(LANG_ENGLISH, SORT_DEFAULT); +//static LCID SystemLocale = MAKELCID(LANG_ENGLISH, SORT_DEFAULT); //#define _OLE2NLS_IN_BUILD_ -/* + +/****************************************************************************** * @implemented + * RIPPED FROM WINE's dlls\kernel\locale.c rev 1.42 + * + * ConvertDefaultLocale (KERNEL32.@) + * + * Convert a default locale identifier into a real identifier. + * + * PARAMS + * lcid [I] LCID identifier of the locale to convert + * + * RETURNS + * lcid unchanged, if not a default locale or its sublanguage is + * not SUBLANG_NEUTRAL. + * GetSystemDefaultLCID(), if lcid == LOCALE_SYSTEM_DEFAULT. + * GetUserDefaultLCID(), if lcid == LOCALE_USER_DEFAULT or LOCALE_NEUTRAL. + * Otherwise, lcid with sublanguage changed to SUBLANG_DEFAULT. */ -LCID -STDCALL -ConvertDefaultLocale ( - LCID Locale - ) +LCID WINAPI ConvertDefaultLocale( LCID lcid ) { - switch(Locale) - { + LANGID langid; + + switch (lcid) + { case LOCALE_SYSTEM_DEFAULT: - return GetSystemDefaultLCID(); - + lcid = GetSystemDefaultLCID(); + break; case LOCALE_USER_DEFAULT: - return GetUserDefaultLCID(); - - /*case LOCALE_NEUTRAL: - return MAKELCID(LANG_NEUTRAL, SUBLANG_NEUTRAL);*/ - } - - /* ported from wine, is that right? */ - return MAKELANGID(PRIMARYLANGID(Locale), SUBLANG_NEUTRAL); + case LOCALE_NEUTRAL: + lcid = GetUserDefaultLCID(); + break; + default: + /* Replace SUBLANG_NEUTRAL with SUBLANG_DEFAULT */ + langid = LANGIDFROMLCID(lcid); + if (SUBLANGID(langid) == SUBLANG_NEUTRAL) + { + langid = MAKELANGID(PRIMARYLANGID(langid), SUBLANG_DEFAULT); + lcid = MAKELCID(langid, SORTIDFROMLCID(lcid)); + } + } + return lcid; } -/* - * @unimplemented - */ -BOOL -STDCALL -EnumCalendarInfoW ( - CALINFO_ENUMPROCW lpCalInfoEnumProc, - LCID Locale, - CALID Calendar, - CALTYPE CalType - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} -/* - * @unimplemented - */ -BOOL -STDCALL -EnumCalendarInfoA ( - CALINFO_ENUMPROCA lpCalInfoEnumProc, - LCID Locale, - CALID Calendar, - CALTYPE CalType - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - /* * @unimplemented @@ -117,36 +105,6 @@ EnumCalendarInfoExW( } -/* - * @unimplemented - */ -BOOL -STDCALL -EnumDateFormatsW ( - DATEFMT_ENUMPROCW lpDateFmtEnumProc, - LCID Locale, - DWORD dwFlags - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/* - * @unimplemented - */ -BOOL -STDCALL -EnumDateFormatsA ( - DATEFMT_ENUMPROCA lpDateFmtEnumProc, - LCID Locale, - DWORD dwFlags - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} /* @@ -327,36 +285,6 @@ EnumSystemLocalesA ( #endif -/* - * @unimplemented - */ -BOOL -STDCALL -EnumTimeFormatsW ( - TIMEFMT_ENUMPROCW lpTimeFmtEnumProc, - LCID Locale, - DWORD dwFlags - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/* - * @unimplemented - */ -BOOL -STDCALL -EnumTimeFormatsA ( - TIMEFMT_ENUMPROCA lpTimeFmtEnumProc, - LCID Locale, - DWORD dwFlags - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} /* @@ -504,86 +432,6 @@ GetCPInfoExA( } -/* - * @unimplemented - */ -int -STDCALL -GetCurrencyFormatW ( - LCID Locale, - DWORD dwFlags, - LPCWSTR lpValue, - CONST CURRENCYFMTW * lpFormat, - LPWSTR lpCurrencyStr, - int cchCurrency - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -/* - * @unimplemented - */ -int -STDCALL -GetCurrencyFormatA ( - LCID Locale, - DWORD dwFlags, - LPCSTR lpValue, - CONST CURRENCYFMTA * lpFormat, - LPSTR lpCurrencyStr, - int cchCurrency - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -#ifndef _OLE2NLS_IN_BUILD_ - -/* - * @unimplemented - */ -int -STDCALL -GetDateFormatW ( - LCID Locale, - DWORD dwFlags, - CONST SYSTEMTIME * lpDate, - LPCWSTR lpFormat, - LPWSTR lpDateStr, - int cchDate - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -/* - * @unimplemented - */ -int -STDCALL -GetDateFormatA ( - LCID Locale, - DWORD dwFlags, - CONST SYSTEMTIME * lpDate, - LPCSTR lpFormat, - LPSTR lpDateStr, - int cchDate - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -#endif - - /* * @unimplemented */ @@ -931,43 +779,8 @@ INT STDCALL GetLocaleInfoA( LCID lcid, LCTYPE lctype, LPSTR buffer, INT len ) } -/* - * @unimplemented - */ -int -STDCALL -GetNumberFormatW ( - LCID Locale, - DWORD dwFlags, - LPCWSTR lpValue, - CONST NUMBERFMTW * lpFormat, - LPWSTR lpNumberStr, - int cchNumber - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} -/* - * @unimplemented - */ -int -STDCALL -GetNumberFormatA ( - LCID Locale, - DWORD dwFlags, - LPCSTR lpValue, - CONST NUMBERFMTA * lpFormat, - LPSTR lpNumberStr, - int cchNumber - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented @@ -984,18 +797,13 @@ GetOEMCP (VOID) #ifndef _OLE2NLS_IN_BUILD_ /* - * @unimplemented + * @implemented */ LANGID STDCALL GetSystemDefaultLangID (VOID) { - /* FIXME: ??? */ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return MAKELANGID( - LANG_ENGLISH, - SUBLANG_ENGLISH_US - ); + return LANGIDFROMLCID(GetSystemDefaultLCID()); } @@ -1006,7 +814,11 @@ LCID STDCALL GetSystemDefaultLCID (VOID) { - return SystemLocale; + LCID lcid; + NtQueryDefaultLocale( FALSE, &lcid ); + return lcid; + +// return SystemLocale; } #endif @@ -1038,269 +850,7 @@ GetThreadLocale (VOID) #endif -INT RosGetTimeFormat(LCID Locale, DWORD dwFlags, CONST SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpTimeStr, int cchTime) -{ - INT nPos = 0, nLastFormatPos = 0; - BOOL bDrop = FALSE; - while( *lpFormat ) - { - if (*lpFormat == L'\'') - { - lpFormat++; - - while(*lpFormat) - { - if (*lpFormat == L'\'') - { - lpFormat++; - if(*lpFormat != L'\'') - break; - } - if (!cchTime) - nPos++; - else if(nPos > cchTime) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return 0; - } - else - { - if(!bDrop) - { - lpTimeStr[nPos] = *lpFormat; - nPos++; - } - } - *lpFormat++; - } - } - else if(*lpFormat==L'H' || *lpFormat==L'h' || *lpFormat==L'm' || *lpFormat==L's' || *lpFormat==L't' ) - { - int nCount, nBufLen; - WCHAR nType = *lpFormat; - WCHAR Buffer[40]; - - bDrop = FALSE; - - Buffer[0] = 0; - - for(nCount = 1; *lpFormat == nType; lpFormat++) - nCount++; - - switch(nType) - { - case L'h': - { - if(!(dwFlags & TIME_FORCE24HOURFORMAT)) - { - swprintf( Buffer, L"%.*d", nCount > 2 ? 2 : nCount, - lpTime->wHour == 0 ? 12 : (lpTime->wHour - 1) % 12 + 1); - break; - } - } - case L'H': - { - swprintf( Buffer, L"%.*d", nCount > 2 ? 2 : nCount, lpTime->wHour ); - break; - } - case L'm': - { - if(!(dwFlags & TIME_NOMINUTESORSECONDS)) - { - swprintf( Buffer, L"%.*d", nCount > 2 ? 2 : nCount, lpTime->wMinute ); - } - else - nPos = nLastFormatPos; - - break; - } - case L's': - { - if(!(dwFlags & (TIME_NOSECONDS|TIME_NOMINUTESORSECONDS))) - { - swprintf( Buffer, L"%.*d", nCount > 2 ? 2 : nCount, lpTime->wSecond ); - } - else - nPos = nLastFormatPos; - - break; - } - case L't': - { - if(!(dwFlags & TIME_NOTIMEMARKER)) - { - GetLocaleInfoW(Locale, (lpTime->wHour < 12) ? LOCALE_S1159 : LOCALE_S2359, Buffer, sizeof(Buffer) ); - if(nCount == 1) - Buffer[1] = 0; - } - else - { - nPos = nLastFormatPos; - bDrop = TRUE; - } - break; - } - } - nBufLen = wcslen(Buffer); - - if(!cchTime) - { - /* wine does nothing here?!? */ - } - else if(nPos + nBufLen < cchTime) - wcscpy( lpTimeStr + nPos, Buffer ); - else - { - lstrcpynW( lpTimeStr + nPos, Buffer, cchTime - nPos ); - - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return 0; - } - nPos += nBufLen; - nLastFormatPos = nPos; - } - else - { - if(!cchTime) - nPos++; - else if(nPos > cchTime) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return 0; - } - else - { - if(!bDrop) - { - lpTimeStr[nPos] = *lpFormat; - nPos++; - } - } - lpFormat++; - } - } - - /* Are we not only counting? */ - if (cchTime) - { - if (nPos >= cchTime) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return 0; - } - else - lpTimeStr[nPos] = L'\0'; - } - - nPos++; - return nPos; -} - -/* - * @implemented - */ -INT -STDCALL -GetTimeFormatW ( - LCID Locale, - DWORD dwFlags, - CONST SYSTEMTIME* lpTime, - LPCWSTR lpFormat, - LPWSTR lpTimeStr, - int cchTime - ) -{ - WCHAR Buffer[40]; - SYSTEMTIME t; - - if (!Locale) - Locale = LOCALE_SYSTEM_DEFAULT; - - Locale = ConvertDefaultLocale( Locale ); - - if (lpFormat == NULL) - { - if (dwFlags & LOCALE_NOUSEROVERRIDE) - Locale = GetSystemDefaultLCID(); - - if (!GetLocaleInfoW(Locale, LOCALE_STIMEFORMAT, Buffer, 40)) - return 0; - - lpFormat = Buffer; - } - if (dwFlags & LOCALE_NOUSEROVERRIDE) - { - SetLastError(ERROR_INVALID_FLAGS); - return 0; - } - if (lpTime == NULL) - { - GetLocalTime(&t); - lpTime = &t; - } - if((lpTime->wHour > 24) || (lpTime->wMinute >= 60) || (lpTime->wSecond >= 60)) - { - SetLastError(ERROR_INVALID_PARAMETER); - return 0; - } - return RosGetTimeFormat(Locale, dwFlags, lpTime, lpFormat, lpTimeStr, cchTime); -} - - -/* - * @implemented - */ -int -STDCALL -GetTimeFormatA ( - LCID Locale, - DWORD dwFlags, - CONST SYSTEMTIME* lpTime, - LPCSTR lpFormat, - LPSTR lpTimeStr, - int cchTime - ) -{ - LPWSTR lpFormatU = NULL; - LPWSTR lpTimeStrU; - int numCharsU; - int retVal = 0; - - if (lpFormat != NULL) { - /* First just determine the number of necessary bytes - for the unicode string */ - int numBytes = MultiByteToWideChar(CP_ACP, 0, lpFormat, -1, NULL, 0); - - if (numBytes > 0) { - lpFormatU = HeapAlloc(GetProcessHeap(), 0, numBytes); - - if (lpFormatU != NULL) - MultiByteToWideChar(CP_ACP, 0, lpFormat, -1, lpFormatU, numBytes); - } - } - - /* Just get the number of characters needed to store the - Unicode output */ - numCharsU = GetTimeFormatW(Locale, dwFlags, lpTime, lpFormatU, NULL, 0); - - if (numCharsU != 0) { - lpTimeStrU = HeapAlloc(GetProcessHeap(), 0, numCharsU*sizeof(WCHAR)); - - if (lpTimeStrU != NULL) { - if (GetTimeFormatW(Locale, dwFlags, lpTime, lpFormatU, lpTimeStrU, numCharsU)) - /* Convert the output string to ANSI */ - retVal = WideCharToMultiByte(CP_ACP, 0, lpTimeStrU, numCharsU, lpTimeStr, cchTime, NULL, NULL); - - HeapFree(GetProcessHeap(), 0, lpTimeStrU); - } - } - - if (lpFormatU != NULL) - HeapFree(GetProcessHeap(), 0, lpFormatU); - - return retVal; -} @@ -1385,21 +935,40 @@ IsValidLanguageGroup( } -/* - * @unimplemented + +/****************************************************************************** + * @implemented + * RIPPED FROM WINE's dlls\kernel\locale.c rev 1.44 + * + * IsValidLocale (KERNEL32.@) + * + * Determine if a locale is valid. + * + * PARAMS + * lcid [I] LCID of the locale to check + * flags [I] LCID_SUPPORTED = Valid, LCID_INSTALLED = Valid and installed on the system + * + * RETURN + * TRUE, if lcid is valid, + * FALSE, otherwise. + * + * NOTES + * Wine does not currently make the distinction between supported and installed. All + * languages supported are installed by default. */ -BOOL -STDCALL -IsValidLocale ( - LCID Locale, - DWORD dwFlags - ) +BOOL STDCALL +IsValidLocale( + LCID lcid, + DWORD flags + ) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + /* check if language is registered in the kernel32 resources */ + return FindResourceExW( hCurrentModule, (LPWSTR)RT_STRING, + (LPCWSTR)LOCALE_ILANGUAGE, LANGIDFROMLCID(lcid)) != 0; } + #ifndef _OLE2NLS_IN_BUILD_ /* @@ -1507,19 +1076,48 @@ SetLocaleInfoW ( } -/* +/********************************************************************** * @implemented + * RIPPED FROM WINE's dlls\kernel\locale.c rev 1.42 + * + * SetThreadLocale (KERNEL32.@) + * + * Set the current threads locale. + * + * PARAMS + * lcid [I] LCID of the locale to set + * + * RETURNS + * Success: TRUE. The threads locale is set to lcid. + * Failure: FALSE. Use GetLastError() to determine the cause. + * */ -BOOL -STDCALL -SetThreadLocale ( - LCID Locale - ) +BOOL WINAPI SetThreadLocale( LCID lcid ) { - /* FIXME - Check if locale is valid */ - - NtCurrentTeb()->CurrentLocale = Locale; - return TRUE; + DPRINT("SetThreadLocale(0x%04lX)\n", lcid); + + lcid = ConvertDefaultLocale(lcid); + + if (lcid != GetThreadLocale()) + { + if (!IsValidLocale(lcid, LCID_SUPPORTED)) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + NtCurrentTeb()->CurrentLocale = lcid; + /* FIXME: NtCurrentTeb()->code_page = get_lcid_codepage( lcid ); + * Wine save the acp for easy/fast access, but ROS has no such Teb member. + * Maybe add this member to ros as well? + */ + + /* + Lag test app for å se om locale etc, endres i en app. etter at prosessen er + startet, eller om bare nye prosesser blir berørt. + */ + } + return TRUE; } #endif