Nikolay Sivov : kernel32: Simplify EnumDateFormats & EnumDateFormatsEx.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 9 08:34:17 CST 2015


Module: wine
Branch: master
Commit: 292e4153cf1cd3bf67fec0ac14dd53408864b7c0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=292e4153cf1cd3bf67fec0ac14dd53408864b7c0

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Nov  8 22:28:33 2015 +0300

kernel32: Simplify EnumDateFormats & EnumDateFormatsEx.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/lcformat.c | 219 ++++++++++++++++++++++-------------------------
 1 file changed, 100 insertions(+), 119 deletions(-)

diff --git a/dlls/kernel32/lcformat.c b/dlls/kernel32/lcformat.c
index 2c81d02..8f08826 100644
--- a/dlls/kernel32/lcformat.c
+++ b/dlls/kernel32/lcformat.c
@@ -1742,93 +1742,126 @@ error:
  *        alternate calendars is determined.
  */
 
-/**************************************************************************
- *              EnumDateFormatsExA    (KERNEL32.@)
+enum enum_callback_type {
+    CALLBACK_ENUMPROC,
+    CALLBACK_ENUMPROCEX,
+    CALLBACK_ENUMPROCEXEX
+};
+
+struct enumdateformats_context {
+    enum enum_callback_type type;  /* callback kind */
+    union {
+        DATEFMT_ENUMPROCW    callback;     /* user callback pointer */
+        DATEFMT_ENUMPROCEXW  callbackex;
+    } u;
+    LCID  lcid;    /* locale of interest */
+    DWORD flags;
+    BOOL  unicode; /* A vs W callback type, only for regular and Ex callbacks */
+};
+
+/******************************************************************************
+ * NLS_EnumDateFormats <internal>
+ * Enumerates date formats for a specified locale.
  *
- * FIXME: MSDN mentions only LOCALE_USE_CP_ACP, should we handle
- * LOCALE_NOUSEROVERRIDE here as well?
+ * PARAMS
+ *    ctxt [I] enumeration context, see 'struct enumdateformats_context'
+ *
+ * RETURNS
+ *    Success: TRUE.
+ *    Failure: FALSE. Use GetLastError() to determine the cause.
  */
-BOOL WINAPI EnumDateFormatsExA(DATEFMT_ENUMPROCEXA proc, LCID lcid, DWORD flags)
+static BOOL NLS_EnumDateFormats(const struct enumdateformats_context *ctxt)
 {
+    WCHAR bufW[256];
+    char bufA[256];
+    LCTYPE lctype;
     CALID cal_id;
-    char buf[256];
+    INT ret;
 
-    if (!proc)
+    if (!ctxt->u.callback)
     {
         SetLastError(ERROR_INVALID_PARAMETER);
         return FALSE;
     }
 
-    if (!GetLocaleInfoW(lcid, LOCALE_ICALENDARTYPE|LOCALE_RETURN_NUMBER, (LPWSTR)&cal_id, sizeof(cal_id)/sizeof(WCHAR)))
+    if (!GetLocaleInfoW(ctxt->lcid, LOCALE_ICALENDARTYPE|LOCALE_RETURN_NUMBER, (LPWSTR)&cal_id, sizeof(cal_id)/sizeof(WCHAR)))
         return FALSE;
 
-    switch (flags & ~LOCALE_USE_CP_ACP)
+    switch (ctxt->flags & ~LOCALE_USE_CP_ACP)
     {
     case 0:
     case DATE_SHORTDATE:
-        if (GetLocaleInfoA(lcid, LOCALE_SSHORTDATE | (flags & LOCALE_USE_CP_ACP), buf, 256))
-            proc(buf, cal_id);
+        lctype = LOCALE_SSHORTDATE;
         break;
-
     case DATE_LONGDATE:
-        if (GetLocaleInfoA(lcid, LOCALE_SLONGDATE | (flags & LOCALE_USE_CP_ACP), buf, 256))
-            proc(buf, cal_id);
+        lctype = LOCALE_SLONGDATE;
         break;
-
     case DATE_YEARMONTH:
-        if (GetLocaleInfoA(lcid, LOCALE_SYEARMONTH | (flags & LOCALE_USE_CP_ACP), buf, 256))
-            proc(buf, cal_id);
+        lctype = LOCALE_SYEARMONTH;
         break;
-
     default:
-        FIXME("Unknown date format (%d)\n", flags);
+        FIXME("Unknown date format (0x%08x)\n", ctxt->flags);
         SetLastError(ERROR_INVALID_PARAMETER);
         return FALSE;
     }
+
+    lctype |= ctxt->flags & LOCALE_USE_CP_ACP;
+    if (ctxt->unicode)
+        ret = GetLocaleInfoW(ctxt->lcid, lctype, bufW, sizeof(bufW)/sizeof(bufW[0]));
+    else
+        ret = GetLocaleInfoA(ctxt->lcid, lctype, bufA, sizeof(bufA)/sizeof(bufA[0]));
+
+    if (ret)
+    {
+        switch (ctxt->type)
+        {
+        case CALLBACK_ENUMPROC:
+            ctxt->u.callback(ctxt->unicode ? bufW : (WCHAR*)bufA);
+            break;
+        case CALLBACK_ENUMPROCEX:
+            ctxt->u.callbackex(ctxt->unicode ? bufW : (WCHAR*)bufA, cal_id);
+            break;
+        default:
+            ;
+        }
+    }
+
     return TRUE;
 }
 
 /**************************************************************************
- *              EnumDateFormatsExW    (KERNEL32.@)
+ *              EnumDateFormatsExA    (KERNEL32.@)
+ *
+ * FIXME: MSDN mentions only LOCALE_USE_CP_ACP, should we handle
+ * LOCALE_NOUSEROVERRIDE here as well?
  */
-BOOL WINAPI EnumDateFormatsExW(DATEFMT_ENUMPROCEXW proc, LCID lcid, DWORD flags)
+BOOL WINAPI EnumDateFormatsExA(DATEFMT_ENUMPROCEXA proc, LCID lcid, DWORD flags)
 {
-    CALID cal_id;
-    WCHAR buf[256];
+    struct enumdateformats_context ctxt;
 
-    if (!proc)
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
+    ctxt.type = CALLBACK_ENUMPROCEX;
+    ctxt.u.callbackex = (DATEFMT_ENUMPROCEXW)proc;
+    ctxt.lcid = lcid;
+    ctxt.flags = flags;
+    ctxt.unicode = FALSE;
 
-    if (!GetLocaleInfoW(lcid, LOCALE_ICALENDARTYPE|LOCALE_RETURN_NUMBER, (LPWSTR)&cal_id, sizeof(cal_id)/sizeof(WCHAR)))
-        return FALSE;
+    return NLS_EnumDateFormats(&ctxt);
+}
 
-    switch (flags & ~LOCALE_USE_CP_ACP)
-    {
-    case 0:
-    case DATE_SHORTDATE:
-        if (GetLocaleInfoW(lcid, LOCALE_SSHORTDATE | (flags & LOCALE_USE_CP_ACP), buf, 256))
-            proc(buf, cal_id);
-        break;
+/**************************************************************************
+ *              EnumDateFormatsExW    (KERNEL32.@)
+ */
+BOOL WINAPI EnumDateFormatsExW(DATEFMT_ENUMPROCEXW proc, LCID lcid, DWORD flags)
+{
+    struct enumdateformats_context ctxt;
 
-    case DATE_LONGDATE:
-        if (GetLocaleInfoW(lcid, LOCALE_SLONGDATE | (flags & LOCALE_USE_CP_ACP), buf, 256))
-            proc(buf, cal_id);
-        break;
+    ctxt.type = CALLBACK_ENUMPROCEX;
+    ctxt.u.callbackex = proc;
+    ctxt.lcid = lcid;
+    ctxt.flags = flags;
+    ctxt.unicode = TRUE;
 
-    case DATE_YEARMONTH:
-        if (GetLocaleInfoW(lcid, LOCALE_SYEARMONTH | (flags & LOCALE_USE_CP_ACP), buf, 256))
-            proc(buf, cal_id);
-        break;
-
-    default:
-        FIXME("Unknown date format (%d)\n", flags);
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-    return TRUE;
+    return NLS_EnumDateFormats(&ctxt);
 }
 
 /**************************************************************************
@@ -1839,38 +1872,15 @@ BOOL WINAPI EnumDateFormatsExW(DATEFMT_ENUMPROCEXW proc, LCID lcid, DWORD flags)
  */
 BOOL WINAPI EnumDateFormatsA(DATEFMT_ENUMPROCA proc, LCID lcid, DWORD flags)
 {
-    char buf[256];
-
-    if (!proc)
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-
-    switch (flags & ~LOCALE_USE_CP_ACP)
-    {
-    case 0:
-    case DATE_SHORTDATE:
-        if (GetLocaleInfoA(lcid, LOCALE_SSHORTDATE | (flags & LOCALE_USE_CP_ACP), buf, 256))
-            proc(buf);
-        break;
-
-    case DATE_LONGDATE:
-        if (GetLocaleInfoA(lcid, LOCALE_SLONGDATE | (flags & LOCALE_USE_CP_ACP), buf, 256))
-            proc(buf);
-        break;
+    struct enumdateformats_context ctxt;
 
-    case DATE_YEARMONTH:
-        if (GetLocaleInfoA(lcid, LOCALE_SYEARMONTH | (flags & LOCALE_USE_CP_ACP), buf, 256))
-            proc(buf);
-        break;
+    ctxt.type = CALLBACK_ENUMPROC;
+    ctxt.u.callback = (DATEFMT_ENUMPROCW)proc;
+    ctxt.lcid = lcid;
+    ctxt.flags = flags;
+    ctxt.unicode = FALSE;
 
-    default:
-        FIXME("Unknown date format (%d)\n", flags);
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-    return TRUE;
+    return NLS_EnumDateFormats(&ctxt);
 }
 
 /**************************************************************************
@@ -1878,38 +1888,15 @@ BOOL WINAPI EnumDateFormatsA(DATEFMT_ENUMPROCA proc, LCID lcid, DWORD flags)
  */
 BOOL WINAPI EnumDateFormatsW(DATEFMT_ENUMPROCW proc, LCID lcid, DWORD flags)
 {
-    WCHAR buf[256];
-
-    if (!proc)
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
+    struct enumdateformats_context ctxt;
 
-    switch (flags & ~LOCALE_USE_CP_ACP)
-    {
-    case 0:
-    case DATE_SHORTDATE:
-        if (GetLocaleInfoW(lcid, LOCALE_SSHORTDATE | (flags & LOCALE_USE_CP_ACP), buf, 256))
-            proc(buf);
-        break;
+    ctxt.type = CALLBACK_ENUMPROC;
+    ctxt.u.callback = proc;
+    ctxt.lcid = lcid;
+    ctxt.flags = flags;
+    ctxt.unicode = TRUE;
 
-    case DATE_LONGDATE:
-        if (GetLocaleInfoW(lcid, LOCALE_SLONGDATE | (flags & LOCALE_USE_CP_ACP), buf, 256))
-            proc(buf);
-        break;
-
-    case DATE_YEARMONTH:
-        if (GetLocaleInfoW(lcid, LOCALE_SYEARMONTH | (flags & LOCALE_USE_CP_ACP), buf, 256))
-            proc(buf);
-        break;
-
-    default:
-        FIXME("Unknown date format (%d)\n", flags);
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-    return TRUE;
+    return NLS_EnumDateFormats(&ctxt);
 }
 
 /**************************************************************************
@@ -1971,14 +1958,8 @@ BOOL WINAPI EnumTimeFormatsW(TIMEFMT_ENUMPROCW proc, LCID lcid, DWORD flags)
     return TRUE;
 }
 
-enum enumcalendar_callback_type {
-    CALLBACK_ENUMPROC,
-    CALLBACK_ENUMPROCEX,
-    CALLBACK_ENUMPROCEXEX
-};
-
 struct enumcalendar_context {
-    enum enumcalendar_callback_type type;  /* callback kind */
+    enum enum_callback_type type;  /* callback kind */
     union {
         CALINFO_ENUMPROCW    callback;     /* user callback pointer */
         CALINFO_ENUMPROCEXW  callbackex;




More information about the wine-cvs mailing list