Reimplement EnumDateFormats, make it work for all available locales

Dmitry Timoshkov dmitry at baikal.ru
Wed Jul 27 03:09:53 CDT 2005


Hello,

Changelog:
    Dmitry Timoshkov <dmitry at codeweavers.com>
    - Reimplement EnumDateFormats, make it work for all available locales.
    - Add a test for EnumDateFormats

diff -up cvs/hq/wine/dlls/kernel/lcformat.c wine/dlls/kernel/lcformat.c
--- cvs/hq/wine/dlls/kernel/lcformat.c	2005-06-21 16:39:58.000000000 +0900
+++ wine/dlls/kernel/lcformat.c	2005-07-27 16:56:15.000000000 +0900
@@ -5,6 +5,7 @@
  * Copyright 1998 David Lee Lambert
  * Copyright 2000 Julio César Gázquez
  * Copyright 2003 Jon Griffiths
+ * Copyright 2005 Dmitry Timoshkov
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1603,276 +1604,83 @@ BOOL WINAPI EnumDateFormatsExW( DATEFMT_
 
 /**************************************************************************
  *              EnumDateFormatsA	(KERNEL32.@)
+ *
+ * FIXME: MSDN mentions only LOCALE_USE_CP_ACP, should we handle
+ * LOCALE_NOUSEROVERRIDE here as well?
  */
-BOOL WINAPI EnumDateFormatsA( DATEFMT_ENUMPROCA lpDateFmtEnumProc, LCID Locale,  DWORD dwFlags)
+BOOL WINAPI EnumDateFormatsA(DATEFMT_ENUMPROCA proc, LCID lcid, DWORD flags)
 {
-  LCID Loc = GetUserDefaultLCID();
-  if(!lpDateFmtEnumProc)
-    {
-      SetLastError(ERROR_INVALID_PARAMETER);
-      return FALSE;
-    }
-
-  switch( Loc )
- {
-
-   case 0x00000407:  /* (Loc,"de_DE") */
-   {
-    switch(dwFlags)
-    {
-      case DATE_SHORTDATE:
-	if(!(*lpDateFmtEnumProc)("dd.MM.yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("d.M.yyyy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("d.MM.yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("d.M.yy")) return TRUE;
-	return TRUE;
-      case DATE_LONGDATE:
-        if(!(*lpDateFmtEnumProc)("dddd,d. MMMM yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("d. MMMM yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("d. MMM yyyy")) return TRUE;
-	return TRUE;
-      default:
-	FIXME("Unknown date format (%ld)\n", dwFlags);
-	SetLastError(ERROR_INVALID_PARAMETER);
-	return FALSE;
-     }
-   }
+    char buf[256];
 
-   case 0x0000040c:  /* (Loc,"fr_FR") */
-   {
-    switch(dwFlags)
+    if (!proc)
     {
-      case DATE_SHORTDATE:
-	if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("dd.MM.yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("dd-MM-yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("dd/MM/yyyy")) return TRUE;
-	return TRUE;
-      case DATE_LONGDATE:
-        if(!(*lpDateFmtEnumProc)("dddd d MMMM yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("d MMM yy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("d MMMM yyyy")) return TRUE;
-	return TRUE;
-      default:
-	FIXME("Unknown date format (%ld)\n", dwFlags);
-	SetLastError(ERROR_INVALID_PARAMETER);
-	return FALSE;
-     }
-   }
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
 
-   case 0x00000c0c:  /* (Loc,"fr_CA") */
-   {
-    switch(dwFlags)
+    switch (flags & ~LOCALE_USE_CP_ACP)
     {
-      case DATE_SHORTDATE:
-	if(!(*lpDateFmtEnumProc)("yy-MM-dd")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("dd-MM-yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("yy MM dd")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE;
-	return TRUE;
-      case DATE_LONGDATE:
-        if(!(*lpDateFmtEnumProc)("d MMMM, yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("d MMM yyyy")) return TRUE;
-	return TRUE;
-      default:
-	FIXME("Unknown date format (%ld)\n", dwFlags);
-	SetLastError(ERROR_INVALID_PARAMETER);
-	return FALSE;
-     }
-   }
+    case 0:
+    case DATE_SHORTDATE:
+        if (GetLocaleInfoA(lcid, LOCALE_SSHORTDATE | (flags & LOCALE_USE_CP_ACP), buf, 256))
+            proc(buf);
+        break;
 
-   case 0x00000809:  /* (Loc,"en_UK") */
-  {
-   switch(dwFlags)
-    {
-      case DATE_SHORTDATE:
-	if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("dd/MM/yyyy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("d/M/yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("d.M.yy")) return TRUE;
-	return TRUE;
-      case DATE_LONGDATE:
-        if(!(*lpDateFmtEnumProc)("dd MMMM yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("d MMMM yyyy")) return TRUE;
-	return TRUE;
-      default:
-	FIXME("Unknown date format (%ld)\n", dwFlags);
-	SetLastError(ERROR_INVALID_PARAMETER);
-	return FALSE;
-    }
-  }
+    case DATE_LONGDATE:
+        if (GetLocaleInfoA(lcid, LOCALE_SLONGDATE | (flags & LOCALE_USE_CP_ACP), buf, 256))
+            proc(buf);
+        break;
 
-   case 0x00000c09:  /* (Loc,"en_AU") */
-  {
-   switch(dwFlags)
-    {
-      case DATE_SHORTDATE:
-	if(!(*lpDateFmtEnumProc)("d/MM/yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("d/M/yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE;
-	return TRUE;
-      case DATE_LONGDATE:
-        if(!(*lpDateFmtEnumProc)("dddd,d MMMM yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("d MMMM yyyy")) return TRUE;
-	return TRUE;
-      default:
-	FIXME("Unknown date format (%ld)\n", dwFlags);
-	SetLastError(ERROR_INVALID_PARAMETER);
-	return FALSE;
-    }
-  }
+    case DATE_YEARMONTH:
+        if (GetLocaleInfoA(lcid, LOCALE_SYEARMONTH | (flags & LOCALE_USE_CP_ACP), buf, 256))
+            proc(buf);
+        break;
 
-   case 0x00001009:  /* (Loc,"en_CA") */
-  {
-   switch(dwFlags)
-    {
-      case DATE_SHORTDATE:
-	if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("d/M/yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("yy-MM-dd")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("M/dd/yy")) return TRUE;
-	return TRUE;
-      case DATE_LONGDATE:
-        if(!(*lpDateFmtEnumProc)("d-MMM-yy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("MMMM d, yyyy")) return TRUE;
-	return TRUE;
-      default:
-	FIXME("Unknown date format (%ld)\n", dwFlags);
-	SetLastError(ERROR_INVALID_PARAMETER);
-	return FALSE;
+    default:
+        FIXME("Unknown date format (%ld)\n", flags);
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
     }
-  }
+    return TRUE;
+}
 
-   case 0x00001409:  /* (Loc,"en_NZ") */
-  {
-   switch(dwFlags)
-    {
-      case DATE_SHORTDATE:
-	if(!(*lpDateFmtEnumProc)("d/MM/yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("d.MM.yy")) return TRUE;
-	return TRUE;
-      case DATE_LONGDATE:
-        if(!(*lpDateFmtEnumProc)("d MMMM yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("dddd, d MMMM yyyy")) return TRUE;
-	return TRUE;
-      default:
-	FIXME("Unknown date format (%ld)\n", dwFlags);
-	SetLastError(ERROR_INVALID_PARAMETER);
-	return FALSE;
-    }
-  }
+/**************************************************************************
+ *              EnumDateFormatsW	(KERNEL32.@)
+ */
+BOOL WINAPI EnumDateFormatsW(DATEFMT_ENUMPROCW proc, LCID lcid, DWORD flags)
+{
+    WCHAR buf[256];
 
-   case 0x00001809:  /* (Loc,"en_IE") */
-  {
-   switch(dwFlags)
+    if (!proc)
     {
-      case DATE_SHORTDATE:
-	if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("d/M/yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("d.M.yy")) return TRUE;
-	return TRUE;
-      case DATE_LONGDATE:
-        if(!(*lpDateFmtEnumProc)("dd MMMM yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("d MMMM yyyy")) return TRUE;
-	return TRUE;
-      default:
-	FIXME("Unknown date format (%ld)\n", dwFlags);
-	SetLastError(ERROR_INVALID_PARAMETER);
-	return FALSE;
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
     }
-  }
 
-   case 0x00001c09:  /* (Loc,"en_ZA") */
-  {
-   switch(dwFlags)
+    switch (flags & ~LOCALE_USE_CP_ACP)
     {
-      case DATE_SHORTDATE:
-	if(!(*lpDateFmtEnumProc)("yy/MM/dd")) return TRUE;
-	return TRUE;
-      case DATE_LONGDATE:
-        if(!(*lpDateFmtEnumProc)("dd MMMM yyyy")) return TRUE;
-	return TRUE;
-      default:
-	FIXME("Unknown date format (%ld)\n", dwFlags);
-	SetLastError(ERROR_INVALID_PARAMETER);
-	return FALSE;
-    }
-  }
+    case 0:
+    case DATE_SHORTDATE:
+        if (GetLocaleInfoW(lcid, LOCALE_SSHORTDATE | (flags & LOCALE_USE_CP_ACP), buf, 256))
+            proc(buf);
+        break;
 
-   case 0x00002009:  /* (Loc,"en_JM") */
-  {
-   switch(dwFlags)
-    {
-      case DATE_SHORTDATE:
-	if(!(*lpDateFmtEnumProc)("dd/MM/yyyy")) return TRUE;
-	return TRUE;
-      case DATE_LONGDATE:
-        if(!(*lpDateFmtEnumProc)("dddd,MMMM dd,yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("MMMM dd,yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("dddd,dd MMMM,yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("dd MMMM,yyyy")) return TRUE;
-	return TRUE;
-      default:
-	FIXME("Unknown date format (%ld)\n", dwFlags);
-	SetLastError(ERROR_INVALID_PARAMETER);
-	return FALSE;
-    }
-  }
+    case DATE_LONGDATE:
+        if (GetLocaleInfoW(lcid, LOCALE_SLONGDATE | (flags & LOCALE_USE_CP_ACP), buf, 256))
+            proc(buf);
+        break;
 
-   case 0x00002809:  /* (Loc,"en_BZ") */
-   case 0x00002c09:  /* (Loc,"en_TT") */
-  {
-   switch(dwFlags)
-    {
-      case DATE_SHORTDATE:
-	if(!(*lpDateFmtEnumProc)("dd/MM/yyyy")) return TRUE;
-	return TRUE;
-      case DATE_LONGDATE:
-        if(!(*lpDateFmtEnumProc)("dddd,dd MMMM yyyy")) return TRUE;
-	return TRUE;
-      default:
-	FIXME("Unknown date format (%ld)\n", dwFlags);
-	SetLastError(ERROR_INVALID_PARAMETER);
-	return FALSE;
-    }
-  }
+    case DATE_YEARMONTH:
+        if (GetLocaleInfoW(lcid, LOCALE_SYEARMONTH | (flags & LOCALE_USE_CP_ACP), buf, 256))
+            proc(buf);
+        break;
 
-   default:  /* default to US English "en_US" */
-  {
-   switch(dwFlags)
-    {
-      case DATE_SHORTDATE:
-	if(!(*lpDateFmtEnumProc)("M/d/yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("M/d/yyyy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("MM/dd/yy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("MM/dd/yyyy")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("yy/MM/dd")) return TRUE;
-	if(!(*lpDateFmtEnumProc)("dd-MMM-yy")) return TRUE;
-	return TRUE;
-      case DATE_LONGDATE:
-        if(!(*lpDateFmtEnumProc)("dddd, MMMM dd, yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("MMMM dd, yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("dddd, dd MMMM, yyyy")) return TRUE;
-        if(!(*lpDateFmtEnumProc)("dd MMMM, yyyy")) return TRUE;
-	return TRUE;
-      default:
-	FIXME("Unknown date format (%ld)\n", dwFlags);
-	SetLastError(ERROR_INVALID_PARAMETER);
-	return FALSE;
+    default:
+        FIXME("Unknown date format (%ld)\n", flags);
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
     }
-  }
- }
-}
-
-/**************************************************************************
- *              EnumDateFormatsW	(KERNEL32.@)
- */
-BOOL WINAPI EnumDateFormatsW( DATEFMT_ENUMPROCW lpDateFmtEnumProc, LCID Locale, DWORD dwFlags )
-{
-  FIXME("(%p, %ld, %ld): stub\n", lpDateFmtEnumProc, Locale, dwFlags);
-  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-  return FALSE;
+    return TRUE;
 }
 
 /**************************************************************************
diff -up cvs/hq/wine/dlls/kernel/tests/locale.c wine/dlls/kernel/tests/locale.c
--- cvs/hq/wine/dlls/kernel/tests/locale.c	2005-06-21 16:39:59.000000000 +0900
+++ wine/dlls/kernel/tests/locale.c	2005-07-27 16:53:56.000000000 +0900
@@ -2094,11 +2094,83 @@ static void test_EnumUILanguageA(void)
   EXPECT_FALSE; EXPECT_INVALID;
 }
 
+static char date_fmt_buf[1024];
+
+static BOOL CALLBACK enum_datefmt_procA(LPSTR fmt)
+{
+    lstrcatA(date_fmt_buf, fmt);
+    lstrcatA(date_fmt_buf, "\n");
+    return TRUE;
+}
+
+static void test_EnumDateFormatsA(void)
+{
+    char *p, buf[256];
+    BOOL ret;
+    LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
+
+    trace("EnumDateFormatsA 0\n");
+    date_fmt_buf[0] = 0;
+    ret = EnumDateFormatsA(enum_datefmt_procA, lcid, 0);
+    ok(ret, "EnumDateFormatsA(0) error %ld\n", GetLastError());
+    trace("%s\n", date_fmt_buf);
+    /* test the 1st enumerated format */
+    if ((p = strchr(date_fmt_buf, '\n'))) *p = 0;
+    ret = GetLocaleInfoA(lcid, LOCALE_SSHORTDATE, buf, sizeof(buf));
+    ok(ret, "GetLocaleInfoA(LOCALE_SSHORTDATE) error %ld\n", GetLastError());
+    ok(!lstrcmpA(date_fmt_buf, buf), "expected \"%s\" got \"%s\"\n", date_fmt_buf, buf);
+
+    trace("EnumDateFormatsA LOCALE_USE_CP_ACP\n");
+    date_fmt_buf[0] = 0;
+    ret = EnumDateFormatsA(enum_datefmt_procA, lcid, LOCALE_USE_CP_ACP);
+    ok(ret, "EnumDateFormatsA(LOCALE_USE_CP_ACP) error %ld\n", GetLastError());
+    trace("%s\n", date_fmt_buf);
+    /* test the 1st enumerated format */
+    if ((p = strchr(date_fmt_buf, '\n'))) *p = 0;
+    ret = GetLocaleInfoA(lcid, LOCALE_SSHORTDATE, buf, sizeof(buf));
+    ok(ret, "GetLocaleInfoA(LOCALE_SSHORTDATE) error %ld\n", GetLastError());
+    ok(!lstrcmpA(date_fmt_buf, buf), "expected \"%s\" got \"%s\"\n", date_fmt_buf, buf);
+
+    trace("EnumDateFormatsA DATE_SHORTDATE\n");
+    date_fmt_buf[0] = 0;
+    ret = EnumDateFormatsA(enum_datefmt_procA, lcid, DATE_SHORTDATE);
+    ok(ret, "EnumDateFormatsA(DATE_SHORTDATE) error %ld\n", GetLastError());
+    trace("%s\n", date_fmt_buf);
+    /* test the 1st enumerated format */
+    if ((p = strchr(date_fmt_buf, '\n'))) *p = 0;
+    ret = GetLocaleInfoA(lcid, LOCALE_SSHORTDATE, buf, sizeof(buf));
+    ok(ret, "GetLocaleInfoA(LOCALE_SSHORTDATE) error %ld\n", GetLastError());
+    ok(!lstrcmpA(date_fmt_buf, buf), "expected \"%s\" got \"%s\"\n", date_fmt_buf, buf);
+
+    trace("EnumDateFormatsA DATE_LONGDATE\n");
+    date_fmt_buf[0] = 0;
+    ret = EnumDateFormatsA(enum_datefmt_procA, lcid, DATE_LONGDATE);
+    ok(ret, "EnumDateFormatsA(DATE_LONGDATE) error %ld\n", GetLastError());
+    trace("%s\n", date_fmt_buf);
+    /* test the 1st enumerated format */
+    if ((p = strchr(date_fmt_buf, '\n'))) *p = 0;
+    ret = GetLocaleInfoA(lcid, LOCALE_SLONGDATE, buf, sizeof(buf));
+    ok(ret, "GetLocaleInfoA(LOCALE_SLONGDATE) error %ld\n", GetLastError());
+    ok(!lstrcmpA(date_fmt_buf, buf), "expected \"%s\" got \"%s\"\n", date_fmt_buf, buf);
+
+    trace("EnumDateFormatsA DATE_YEARMONTH\n");
+    date_fmt_buf[0] = 0;
+    ret = EnumDateFormatsA(enum_datefmt_procA, lcid, DATE_YEARMONTH);
+    ok(ret, "EnumDateFormatsA(DATE_YEARMONTH) error %ld\n", GetLastError());
+    trace("%s\n", date_fmt_buf);
+    /* test the 1st enumerated format */
+    if ((p = strchr(date_fmt_buf, '\n'))) *p = 0;
+    ret = GetLocaleInfoA(lcid, LOCALE_SYEARMONTH, buf, sizeof(buf));
+    ok(ret, "GetLocaleInfoA(LOCALE_SYEARMONTH) error %ld\n", GetLastError());
+    ok(!lstrcmpA(date_fmt_buf, buf), "expected \"%s\" got \"%s\"\n", date_fmt_buf, buf);
+}
+
 START_TEST(locale)
 {
   InitFunctionPointers();
 
   if (0) test_EnumTimeFormats();
+  test_EnumDateFormatsA();
 
   test_GetLocaleInfoA();
   test_GetTimeFormatA();






More information about the wine-patches mailing list