Alexandre Julliard : kernel32: Simplify Get/SetCalendarInfoA() implementation.

Alexandre Julliard julliard at winehq.org
Wed Apr 6 16:09:00 CDT 2022


Module: wine
Branch: master
Commit: 80445efa9048e885df0ad77ce1fa9825acfa7694
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=80445efa9048e885df0ad77ce1fa9825acfa7694

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Apr  6 10:16:41 2022 +0200

kernel32: Simplify Get/SetCalendarInfoA() implementation.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/lcformat.c | 32 --------------------------------
 dlls/kernel32/locale.c   | 42 +++++++++++++++++++++++++++++++++++-------
 2 files changed, 35 insertions(+), 39 deletions(-)

diff --git a/dlls/kernel32/lcformat.c b/dlls/kernel32/lcformat.c
index 2c53f5dfde9..e029f328544 100644
--- a/dlls/kernel32/lcformat.c
+++ b/dlls/kernel32/lcformat.c
@@ -1754,35 +1754,3 @@ int WINAPI GetCurrencyFormatEx(LPCWSTR localename, DWORD flags, LPCWSTR value,
 
     return GetCurrencyFormatW( LocaleNameToLCID(localename, 0), flags, value, format, str, len);
 }
-
-/*********************************************************************
- *            GetCalendarInfoA (KERNEL32.@)
- */
-int WINAPI GetCalendarInfoA( LCID lcid, CALID id, CALTYPE type, LPSTR data, int size, DWORD *val )
-{
-    int ret, sizeW = size;
-    LPWSTR dataW = NULL;
-
-    if (type & CAL_RETURN_NUMBER)
-        return GetCalendarInfoW( lcid, id, type, (WCHAR *)data, size, val ) * sizeof(WCHAR);
-
-    if (!size) sizeW = GetCalendarInfoW( lcid, id, type, NULL, 0, NULL );
-    if (!(dataW = HeapAlloc(GetProcessHeap(), 0, sizeW * sizeof(WCHAR)))) return 0;
-
-    ret = GetCalendarInfoW( lcid, id, type, dataW, sizeW, val );
-    if(ret && dataW && data)
-        ret = WideCharToMultiByte( CP_ACP, 0, dataW, -1, data, size, NULL, NULL );
-    else if (type & CAL_RETURN_NUMBER)
-        ret *= sizeof(WCHAR);
-    HeapFree( GetProcessHeap(), 0, dataW );
-    return ret;
-}
-
-/*********************************************************************
- *            SetCalendarInfoA (KERNEL32.@)
- */
-int WINAPI SetCalendarInfoA( LCID lcid, CALID id, CALTYPE type, LPCSTR data)
-{
-    FIXME("(%08lx,%08lx,%08lx,%s): stub\n", lcid, id, type, debugstr_a(data));
-    return 0;
-}
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index 4c815be43cc..d46a2aa1580 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -63,11 +63,13 @@ extern BOOL WINAPI Internal_EnumUILanguages( UILANGUAGE_ENUMPROCW proc, DWORD fl
  *
  * Retrieve the ANSI codepage for a given locale.
  */
-static inline UINT get_lcid_codepage( LCID lcid )
+static UINT get_lcid_codepage( LCID lcid, UINT flags )
 {
-    UINT ret;
-    if (!GetLocaleInfoW( lcid, LOCALE_IDEFAULTANSICODEPAGE|LOCALE_RETURN_NUMBER, (WCHAR *)&ret,
-                         sizeof(ret)/sizeof(WCHAR) )) ret = 0;
+    UINT ret = 0;
+
+    if (flags & LOCALE_USE_CP_ACP) return CP_ACP;
+    GetLocaleInfoW( lcid, LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
+                    (WCHAR *)&ret, sizeof(ret)/sizeof(WCHAR) );
     return ret;
 }
 
@@ -98,13 +100,11 @@ static inline UINT get_lcid_codepage( LCID lcid )
  */
 BOOL WINAPI SetLocaleInfoA(LCID lcid, LCTYPE lctype, LPCSTR data)
 {
-    UINT codepage = CP_ACP;
+    UINT codepage = get_lcid_codepage( lcid, lctype );
     WCHAR *strW;
     DWORD len;
     BOOL ret;
 
-    if (!(lctype & LOCALE_USE_CP_ACP)) codepage = get_lcid_codepage( lcid );
-
     if (!data)
     {
         SetLastError( ERROR_INVALID_PARAMETER );
@@ -376,6 +376,34 @@ BOOL WINAPI EnumUILanguagesA( UILANGUAGE_ENUMPROCA proc, DWORD flags, LONG_PTR p
 }
 
 
+/*********************************************************************
+ *            GetCalendarInfoA (KERNEL32.@)
+ */
+int WINAPI GetCalendarInfoA( LCID lcid, CALID id, CALTYPE type, LPSTR data, int data_len, DWORD *val )
+{
+    WCHAR buffer[256];
+
+    if (type & CAL_RETURN_NUMBER)
+        return GetCalendarInfoW( lcid, id, type, (WCHAR *)data, data_len, val ) * sizeof(WCHAR);
+
+    if (!GetCalendarInfoW( lcid, id, type, buffer, ARRAY_SIZE(buffer), val )) return 0;
+    return WideCharToMultiByte( get_lcid_codepage(lcid, type), 0, buffer, -1, data, data_len, NULL, NULL );
+}
+
+
+/*********************************************************************
+ *            SetCalendarInfoA (KERNEL32.@)
+ */
+int WINAPI SetCalendarInfoA( LCID lcid, CALID id, CALTYPE type, LPCSTR data )
+{
+    WCHAR buffer[256];
+
+    if (!MultiByteToWideChar( get_lcid_codepage(lcid, type), 0, data, -1, buffer, ARRAY_SIZE(buffer) ))
+        return 0;
+    return SetCalendarInfoW( lcid, id, type, buffer );
+}
+
+
 /******************************************************************************
  *           GetGeoInfoA (KERNEL32.@)
  */




More information about the wine-cvs mailing list