cmd: Improved a FIXME in WMCD_filesize64

K. Wartke kwartke at gmail.com
Sun Aug 15 11:53:08 CDT 2010


---
 programs/cmd/directory.c |   43 ++++++++++++++++++++++++++-----------------
 1 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/programs/cmd/directory.c b/programs/cmd/directory.c
index f397951..6a78efe 100644
--- a/programs/cmd/directory.c
+++ b/programs/cmd/directory.c
@@ -93,27 +93,36 @@ static WCHAR * WCMD_strrev (WCHAR *buff) {
  *
  * Convert a 64-bit number into a WCHARacter string, with commas every three digits.
  * Result is returned in a static string overwritten with each call.
- * FIXME: There must be a better algorithm!
  */
 static WCHAR * WCMD_filesize64 (ULONGLONG n) {
-
+  
   ULONGLONG q;
-  unsigned int r, i;
-  WCHAR *p;
-  static WCHAR buff[32];
-
-  p = buff;
-  i = -3;
+  static WCHAR buffer[27];  /*  only 27 chars are needed, since n can only be
+			     *  2 ^ 65 - 1 (20 digits) + maximum 6 seperators
+			     *  + '\0'
+			     */
+  WCHAR* p;
+  unsigned int i;
+  
+  /* clean buffer */
+  p = buffer;
+  for(i = 0; i++ < 27;)
+  {
+    *p++ = '\0';
+  }
+  
+  /* convert */
+  p = buffer;
+  i = 0;
   do {
-    if (separator && ((++i)%3 == 1)) *p++ = ',';
-    q = n / 10;
-    r = n - (q * 10);
-    *p++ = r + '0';
-    *p = '\0';
-    n = q;
-  } while (n != 0);
-  WCMD_strrev (buff);
-  return buff;
+    q = n % 10;
+    n /= 10;
+    *p++ = '0' + q;
+    if (separator && ((++i)%3 == 0)) *p++ = ',';
+  } while ( n != 0 );
+  *p = '\0';
+  WCMD_strrev (buffer);
+  return buffer;
 }
 
 /*****************************************************************************
-- 
1.7.1


------------jLliteA9nbZLKOObearcwe--




More information about the wine-patches mailing list