]> Sergey Matveev's repositories - nnn.git/commitdiff
Replace snprintf for printing file size
authorArun Prakash Jana <engineerarun@gmail.com>
Thu, 4 Jul 2019 19:43:55 +0000 (01:13 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Thu, 4 Jul 2019 19:43:55 +0000 (01:13 +0530)
src/nnn.c

index 881b349cab2fbccd05edced2027cbe758f1728d8..f6e872430628faf97e3bf8745e867edfa2c4d197 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -2133,6 +2133,7 @@ static char *coolsize(off_t size)
        const char * const U = "BKMGTPEZY";
        static char size_buf[12]; /* Buffer to hold human readable size */
        off_t rem = 0;
+       size_t ret;
        int i = 0;
 
        while (size >= 1024) {
@@ -2177,10 +2178,28 @@ static char *coolsize(off_t size)
                        rem /= 10;
        }
 
-       if (i > 0 && i < 6)
-               snprintf(size_buf, 12, "%u.%0*u%c", (uint)size, i & 0b11, (uint)rem, U[i]);
-       else
-               snprintf(size_buf, 12, "%u%c", (uint)size, U[i]);
+       if (i > 0 && i < 6) {
+               ret = xstrlcpy(size_buf, xitoa(size), 11);
+               size_buf[ret - 1] = '.';
+
+               char *frac = xitoa(rem);
+               size_t toprint = i > 3 ? 3 : i;
+               size_t len = strlen(frac);
+
+               if (len < toprint) {
+                       size_buf[ret] = size_buf[ret + 1] = size_buf[ret + 2] = '0';
+                       xstrlcpy(size_buf + ret + (toprint - len), frac, (toprint - len) + 1);
+               } else
+                       xstrlcpy(size_buf + ret, frac, toprint + 1);
+
+               ret += toprint;
+       } else {
+               ret = xstrlcpy(size_buf, size ? xitoa(size) : "0", 10);
+               --ret;
+       }
+
+       size_buf[ret] = U[i];
+       size_buf[ret + 1] = '\0';
 
        return size_buf;
 }