libidav/utils.c

changeset 20
db263186edf3
parent 18
af411868ab9b
equal deleted inserted replaced
19:813c97c5b6d3 20:db263186edf3
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 {
838 int diff = (s*100 - (int)s*100); 842 int diff = (s*100 - (int)s*100);
839 if(diff > 90) { 843 if(diff > 90) {
840 diff = 0; 844 diff = 0;
841 s += 0.10f; 845 s += 0.10f;
842 } 846 }
843 if(size < 0x280000000 && diff != 0) { 847 if(dimension < 0x280000000 && diff != 0) {
844 // size < 10 TiB 848 // size < 10 TiB
845 snprintf(str, 16, "%.1f TiB", s); 849 snprintf(str, 16, "%.*f TiB", precision, s);
846 } else { 850 } else {
847 size /= 0x40000000; 851 size /= 0x40000000;
848 snprintf(str, 16, "%.0f TiB", s); 852 snprintf(str, 16, "%.0f TiB", s);
849 } 853 }
850 } 854 }

mercurial