--- 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);