mirror of
https://github.com/reactos/reactos.git
synced 2025-07-24 10:03:51 +00:00
remove duplicate stuff due to adding lcformat from wine
impl. misc stuff from wine svn path=/trunk/; revision=9891
This commit is contained in:
parent
def9bd7817
commit
add8be67c2
1 changed files with 114 additions and 516 deletions
|
@ -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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT : ReactOS user mode libraries
|
* PROJECT : ReactOS user mode libraries
|
||||||
|
@ -21,69 +21,57 @@
|
||||||
#define LOCALE_USE_CP_ACP 0x40000000
|
#define LOCALE_USE_CP_ACP 0x40000000
|
||||||
#define LOCALE_LOCALEINFOFLAGSMASK (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP|LOCALE_RETURN_NUMBER)
|
#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_
|
//#define _OLE2NLS_IN_BUILD_
|
||||||
|
|
||||||
/*
|
|
||||||
|
/******************************************************************************
|
||||||
* @implemented
|
* @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
|
LCID WINAPI ConvertDefaultLocale( LCID lcid )
|
||||||
STDCALL
|
|
||||||
ConvertDefaultLocale (
|
|
||||||
LCID Locale
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
switch(Locale)
|
LANGID langid;
|
||||||
|
|
||||||
|
switch (lcid)
|
||||||
{
|
{
|
||||||
case LOCALE_SYSTEM_DEFAULT:
|
case LOCALE_SYSTEM_DEFAULT:
|
||||||
return GetSystemDefaultLCID();
|
lcid = GetSystemDefaultLCID();
|
||||||
|
break;
|
||||||
case LOCALE_USER_DEFAULT:
|
case LOCALE_USER_DEFAULT:
|
||||||
return GetUserDefaultLCID();
|
case LOCALE_NEUTRAL:
|
||||||
|
lcid = GetUserDefaultLCID();
|
||||||
/*case LOCALE_NEUTRAL:
|
break;
|
||||||
return MAKELCID(LANG_NEUTRAL, SUBLANG_NEUTRAL);*/
|
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));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/* ported from wine, is that right? */
|
return lcid;
|
||||||
return MAKELANGID(PRIMARYLANGID(Locale), SUBLANG_NEUTRAL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @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
|
* @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
|
#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
|
* @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
|
* @unimplemented
|
||||||
|
@ -984,18 +797,13 @@ GetOEMCP (VOID)
|
||||||
#ifndef _OLE2NLS_IN_BUILD_
|
#ifndef _OLE2NLS_IN_BUILD_
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
LANGID
|
LANGID
|
||||||
STDCALL
|
STDCALL
|
||||||
GetSystemDefaultLangID (VOID)
|
GetSystemDefaultLangID (VOID)
|
||||||
{
|
{
|
||||||
/* FIXME: ??? */
|
return LANGIDFROMLCID(GetSystemDefaultLCID());
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
||||||
return MAKELANGID(
|
|
||||||
LANG_ENGLISH,
|
|
||||||
SUBLANG_ENGLISH_US
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1006,7 +814,11 @@ LCID
|
||||||
STDCALL
|
STDCALL
|
||||||
GetSystemDefaultLCID (VOID)
|
GetSystemDefaultLCID (VOID)
|
||||||
{
|
{
|
||||||
return SystemLocale;
|
LCID lcid;
|
||||||
|
NtQueryDefaultLocale( FALSE, &lcid );
|
||||||
|
return lcid;
|
||||||
|
|
||||||
|
// return SystemLocale;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1038,269 +850,7 @@ GetThreadLocale (VOID)
|
||||||
|
|
||||||
#endif
|
#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
|
BOOL STDCALL
|
||||||
STDCALL
|
IsValidLocale(
|
||||||
IsValidLocale (
|
LCID lcid,
|
||||||
LCID Locale,
|
DWORD flags
|
||||||
DWORD dwFlags
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
/* check if language is registered in the kernel32 resources */
|
||||||
return FALSE;
|
return FindResourceExW( hCurrentModule, (LPWSTR)RT_STRING,
|
||||||
|
(LPCWSTR)LOCALE_ILANGUAGE, LANGIDFROMLCID(lcid)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _OLE2NLS_IN_BUILD_
|
#ifndef _OLE2NLS_IN_BUILD_
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1507,18 +1076,47 @@ SetLocaleInfoW (
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/**********************************************************************
|
||||||
* @implemented
|
* @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
|
BOOL WINAPI SetThreadLocale( LCID lcid )
|
||||||
STDCALL
|
|
||||||
SetThreadLocale (
|
|
||||||
LCID Locale
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
/* FIXME - Check if locale is valid */
|
DPRINT("SetThreadLocale(0x%04lX)\n", lcid);
|
||||||
|
|
||||||
NtCurrentTeb()->CurrentLocale = Locale;
|
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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue