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