[KERNEL32] Apply Wine commit 80695cd by Akihiro Sagawa: Return correct buffer size...
[reactos.git] / reactos / dll / win32 / kernel32 / winnls / string / lcformat.c
index 3b2a6eb..118f5e2 100644 (file)
@@ -2084,7 +2084,7 @@ BOOL WINAPI EnumCalendarInfoExW( CALINFO_ENUMPROCEXW calinfoproc,LCID locale,
 int WINAPI GetCalendarInfoA(LCID lcid, CALID Calendar, CALTYPE CalType,
                            LPSTR lpCalData, int cchData, LPDWORD lpValue)
 {
-    int ret;
+    int ret, cchDataW = cchData;
     LPWSTR lpCalDataW = NULL;
 
     if (NLS_IsUnicodeOnlyLcid(lcid))
@@ -2093,13 +2093,14 @@ int WINAPI GetCalendarInfoA(LCID lcid, CALID Calendar, CALTYPE CalType,
       return 0;
     }
 
-    if (cchData &&
-        !(lpCalDataW = HeapAlloc(GetProcessHeap(), 0, cchData*sizeof(WCHAR))))
-      return 0;
+    if (!cchData && !(CalType & CAL_RETURN_NUMBER))
+        cchDataW = GetCalendarInfoW(lcid, Calendar, CalType, NULL, 0, NULL);
+    if (!(lpCalDataW = HeapAlloc(GetProcessHeap(), 0, cchDataW*sizeof(WCHAR))))
+        return 0;
 
-    ret = GetCalendarInfoW(lcid, Calendar, CalType, lpCalDataW, cchData, lpValue);
+    ret = GetCalendarInfoW(lcid, Calendar, CalType, lpCalDataW, cchDataW, lpValue);
     if(ret && lpCalDataW && lpCalData)
-      WideCharToMultiByte(CP_ACP, 0, lpCalDataW, cchData, lpCalData, cchData, NULL, NULL);
+        ret = WideCharToMultiByte(CP_ACP, 0, lpCalDataW, -1, lpCalData, cchData, NULL, NULL);
     else if (CalType & CAL_RETURN_NUMBER)
         ret *= sizeof(WCHAR);
     HeapFree(GetProcessHeap(), 0, lpCalDataW);
@@ -2138,11 +2139,14 @@ int WINAPI GetCalendarInfoW(LCID Locale, CALID Calendar, CALTYPE CalType,
      * for the CALTYPES not requiring GetLocaleInfoA */
     switch (CalType & ~(CAL_NOUSEROVERRIDE|CAL_RETURN_NUMBER|CAL_USE_CP_ACP)) {
        case CAL_ICALINTVALUE:
-            FIXME("Unimplemented caltype %d\n", CalType & 0xffff);
-           return 0;
+            if (CalType & CAL_RETURN_NUMBER)
+                return GetLocaleInfoW(Locale, LOCALE_RETURN_NUMBER | LOCALE_ICALENDARTYPE,
+                        (LPWSTR)lpValue, 2);
+            return GetLocaleInfoW(Locale, LOCALE_ICALENDARTYPE, lpCalData, cchData);
        case CAL_SCALNAME:
             FIXME("Unimplemented caltype %d\n", CalType & 0xffff);
-           return 0;
+            if (lpCalData) *lpCalData = 0;
+           return 1;
        case CAL_IYEAROFFSETRANGE:
             FIXME("Unimplemented caltype %d\n", CalType & 0xffff);
            return 0;