782 parent[parentlen] = '\0'; |
782 parent[parentlen] = '\0'; |
783 return parent; |
783 return parent; |
784 } |
784 } |
785 |
785 |
786 char* util_size_str(DavBool iscollection, uint64_t contentlength) { |
786 char* util_size_str(DavBool iscollection, uint64_t contentlength) { |
|
787 return util_size_str2(iscollection, contentlength, contentlength, 1); |
|
788 } |
|
789 |
|
790 char* util_size_str2(DavBool iscollection, uint64_t contentlength, uint64_t dimension, int precision) { |
787 char *str = malloc(16); |
791 char *str = malloc(16); |
788 uint64_t size = contentlength; |
792 uint64_t size = contentlength; |
789 |
793 |
790 if(iscollection) { |
794 if(iscollection) { |
791 str[0] = '\0'; // currently no information for collections |
795 str[0] = '\0'; // currently no information for collections |
792 } else if(size < 0x400) { |
796 } else if(dimension < 0x400) { |
793 snprintf(str, 16, "%" PRIu64 " bytes", size); |
797 snprintf(str, 16, "%" PRIu64 " bytes", size); |
794 } else if(size < 0x100000) { |
798 } else if(dimension < 0x100000) { |
795 float s = (float)size/0x400; |
799 float s = (float)size/0x400; |
796 int diff = (s*100 - (int)s*100); |
800 int diff = (s*100 - (int)s*100); |
797 if(diff > 90) { |
801 if(diff > 90) { |
798 diff = 0; |
802 diff = 0; |
799 s += 0.10f; |
803 s += 0.10f; |
800 } |
804 } |
801 if(size < 0x2800 && diff != 0) { |
805 if(dimension < 0x2800 && diff != 0) { |
802 // size < 10 KiB |
806 // size < 10 KiB |
803 snprintf(str, 16, "%.1f KiB", s); |
807 snprintf(str, 16, "%.*f KiB", precision, s); |
804 } else { |
808 } else { |
805 snprintf(str, 16, "%.0f KiB", s); |
809 snprintf(str, 16, "%.0f KiB", s); |
806 } |
810 } |
807 } else if(size < 0x40000000) { |
811 } else if(dimension < 0x40000000) { |
808 float s = (float)size/0x100000; |
812 float s = (float)size/0x100000; |
809 int diff = (s*100 - (int)s*100); |
813 int diff = (s*100 - (int)s*100); |
810 if(diff > 90) { |
814 if(diff > 90) { |
811 diff = 0; |
815 diff = 0; |
812 s += 0.10f; |
816 s += 0.10f; |
813 } |
817 } |
814 if(size < 0xa00000 && diff != 0) { |
818 if(dimension < 0xa00000 && diff != 0) { |
815 // size < 10 MiB |
819 // size < 10 MiB |
816 snprintf(str, 16, "%.1f MiB", s); |
820 snprintf(str, 16, "%.*f MiB", precision, s); |
817 } else { |
821 } else { |
818 size /= 0x100000; |
822 size /= 0x100000; |
819 snprintf(str, 16, "%.0f MiB", s); |
823 snprintf(str, 16, "%.0f MiB", s); |
820 } |
824 } |
821 } else if(size < 0x1000000000ULL) { |
825 } else if(dimension < 0x1000000000ULL) { |
822 float s = (float)size/0x40000000; |
826 float s = (float)size/0x40000000; |
823 int diff = (s*100 - (int)s*100); |
827 int diff = (s*100 - (int)s*100); |
824 if(diff > 90) { |
828 if(diff > 90) { |
825 diff = 0; |
829 diff = 0; |
826 s += 0.10f; |
830 s += 0.10f; |
827 } |
831 } |
828 if(size < 0x280000000 && diff != 0) { |
832 if(dimension < 0x280000000 && diff != 0) { |
829 // size < 10 GiB |
833 // size < 10 GiB |
830 snprintf(str, 16, "%.1f GiB", s); |
834 snprintf(str, 16, "%.*f GiB", precision, s); |
831 } else { |
835 } else { |
832 size /= 0x40000000; |
836 size /= 0x40000000; |
833 snprintf(str, 16, "%.0f GiB", s); |
837 snprintf(str, 16, "%.0f GiB", s); |
834 } |
838 } |
835 } else { |
839 } else { |