[ros-diffs] [jimtabor] 28441: Bug patch 2382 by Zavyalov Alexey. GetCurrencyFormatW() added superfluous group sign in negative numbers and reformatting code.

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Tue Aug 21 00:55:48 CEST 2007


Author: jimtabor
Date: Tue Aug 21 02:55:48 2007
New Revision: 28441

URL: http://svn.reactos.org/svn/reactos?rev=28441&view=rev
Log:
Bug patch 2382 by Zavyalov Alexey. GetCurrencyFormatW() added superfluous group sign in negative numbers and reformatting code.

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=28441&r1=28440&r2=28441&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/lcformat.c (original)
+++ trunk/reactos/dll/win32/kernel32/misc/lcformat.c Tue Aug 21 02:55:48 2007
@@ -1355,290 +1355,370 @@
                               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;
-
-  TRACE("(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)))
-  {
-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;
+    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)
+        {
+            SetLastError(lpFormat && dwFlags ? ERROR_INVALID_FLAGS : ERROR_INVALID_PARAMETER);
+            return 0;
+        }
+        lpFormat = &node->cyfmt;
+        lpszNegStart = lpszNeg = GetNegative(node);
     }
     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;
+    {
+        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
+            }
+        }
         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;
+        {
+            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
-          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--;
+        *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);
+    }
+
+    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
-          *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)
-    {
-      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;
+        {
+            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