Module: wine Branch: master Commit: fc26407e8eb5016627cd238f4ff562732d5aeb0c URL: https://source.winehq.org/git/wine.git/?a=commit;h=fc26407e8eb5016627cd238f4...
Author: Alexandre Julliard julliard@winehq.org Date: Wed May 4 08:55:45 2022 +0200
kernelbase: Reimplement GetDateFormatA().
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernel32/kernel32.spec | 2 +- dlls/kernel32/lcformat.c | 53 ----------------------------------------- dlls/kernelbase/kernelbase.spec | 2 +- dlls/kernelbase/locale.c | 29 ++++++++++++++++++++++ 4 files changed, 31 insertions(+), 55 deletions(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index ebe5559d615..bc292f62faa 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -640,7 +640,7 @@ @ stdcall -norelay GetCurrentThreadId() KERNEL32_GetCurrentThreadId @ stdcall -import GetCurrentThreadStackLimits(ptr ptr) @ stdcall -arch=x86_64 GetCurrentUmsThread() -@ stdcall GetDateFormatA(long long ptr str ptr long) +@ stdcall -import GetDateFormatA(long long ptr str ptr long) @ stdcall -import GetDateFormatEx(wstr long ptr wstr ptr long wstr) @ stdcall -import GetDateFormatW(long long ptr wstr ptr long) @ stdcall GetDaylightFlag() diff --git a/dlls/kernel32/lcformat.c b/dlls/kernel32/lcformat.c index 21d14328449..8cadaf42246 100644 --- a/dlls/kernel32/lcformat.c +++ b/dlls/kernel32/lcformat.c @@ -727,59 +727,6 @@ static INT NLS_GetDateTimeFormatA(LCID lcid, DWORD dwFlags, return iRet; }
-/****************************************************************************** - * GetDateFormatA [KERNEL32.@] - * - * Format a date for a given locale. - * - * PARAMS - * lcid [I] Locale to format for - * dwFlags [I] LOCALE_ and DATE_ flags from "winnls.h" - * lpTime [I] Date to format - * lpFormat [I] Format string, or NULL to use the system defaults - * lpDateStr [O] Destination for formatted string - * cchOut [I] Size of lpDateStr, or 0 to calculate the resulting size - * - * NOTES - * - If lpFormat is NULL, lpDateStr will be formatted according to the format - * details returned by GetLocaleInfoA() and modified by dwFlags. - * - lpFormat is a string of characters and formatting tokens. Any characters - * in the string are copied verbatim to lpDateStr, with tokens being replaced - * by the date values they represent. - * - The following tokens have special meanings in a date format string: - *| Token Meaning - *| ----- ------- - *| d Single digit day of the month (no leading 0) - *| dd Double digit day of the month - *| ddd Short name for the day of the week - *| dddd Long name for the day of the week - *| M Single digit month of the year (no leading 0) - *| MM Double digit month of the year - *| MMM Short name for the month of the year - *| MMMM Long name for the month of the year - *| y Double digit year number (no leading 0) - *| yy Double digit year number - *| yyyy Four digit year number - *| gg Era string, for example 'AD'. - * - To output any literal character that could be misidentified as a token, - * enclose it in single quotes. - * - The ANSI version of this function fails if lcid is Unicode only. - * - * RETURNS - * Success: The number of character written to lpDateStr, or that would - * have been written, if cchOut is 0. - * Failure: 0. Use GetLastError() to determine the cause. - */ -INT WINAPI GetDateFormatA( LCID lcid, DWORD dwFlags, const SYSTEMTIME* lpTime, - LPCSTR lpFormat, LPSTR lpDateStr, INT cchOut) -{ - TRACE("(0x%04lx,0x%08lx,%p,%s,%p,%d)\n",lcid, dwFlags, lpTime, - debugstr_a(lpFormat), lpDateStr, cchOut); - - return NLS_GetDateTimeFormatA(lcid, dwFlags | DATE_DATEVARSONLY, lpTime, - lpFormat, lpDateStr, cchOut); -} - /****************************************************************************** * GetTimeFormatA [KERNEL32.@] * diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 06744a79b1f..2ca7a036916 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -499,7 +499,7 @@ @ stdcall -norelay GetCurrentThread() kernelbase_GetCurrentThread @ stdcall -norelay GetCurrentThreadId() kernelbase_GetCurrentThreadId @ stdcall GetCurrentThreadStackLimits(ptr ptr) -@ stdcall GetDateFormatA(long long ptr str ptr long) kernel32.GetDateFormatA +@ stdcall GetDateFormatA(long long ptr str ptr long) @ stdcall GetDateFormatEx(wstr long ptr wstr ptr long wstr) @ stdcall GetDateFormatW(long long ptr wstr ptr long) @ stdcall GetDeviceDriverBaseNameA(ptr ptr long) diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c index 01ccd3cc6b6..4057c462b89 100644 --- a/dlls/kernelbase/locale.c +++ b/dlls/kernelbase/locale.c @@ -7158,6 +7158,35 @@ int WINAPI GetCurrencyFormatEx( const WCHAR *name, DWORD flags, const WCHAR *val }
+/****************************************************************************** + * GetDateFormatA (KERNEL32.@) + */ +int WINAPI GetDateFormatA( LCID lcid, DWORD flags, const SYSTEMTIME *time, + const char *format, char *buffer, int len ) +{ + UINT cp = get_lcid_codepage( lcid, flags ); + WCHAR formatW[128], output[128]; + int ret; + + TRACE( "(0x%04lx,0x%08lx,%p,%s,%p,%d)\n", lcid, flags, time, debugstr_a(format), buffer, len ); + + if (len < 0 || (len && !buffer)) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return 0; + } + if (format) + { + MultiByteToWideChar( cp, 0, format, -1, formatW, ARRAY_SIZE(formatW) ); + ret = GetDateFormatW( lcid, flags, time, formatW, output, ARRAY_SIZE(output) ); + } + else ret = GetDateFormatW( lcid, flags, time, NULL, output, ARRAY_SIZE(output) ); + + if (ret) ret = WideCharToMultiByte( cp, 0, output, -1, buffer, len, 0, 0 ); + return ret; +} + + /*********************************************************************** * GetDateFormatW (kernelbase.@) */