libidav/utils.c

changeset 20
db263186edf3
parent 18
af411868ab9b
--- a/libidav/utils.c	Tue Feb 06 19:01:52 2024 +0100
+++ b/libidav/utils.c	Wed Feb 07 17:10:01 2024 +0100
@@ -784,50 +784,54 @@
 }
 
 char* util_size_str(DavBool iscollection, uint64_t contentlength) {
+    return util_size_str2(iscollection, contentlength, contentlength, 1);
+}
+
+char* util_size_str2(DavBool iscollection, uint64_t contentlength, uint64_t dimension, int precision) {
     char *str = malloc(16);
     uint64_t size = contentlength;
-    
+
     if(iscollection) {
         str[0] = '\0'; // currently no information for collections
-    } else if(size < 0x400) {
+    } else if(dimension < 0x400) {
         snprintf(str, 16, "%" PRIu64 " bytes", size);
-    } else if(size < 0x100000) {
+    } else if(dimension < 0x100000) {
         float s = (float)size/0x400;
         int diff = (s*100 - (int)s*100);
         if(diff > 90) {
             diff = 0;
             s += 0.10f;
         }
-        if(size < 0x2800 && diff != 0) {
+        if(dimension < 0x2800 && diff != 0) {
             // size < 10 KiB
-            snprintf(str, 16, "%.1f KiB", s);
+            snprintf(str, 16, "%.*f KiB", precision, s);
         } else {
             snprintf(str, 16, "%.0f KiB", s);
         }
-    } else if(size < 0x40000000) {
+    } else if(dimension < 0x40000000) {
         float s = (float)size/0x100000;
         int diff = (s*100 - (int)s*100);
         if(diff > 90) {
             diff = 0;
             s += 0.10f;
         }
-        if(size < 0xa00000 && diff != 0) {
+        if(dimension < 0xa00000 && diff != 0) {
             // size < 10 MiB
-            snprintf(str, 16, "%.1f MiB", s);
+            snprintf(str, 16, "%.*f MiB", precision, s);
         } else {
             size /= 0x100000;
             snprintf(str, 16, "%.0f MiB", s);
         }
-    } else if(size < 0x1000000000ULL) {
+    } else if(dimension < 0x1000000000ULL) {
         float s = (float)size/0x40000000;
         int diff = (s*100 - (int)s*100);
         if(diff > 90) {
             diff = 0;
             s += 0.10f;
         }
-        if(size < 0x280000000 && diff != 0) {
+        if(dimension < 0x280000000 && diff != 0) {
             // size < 10 GiB
-            snprintf(str, 16, "%.1f GiB", s);
+            snprintf(str, 16, "%.*f GiB", precision, s);
         } else {
             size /= 0x40000000;
             snprintf(str, 16, "%.0f GiB", s);
@@ -840,9 +844,9 @@
             diff = 0;
             s += 0.10f;
         }
-        if(size < 0x280000000 && diff != 0) {
+        if(dimension < 0x280000000 && diff != 0) {
             // size < 10 TiB
-            snprintf(str, 16, "%.1f TiB", s);
+            snprintf(str, 16, "%.*f TiB", precision, s);
         } else {
             size /= 0x40000000;
             snprintf(str, 16, "%.0f TiB", s);

mercurial