[KERNEL32] Apply Wine commit 80695cd by Akihiro Sagawa: Return correct buffer size...
[reactos.git] / reactos / dll / win32 / kernel32 / winnls / string / lcformat.c
index bf8b7ae..118f5e2 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-//#include "config.h"
-//#include "wine/port.h"
+#include <k32.h>
 
-#include <string.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "windef.h"
-#include "winbase.h"
-#include "wine/unicode.h"
-#include "wine/debug.h"
-#include "winternl.h"
+#define NDEBUG
+#include <debug.h>
+DEBUG_CHANNEL(nls);
 
 #define CRITICAL_SECTION RTL_CRITICAL_SECTION
 #define CRITICAL_SECTION_DEBUG RTL_CRITICAL_SECTION_DEBUG
 #define CALINFO_MAX_YEAR 2029
 
-#define HeapAlloc RtlAllocateHeap
-#define HeapReAlloc RtlReAllocateHeap
-#define HeapFree RtlFreeHeap
-
-WINE_DEFAULT_DEBUG_CHANNEL(nls);
-
 #define DATE_DATEVARSONLY 0x0100  /* only date stuff: yMdg */
 #define TIME_TIMEVARSONLY 0x0200  /* only time stuff: hHmst */
 
@@ -2098,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))
@@ -2107,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);
@@ -2152,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;