Alexandre Julliard : kernel32: Reimplement GetCurrencyFormatA().

Alexandre Julliard julliard at winehq.org
Tue May 3 15:39:23 CDT 2022


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue May  3 10:35:45 2022 +0200

kernel32: Reimplement GetCurrencyFormatA().

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

---

 dlls/kernel32/lcformat.c | 95 ------------------------------------------------
 dlls/kernel32/locale.c   | 56 ++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 95 deletions(-)

diff --git a/dlls/kernel32/lcformat.c b/dlls/kernel32/lcformat.c
index a38edcc7758..de31db5c113 100644
--- a/dlls/kernel32/lcformat.c
+++ b/dlls/kernel32/lcformat.c
@@ -1261,101 +1261,6 @@ INT WINAPI GetNumberFormatEx(LPCWSTR name, DWORD flags,
   return GetNumberFormatW(lcid, flags, value, format, number, numout);
 }
 
-/**************************************************************************
- *              GetCurrencyFormatA	(KERNEL32.@)
- *
- * Format a currency string for a given locale.
- *
- * PARAMS
- *  lcid          [I] Locale to format for
- *  dwFlags       [I] LOCALE_ flags from "winnls.h"
- *  lpszValue     [I] String to format
- *  lpFormat      [I] Formatting overrides
- *  lpCurrencyStr [O] Destination for formatted string
- *  cchOut        [I] Size of lpCurrencyStr, or 0 to calculate the resulting size
- *
- * NOTES
- *  - lpszValue can contain only '0' - '9', '-' and '.'.
- *  - If lpFormat is non-NULL, dwFlags must be 0. In this case lpszValue will
- *    be formatted according to the format details returned by GetLocaleInfoA().
- *  - This function rounds the currency if the number of decimals exceeds the
- *    locales number of currency decimal places.
- *  - If cchOut is 0, this function does not write to lpCurrencyStr.
- *  - The ANSI version of this function fails if lcid is Unicode only.
- *
- * RETURNS
- *  Success: The number of character written to lpNumberStr, or that would
- *           have been written, if cchOut is 0.
- *  Failure: 0. Use GetLastError() to determine the cause.
- */
-INT WINAPI GetCurrencyFormatA(LCID lcid, DWORD dwFlags,
-                              LPCSTR lpszValue,  const CURRENCYFMTA *lpFormat,
-                              LPSTR lpCurrencyStr, int cchOut)
-{
-  DWORD cp = CP_ACP;
-  WCHAR szDec[8], szGrp[8], szCy[8], szIn[128], szOut[128];
-  CURRENCYFMTW fmt;
-  const CURRENCYFMTW *pfmt = NULL;
-  INT iRet;
-
-  TRACE("(0x%04lx,0x%08lx,%s,%p,%p,%d)\n", lcid, dwFlags, debugstr_a(lpszValue),
-        lpFormat, lpCurrencyStr, cchOut);
-
-  if (NLS_IsUnicodeOnlyLcid(lcid))
-  {
-    SetLastError(ERROR_INVALID_PARAMETER);
-    return 0;
-  }
-
-  if (!(dwFlags & LOCALE_USE_CP_ACP))
-  {
-    const NLS_FORMAT_NODE *node = NLS_GetFormats(lcid, dwFlags);
-    if (!node)
-    {
-      SetLastError(ERROR_INVALID_PARAMETER);
-      return 0;
-    }
-
-    cp = node->dwCodePage;
-  }
-
-  if (lpFormat)
-  {
-    memcpy(&fmt, lpFormat, sizeof(fmt));
-    pfmt = &fmt;
-    if (lpFormat->lpDecimalSep)
-    {
-      MultiByteToWideChar(cp, 0, lpFormat->lpDecimalSep, -1, szDec, ARRAY_SIZE(szDec));
-      fmt.lpDecimalSep = szDec;
-    }
-    if (lpFormat->lpThousandSep)
-    {
-      MultiByteToWideChar(cp, 0, lpFormat->lpThousandSep, -1, szGrp, ARRAY_SIZE(szGrp));
-      fmt.lpThousandSep = szGrp;
-    }
-    if (lpFormat->lpCurrencySymbol)
-    {
-      MultiByteToWideChar(cp, 0, lpFormat->lpCurrencySymbol, -1, szCy, ARRAY_SIZE(szCy));
-      fmt.lpCurrencySymbol = szCy;
-    }
-  }
-
-  if (lpszValue)
-    MultiByteToWideChar(cp, 0, lpszValue, -1, szIn, ARRAY_SIZE(szIn));
-
-  if (cchOut > (int) ARRAY_SIZE(szOut))
-    cchOut = ARRAY_SIZE(szOut);
-
-  szOut[0] = '\0';
-
-  iRet = GetCurrencyFormatW(lcid, dwFlags, lpszValue ? szIn : NULL, pfmt,
-                            lpCurrencyStr ? szOut : NULL, cchOut);
-
-  if (szOut[0] && lpCurrencyStr)
-    WideCharToMultiByte(cp, 0, szOut, -1, lpCurrencyStr, cchOut, 0, 0);
-  return iRet;
-}
-
 /* Formatting states for Currencies. We use flags to avoid code duplication. */
 #define CF_PARENS       0x1  /* Parentheses      */
 #define CF_MINUS_LEFT   0x2  /* '-' to the left  */
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index c6cbec870e2..16aa0bdd2aa 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -464,6 +464,62 @@ int WINAPI GetNumberFormatA( LCID lcid, DWORD flags, const char *value,
 }
 
 
+/**************************************************************************
+ *           GetCurrencyFormatA (KERNEL32.@)
+ */
+int WINAPI GetCurrencyFormatA( LCID lcid, DWORD flags, const char *value,
+                               const CURRENCYFMTA *format, char *buffer, int len )
+{
+    UINT cp = get_lcid_codepage( lcid, flags );
+    WCHAR input[128], output[128];
+    int ret;
+
+    TRACE( "(0x%04lx,0x%08lx,%s,%p,%p,%d)\n", lcid, flags, debugstr_a(value), format, buffer, len );
+
+    if (len < 0 || (len && !buffer) || !value)
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return 0;
+    }
+    MultiByteToWideChar( cp, 0, value, -1, input, ARRAY_SIZE(input) );
+
+    if (len > (int)ARRAY_SIZE(output)) len = ARRAY_SIZE(output);
+
+    if (format)
+    {
+        CURRENCYFMTW fmt;
+        WCHAR fmt_decimal[4], fmt_thousand[4], fmt_symbol[13];
+
+        if (flags & LOCALE_NOUSEROVERRIDE)
+        {
+            SetLastError( ERROR_INVALID_FLAGS );
+            return 0;
+        }
+        if (!format->lpDecimalSep || !format->lpThousandSep || !format->lpCurrencySymbol)
+        {
+            SetLastError( ERROR_INVALID_PARAMETER );
+            return 0;
+        }
+        MultiByteToWideChar( cp, 0, format->lpDecimalSep, -1, fmt_decimal, ARRAY_SIZE(fmt_decimal) );
+        MultiByteToWideChar( cp, 0, format->lpThousandSep, -1, fmt_thousand, ARRAY_SIZE(fmt_thousand) );
+        MultiByteToWideChar( cp, 0, format->lpCurrencySymbol, -1, fmt_symbol, ARRAY_SIZE(fmt_symbol) );
+        fmt.NumDigits = format->NumDigits;
+        fmt.LeadingZero = format->LeadingZero;
+        fmt.Grouping = format->Grouping;
+        fmt.NegativeOrder = format->NegativeOrder;
+        fmt.PositiveOrder = format->PositiveOrder;
+        fmt.lpDecimalSep = fmt_decimal;
+        fmt.lpThousandSep = fmt_thousand;
+        fmt.lpCurrencySymbol = fmt_symbol;
+        ret = GetCurrencyFormatW( lcid, flags, input, &fmt, output, len );
+    }
+    else ret = GetCurrencyFormatW( lcid, flags, input, NULL, output, len );
+
+    if (ret) ret = WideCharToMultiByte( cp, 0, output, -1, buffer, len, 0, 0 );
+    return ret;
+}
+
+
 /******************************************************************************
  *           GetGeoInfoA (KERNEL32.@)
  */




More information about the wine-cvs mailing list