[ros-diffs] [dchapyshev] 37555: - Update GetCurrencyFormatW. +34 wine tests passed

dchapyshev at svn.reactos.org dchapyshev at svn.reactos.org
Sat Nov 22 14:45:18 CET 2008


Author: dchapyshev
Date: Sat Nov 22 07:45:17 2008
New Revision: 37555

URL: http://svn.reactos.org/svn/reactos?rev=37555&view=rev
Log:
- Update GetCurrencyFormatW. +34 wine tests passed

Modified:
    trunk/reactos/dll/win32/kernel32/misc/lcformat.c

Modified: trunk/reactos/dll/win32/kernel32/misc/lcformat.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/lcformat.c?rev=37555&r1=37554&r2=37555&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/lcformat.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/misc/lcformat.c [iso-8859-1] Sat Nov 22 07:45:17 2008
@@ -1358,370 +1358,286 @@
                               LPCWSTR lpszValue,  const CURRENCYFMTW *lpFormat,
                               LPWSTR lpCurrencyStr, int cchOut)
 {
-    static const BYTE NLS_NegCyFormats[16] =
-    {
-        CF_PARENS|CF_CY_LEFT,                       /* ($1.1) */
-        CF_MINUS_LEFT|CF_MINUS_BEFORE|CF_CY_LEFT,   /* -$1.1  */
-        CF_MINUS_LEFT|CF_CY_LEFT,                   /* $-1.1  */
-        CF_MINUS_RIGHT|CF_CY_LEFT,                  /* $1.1-  */
-        CF_PARENS|CF_CY_RIGHT,                      /* (1.1$) */
-        CF_MINUS_LEFT|CF_CY_RIGHT,                  /* -1.1$  */
-        CF_MINUS_RIGHT|CF_MINUS_BEFORE|CF_CY_RIGHT, /* 1.1-$  */
-        CF_MINUS_RIGHT|CF_CY_RIGHT,                 /* 1.1$-  */
-        CF_MINUS_LEFT|CF_CY_RIGHT|CF_CY_SPACE,      /* -1.1 $ */
-        CF_MINUS_LEFT|CF_MINUS_BEFORE|CF_CY_LEFT|CF_CY_SPACE,   /* -$ 1.1 */
-        CF_MINUS_RIGHT|CF_CY_RIGHT|CF_CY_SPACE,     /* 1.1 $-  */
-        CF_MINUS_RIGHT|CF_CY_LEFT|CF_CY_SPACE,      /* $ 1.1-  */
-        CF_MINUS_LEFT|CF_CY_LEFT|CF_CY_SPACE,       /* $ -1.1  */
-        CF_MINUS_RIGHT|CF_MINUS_BEFORE|CF_CY_RIGHT|CF_CY_SPACE, /* 1.1- $ */
-        CF_PARENS|CF_CY_LEFT|CF_CY_SPACE,           /* ($ 1.1) */
-        CF_PARENS|CF_CY_RIGHT|CF_CY_SPACE,          /* (1.1 $) */
-    };
-    static const BYTE NLS_PosCyFormats[4] =
-    {
-        CF_CY_LEFT,              /* $1.1  */
-        CF_CY_RIGHT,             /* 1.1$  */
-        CF_CY_LEFT|CF_CY_SPACE,  /* $ 1.1 */
-        CF_CY_RIGHT|CF_CY_SPACE, /* 1.1 $ */
-    };
-
-    WCHAR szBuff[128], *szOut = szBuff + sizeof(szBuff) / sizeof(WCHAR) - 1;
-    WCHAR szNegBuff[8];
-    const WCHAR *lpszNeg = NULL, *lpszNegStart, *szSrc, *lpszCy, *lpszCyStart;
-    DWORD dwState = 0, dwDecimals = 0, dwGroupCount = 0, dwCurrentGroupCount = 0, dwFmt;
-    INT iRet;
-
-    DPRINT1("GetCurrencyFormatW(0x%04lx,0x%08lx,%S,%p,%p,%d)\n",
-            lcid,
-            dwFlags,
-            lpszValue,
-            lpFormat,
-            lpCurrencyStr,
-            cchOut);
-
-    if(NLS_isSystemLocale(lcid))
-    {
-        lcid = NLS_getDefaultLocale(lcid);
-    }
-    else if(!IsValidLocale(lcid, 0))
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return 0;
-    }
-
-    if (!lpszValue || cchOut < 0 || (cchOut > 0 && !lpCurrencyStr) ||
-        (lpFormat && (dwFlags || !lpFormat->lpDecimalSep || !lpFormat->lpThousandSep ||
-        !lpFormat->lpCurrencySymbol || lpFormat->NegativeOrder > 15 ||
-        lpFormat->PositiveOrder > 3)))
-    {
-        SetLastError(lpFormat && dwFlags ? ERROR_INVALID_FLAGS : ERROR_INVALID_PARAMETER);
-        return 0;
-    }
-
-    if (!lpFormat)
-    {
-        const NLS_FORMAT_NODE *node = NLS_GetFormats(lcid, dwFlags);
-
-        if (!node)
+  static const BYTE NLS_NegCyFormats[16] =
+  {
+    CF_PARENS|CF_CY_LEFT,                       /* ($1.1) */
+    CF_MINUS_LEFT|CF_MINUS_BEFORE|CF_CY_LEFT,   /* -$1.1  */
+    CF_MINUS_LEFT|CF_CY_LEFT,                   /* $-1.1  */
+    CF_MINUS_RIGHT|CF_CY_LEFT,                  /* $1.1-  */
+    CF_PARENS|CF_CY_RIGHT,                      /* (1.1$) */
+    CF_MINUS_LEFT|CF_CY_RIGHT,                  /* -1.1$  */
+    CF_MINUS_RIGHT|CF_MINUS_BEFORE|CF_CY_RIGHT, /* 1.1-$  */
+    CF_MINUS_RIGHT|CF_CY_RIGHT,                 /* 1.1$-  */
+    CF_MINUS_LEFT|CF_CY_RIGHT|CF_CY_SPACE,      /* -1.1 $ */
+    CF_MINUS_LEFT|CF_MINUS_BEFORE|CF_CY_LEFT|CF_CY_SPACE,   /* -$ 1.1 */
+    CF_MINUS_RIGHT|CF_CY_RIGHT|CF_CY_SPACE,     /* 1.1 $-  */
+    CF_MINUS_RIGHT|CF_CY_LEFT|CF_CY_SPACE,      /* $ 1.1-  */
+    CF_MINUS_LEFT|CF_CY_LEFT|CF_CY_SPACE,       /* $ -1.1  */
+    CF_MINUS_RIGHT|CF_MINUS_BEFORE|CF_CY_RIGHT|CF_CY_SPACE, /* 1.1- $ */
+    CF_PARENS|CF_CY_LEFT|CF_CY_SPACE,           /* ($ 1.1) */
+    CF_PARENS|CF_CY_RIGHT|CF_CY_SPACE,          /* (1.1 $) */
+  };
+  static const BYTE NLS_PosCyFormats[4] =
+  {
+    CF_CY_LEFT,              /* $1.1  */
+    CF_CY_RIGHT,             /* 1.1$  */
+    CF_CY_LEFT|CF_CY_SPACE,  /* $ 1.1 */
+    CF_CY_RIGHT|CF_CY_SPACE, /* 1.1 $ */
+  };
+  WCHAR szBuff[128], *szOut = szBuff + sizeof(szBuff) / sizeof(WCHAR) - 1;
+  WCHAR szNegBuff[8];
+  const WCHAR *lpszNeg = NULL, *lpszNegStart, *szSrc, *lpszCy, *lpszCyStart;
+  DWORD dwState = 0, dwDecimals = 0, dwGroupCount = 0, dwCurrentGroupCount = 0, dwFmt;
+  INT iRet;
+
+  DPRINT1("GetCurrencyFormatW(0x%04lx,0x%08lx,%S,%p,%p,%d)\n",
+          lcid,
+          dwFlags,
+          lpszValue,
+          lpFormat,
+          lpCurrencyStr,
+          cchOut);
+
+  if (!lpszValue || cchOut < 0 || (cchOut > 0 && !lpCurrencyStr) ||
+      !IsValidLocale(lcid, 0) ||
+      (lpFormat && (dwFlags || !lpFormat->lpDecimalSep || !lpFormat->lpThousandSep ||
+      !lpFormat->lpCurrencySymbol || lpFormat->NegativeOrder > 15 ||
+      lpFormat->PositiveOrder > 3)))
+  {
+GetCurrencyFormatW_Error:
+    SetLastError(lpFormat && dwFlags ? ERROR_INVALID_FLAGS : ERROR_INVALID_PARAMETER);
+    return 0;
+  }
+
+  if (!lpFormat)
+  {
+    const NLS_FORMAT_NODE *node = NLS_GetFormats(lcid, dwFlags);
+
+    if (!node)
+      goto GetCurrencyFormatW_Error;
+    lpFormat = &node->cyfmt;
+    lpszNegStart = lpszNeg = GetNegative(node);
+  }
+  else
+  {
+    GetLocaleInfoW(lcid, LOCALE_SNEGATIVESIGN|(dwFlags & LOCALE_NOUSEROVERRIDE),
+                   szNegBuff, sizeof(szNegBuff)/sizeof(WCHAR));
+    lpszNegStart = lpszNeg = szNegBuff;
+  }
+  dwFlags &= (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
+
+  lpszNeg = lpszNeg + strlenW(lpszNeg) - 1;
+  lpszCyStart = lpFormat->lpCurrencySymbol;
+  lpszCy = lpszCyStart + strlenW(lpszCyStart) - 1;
+
+  /* Format the currency backwards into a temporary buffer */
+
+  szSrc = lpszValue;
+  *szOut-- = '\0';
+
+  /* Check the number for validity */
+  while (*szSrc)
+  {
+    if (*szSrc >= '0' && *szSrc <= '9')
+    {
+      dwState |= NF_DIGITS;
+      if (dwState & NF_ISREAL)
+        dwDecimals++;
+    }
+    else if (*szSrc == '-')
+    {
+      if (dwState)
+        goto GetCurrencyFormatW_Error; /* '-' not first character */
+      dwState |= NF_ISNEGATIVE;
+    }
+    else if (*szSrc == '.')
+    {
+      if (dwState & NF_ISREAL)
+        goto GetCurrencyFormatW_Error; /* More than one '.' */
+      dwState |= NF_ISREAL;
+    }
+    else
+      goto GetCurrencyFormatW_Error; /* Invalid char */
+    szSrc++;
+  }
+  szSrc--; /* Point to last character */
+
+  if (!(dwState & NF_DIGITS))
+    goto GetCurrencyFormatW_Error; /* No digits */
+
+  if (dwState & NF_ISNEGATIVE)
+    dwFmt = NLS_NegCyFormats[lpFormat->NegativeOrder];
+  else
+    dwFmt = NLS_PosCyFormats[lpFormat->PositiveOrder];
+
+  /* Add any trailing negative or currency signs */
+  if (dwFmt & CF_PARENS)
+    *szOut-- = ')';
+
+  while (dwFmt & (CF_MINUS_RIGHT|CF_CY_RIGHT))
+  {
+    switch (dwFmt & (CF_MINUS_RIGHT|CF_MINUS_BEFORE|CF_CY_RIGHT))
+    {
+    case CF_MINUS_RIGHT:
+    case CF_MINUS_RIGHT|CF_CY_RIGHT:
+      while (lpszNeg >= lpszNegStart)
+        *szOut-- = *lpszNeg--;
+      dwFmt &= ~CF_MINUS_RIGHT;
+      break;
+
+    case CF_CY_RIGHT:
+    case CF_MINUS_BEFORE|CF_CY_RIGHT:
+    case CF_MINUS_RIGHT|CF_MINUS_BEFORE|CF_CY_RIGHT:
+      while (lpszCy >= lpszCyStart)
+        *szOut-- = *lpszCy--;
+      if (dwFmt & CF_CY_SPACE)
+        *szOut-- = ' ';
+      dwFmt &= ~(CF_CY_RIGHT|CF_MINUS_BEFORE);
+      break;
+    }
+  }
+
+  /* Copy all digits up to the decimal point */
+  if (!lpFormat->NumDigits)
+  {
+    if (dwState & NF_ISREAL)
+    {
+      while (*szSrc != '.') /* Don't write any decimals or a separator */
+      {
+        if (*szSrc >= '5' || (*szSrc == '4' && (dwState & NF_ROUND)))
+          dwState |= NF_ROUND;
+        else
+          dwState &= ~NF_ROUND;
+        szSrc--;
+      }
+      szSrc--;
+    }
+  }
+  else
+  {
+    LPWSTR lpszDec = lpFormat->lpDecimalSep + strlenW(lpFormat->lpDecimalSep) - 1;
+
+    if (dwDecimals <= lpFormat->NumDigits)
+    {
+      dwDecimals = lpFormat->NumDigits - dwDecimals;
+      while (dwDecimals--)
+        *szOut-- = '0'; /* Pad to correct number of dp */
+    }
+    else
+    {
+      dwDecimals -= lpFormat->NumDigits;
+      /* Skip excess decimals, and determine if we have to round the number */
+      while (dwDecimals--)
+      {
+        if (*szSrc >= '5' || (*szSrc == '4' && (dwState & NF_ROUND)))
+          dwState |= NF_ROUND;
+        else
+          dwState &= ~NF_ROUND;
+        szSrc--;
+      }
+    }
+
+    if (dwState & NF_ISREAL)
+    {
+      while (*szSrc != '.')
+      {
+        if (dwState & NF_ROUND)
         {
-            SetLastError(lpFormat && dwFlags ? ERROR_INVALID_FLAGS : ERROR_INVALID_PARAMETER);
-            return 0;
-        }
-        lpFormat = &node->cyfmt;
-        lpszNegStart = lpszNeg = GetNegative(node);
-    }
-    else
-    {
-        GetLocaleInfoW(lcid,
-                       LOCALE_SNEGATIVESIGN | (dwFlags & LOCALE_NOUSEROVERRIDE),
-                       szNegBuff,
-                       sizeof(szNegBuff)/sizeof(WCHAR));
-        lpszNegStart = lpszNeg = szNegBuff;
-    }
-
-    dwFlags &= (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
-
-    lpszNeg = lpszNeg + strlenW(lpszNeg) - 1;
-    lpszCyStart = lpFormat->lpCurrencySymbol;
-    lpszCy = lpszCyStart + strlenW(lpszCyStart) - 1;
-
-    /* Format the currency backwards into a temporary buffer */
-
-    szSrc = lpszValue;
-    *szOut-- = '\0';
-
-    /* Check the number for validity */
-    while (*szSrc)
-    {
-        if (*szSrc >= '0' && *szSrc <= '9')
-        {
-            dwState |= NF_DIGITS;
-            if (dwState & NF_ISREAL)
-            {
-                dwDecimals++;
-            }
-        }
-        else if (*szSrc == '-')
-        {
-            if (dwState) // '-' not first character
-            {
-                SetLastError(lpFormat && dwFlags ? ERROR_INVALID_FLAGS : ERROR_INVALID_PARAMETER);
-                return 0;
-            }
-            dwState |= NF_ISNEGATIVE;
-        }
-        else if (*szSrc == '.')
-        {
-            if (dwState & NF_ISREAL) // More than one '.'
-            {
-                SetLastError(lpFormat && dwFlags ? ERROR_INVALID_FLAGS : ERROR_INVALID_PARAMETER);
-                return 0;
-            }
-            dwState |= NF_ISREAL;
-        }
-        else // Invalid char
-        {
-            SetLastError(lpFormat && dwFlags ? ERROR_INVALID_FLAGS : ERROR_INVALID_PARAMETER);
-            return 0;
-        }
-        szSrc++;
-    } // while (*szSrc)
-
-    szSrc--; // Point to last character
-
-    if (!(dwState & NF_DIGITS)) // No digits
-    {
-        SetLastError(lpFormat && dwFlags ? ERROR_INVALID_FLAGS : ERROR_INVALID_PARAMETER);
-        return 0;
-    }
-
-    // Sel fmt table
-    dwFmt = (dwState & NF_ISNEGATIVE)?NLS_NegCyFormats[lpFormat->NegativeOrder]:
-                                      NLS_PosCyFormats[lpFormat->PositiveOrder];
-
-    // Add any trailing negative or currency signs
-    if (dwFmt & CF_PARENS)
-    {
-        *szOut-- = ')';
-    }
-
-    while (dwFmt & (CF_MINUS_RIGHT|CF_CY_RIGHT))
-    {
-        switch (dwFmt & (CF_MINUS_RIGHT|CF_MINUS_BEFORE|CF_CY_RIGHT))
-        {
-            case CF_MINUS_RIGHT: // Add right negative sign
-            case CF_MINUS_RIGHT|CF_CY_RIGHT:
-                while (lpszNeg >= lpszNegStart)
-                {
-                    *szOut-- = *lpszNeg--;
-                }
-                dwFmt &= ~CF_MINUS_RIGHT;
-            break;
-
-            case CF_CY_RIGHT: // Add right currency sign
-            case CF_MINUS_BEFORE|CF_CY_RIGHT:
-            case CF_MINUS_RIGHT|CF_MINUS_BEFORE|CF_CY_RIGHT:
-                while (lpszCy >= lpszCyStart)
-                {
-                    *szOut-- = *lpszCy--;
-                }
-                if (dwFmt & CF_CY_SPACE)
-                {
-                    *szOut-- = ' ';
-                }
-                dwFmt &= ~(CF_CY_RIGHT|CF_MINUS_BEFORE);
-            break;
-        }
-    }
-
-    // Copy all digits up to the decimal point
-    if (!lpFormat->NumDigits)
-    {
-        if (dwState & NF_ISREAL)
-        {
-            while (*szSrc != '.') // Don't write any decimals or a separator
-            {
-                if (*szSrc >= '5' || (*szSrc == '4' && (dwState & NF_ROUND)))
-                {
-                    dwState |= NF_ROUND;
-                }
-                else
-                {
-                    dwState &= ~NF_ROUND;
-                }
-                szSrc--;
-            }
-            szSrc--;
-        }
-    }
-    else
-    {
-        LPWSTR lpszDec = lpFormat->lpDecimalSep + strlenW(lpFormat->lpDecimalSep) - 1;
-
-        if (dwDecimals <= lpFormat->NumDigits)
-        {
-            dwDecimals = lpFormat->NumDigits - dwDecimals;
-            while (dwDecimals--)
-            {
-                *szOut-- = '0'; // Pad to correct number of dp
-            }
+          if (*szSrc == '9')
+            *szOut-- = '0'; /* continue rounding */
+          else
+          {
+            dwState &= ~NF_ROUND;
+            *szOut-- = (*szSrc)+1;
+          }
+          szSrc--;
         }
         else
-        {
-            dwDecimals -= lpFormat->NumDigits;
-            // Skip excess decimals, and determine if we have to round the number
-            while (dwDecimals--)
-            {
-                if (*szSrc >= '5' || (*szSrc == '4' && (dwState & NF_ROUND)))
-                {
-                    dwState |= NF_ROUND;
-                }
-                else
-                {
-                    dwState &= ~NF_ROUND;
-                }
-                szSrc--;
-            }
-        }
-
-        if (dwState & NF_ISREAL)
-        {
-            while (*szSrc != '.')
-            {
-                if (dwState & NF_ROUND)
-                {
-                    if (*szSrc == '9')
-                    {
-                        *szOut-- = '0'; // continue rounding
-                    }
-                    else
-                    {
-                        dwState &= ~NF_ROUND;
-                        *szOut-- = (*szSrc)+1;
-                    }
-                    szSrc--;
-                }
-                else
-                {
-                    *szOut-- = *szSrc--; /* Write existing decimals */
-                }
-            }
-            szSrc--; // Skip '.'
-        }
-
-        while (lpszDec >= lpFormat->lpDecimalSep)
-        {
-            *szOut-- = *lpszDec--; // Write decimal separator
-        }
-    } // if (!lpFormat->NumDigits)
-
-    dwGroupCount = lpFormat->Grouping;
-    // FIXME: windows XP support complicated grouping ie: "2;3;0"
-
-    // Write the remaining whole number digits, including grouping chars
-    while (szSrc >= lpszValue && *szSrc >= '0' && *szSrc <= '9')
-    {
-        if (dwState & NF_ROUND)
-        {
-            if (*szSrc == '9')
-            {
-                *szOut-- = '0'; // continue rounding
-            }
-            else
-            {
-                dwState &= ~NF_ROUND;
-                *szOut-- = (*szSrc)+1;
-            }
-            szSrc--;
-        }
-        else
-        *szOut-- = *szSrc--;
-
-        dwState |= NF_DIGITS_OUT;
-        dwCurrentGroupCount++;
-        if (szSrc >= lpszValue && dwCurrentGroupCount == dwGroupCount)
-        {
-            // Group sep string
-            LPWSTR lpszGrp = lpFormat->lpThousandSep +
-                             strlenW(lpFormat->lpThousandSep) - 1;
-
-            while (lpszGrp >= lpFormat->lpThousandSep)
-            {
-                *szOut-- = *lpszGrp--; // Write grouping char
-            }
-
-            dwCurrentGroupCount = 0;
-        }
-    }
-
-    // Correct negative result, delete unnecessary group sep
-    if(dwState & NF_ISNEGATIVE)
-    {
-        szOut += strlenW(lpFormat->lpThousandSep);
-    }
-
+          *szOut-- = *szSrc--; /* Write existing decimals */
+      }
+      szSrc--; /* Skip '.' */
+    }
+    while (lpszDec >= lpFormat->lpDecimalSep)
+      *szOut-- = *lpszDec--; /* Write decimal separator */
+  }
+
+  dwGroupCount = lpFormat->Grouping;
+
+  /* Write the remaining whole number digits, including grouping chars */
+  while (szSrc >= lpszValue && *szSrc >= '0' && *szSrc <= '9')
+  {
     if (dwState & NF_ROUND)
     {
-        *szOut-- = '1'; // e.g. .6 > 1.0
-    }
-    else if (!(dwState & NF_DIGITS_OUT) && lpFormat->LeadingZero)
-    {
-        *szOut-- = '0'; // Add leading 0 if we have no digits before the decimal point
-    }
-
-    // Add any leading negative or currency sign
-    while (dwFmt & (CF_MINUS_LEFT|CF_CY_LEFT))
-    {
-        switch (dwFmt & (CF_MINUS_LEFT|CF_MINUS_BEFORE|CF_CY_LEFT))
-        {
-            case CF_MINUS_LEFT: // Add left negative sign
-            case CF_MINUS_LEFT|CF_CY_LEFT:
-                while (lpszNeg >= lpszNegStart)
-                {
-                    *szOut-- = *lpszNeg--;
-                }
-                dwFmt &= ~CF_MINUS_LEFT;
-            break;
-
-            case CF_CY_LEFT: // Add left currency sign
-            case CF_CY_LEFT|CF_MINUS_BEFORE:
-            case CF_MINUS_LEFT|CF_MINUS_BEFORE|CF_CY_LEFT:
-                if (dwFmt & CF_CY_SPACE)
-                {
-                    *szOut-- = ' ';
-                }
-                while (lpszCy >= lpszCyStart)
-                {
-                    *szOut-- = *lpszCy--;
-                }
-                dwFmt &= ~(CF_CY_LEFT|CF_MINUS_BEFORE);
-            break;
-        }
-    }
-
-    // Add left bracket
-    if (dwFmt & CF_PARENS)
-    {
-        *szOut-- = '(';
-    }
-    szOut++;
-
-    iRet = strlenW(szOut) + 1;
-    if (cchOut)
-    {
-        if (iRet <= cchOut)
-        {
-            memcpy(lpCurrencyStr, szOut, iRet * sizeof(WCHAR));
-        }
-        else
-        {
-            memcpy(lpCurrencyStr, szOut, cchOut * sizeof(WCHAR));
-            lpCurrencyStr[cchOut - 1] = '\0';
-            SetLastError(ERROR_INSUFFICIENT_BUFFER);
-            iRet = 0;
-        }
-    }
-    return iRet;
+      if (*szSrc == '9')
+        *szOut-- = '0'; /* continue rounding */
+      else
+      {
+        dwState &= ~NF_ROUND;
+        *szOut-- = (*szSrc)+1;
+      }
+      szSrc--;
+    }
+    else
+      *szOut-- = *szSrc--;
+
+    dwState |= NF_DIGITS_OUT;
+    dwCurrentGroupCount++;
+    if (szSrc >= lpszValue && dwCurrentGroupCount == dwGroupCount)
+    {
+      LPWSTR lpszGrp = lpFormat->lpThousandSep + strlenW(lpFormat->lpThousandSep) - 1;
+
+      while (lpszGrp >= lpFormat->lpThousandSep)
+        *szOut-- = *lpszGrp--; /* Write grouping char */
+
+      dwCurrentGroupCount = 0;
+    }
+  }
+  if (dwState & NF_ROUND)
+    *szOut-- = '1'; /* e.g. .6 > 1.0 */
+  else if (!(dwState & NF_DIGITS_OUT) && lpFormat->LeadingZero)
+    *szOut-- = '0'; /* Add leading 0 if we have no digits before the decimal point */
+
+  /* Add any leading negative or currency sign */
+  while (dwFmt & (CF_MINUS_LEFT|CF_CY_LEFT))
+  {
+    switch (dwFmt & (CF_MINUS_LEFT|CF_MINUS_BEFORE|CF_CY_LEFT))
+    {
+    case CF_MINUS_LEFT:
+    case CF_MINUS_LEFT|CF_CY_LEFT:
+      while (lpszNeg >= lpszNegStart)
+        *szOut-- = *lpszNeg--;
+      dwFmt &= ~CF_MINUS_LEFT;
+      break;
+
+    case CF_CY_LEFT:
+    case CF_CY_LEFT|CF_MINUS_BEFORE:
+    case CF_MINUS_LEFT|CF_MINUS_BEFORE|CF_CY_LEFT:
+      if (dwFmt & CF_CY_SPACE)
+        *szOut-- = ' ';
+      while (lpszCy >= lpszCyStart)
+        *szOut-- = *lpszCy--;
+      dwFmt &= ~(CF_CY_LEFT|CF_MINUS_BEFORE);
+      break;
+    }
+  }
+  if (dwFmt & CF_PARENS)
+    *szOut-- = '(';
+  szOut++;
+
+  iRet = strlenW(szOut) + 1;
+  if (cchOut)
+  {
+    if (iRet <= cchOut)
+      memcpy(lpCurrencyStr, szOut, iRet * sizeof(WCHAR));
+    else
+    {
+      memcpy(lpCurrencyStr, szOut, cchOut * sizeof(WCHAR));
+      lpCurrencyStr[cchOut - 1] = '\0';
+      SetLastError(ERROR_INSUFFICIENT_BUFFER);
+      iRet = 0;
+    }
+  }
+  return iRet;
 }
 
 /* FIXME: Everything below here needs to move somewhere else along with the



More information about the Ros-diffs mailing list