700 memcpy(parent, path, parentlen); |
700 memcpy(parent, path, parentlen); |
701 parent[parentlen] = '\0'; |
701 parent[parentlen] = '\0'; |
702 return parent; |
702 return parent; |
703 } |
703 } |
704 |
704 |
|
705 char* util_size_str(DavBool iscollection, uint64_t contentlength) { |
|
706 char *str = malloc(16); |
|
707 uint64_t size = contentlength; |
|
708 |
|
709 if(iscollection) { |
|
710 str[0] = '\0'; // currently no information for collections |
|
711 } else if(size < 0x400) { |
|
712 snprintf(str, 16, "%" PRIu64 " bytes", size); |
|
713 } else if(size < 0x100000) { |
|
714 float s = (float)size/0x400; |
|
715 int diff = (s*100 - (int)s*100); |
|
716 if(diff > 90) { |
|
717 diff = 0; |
|
718 s += 0.10f; |
|
719 } |
|
720 if(size < 0x2800 && diff != 0) { |
|
721 // size < 10 KiB |
|
722 snprintf(str, 16, "%.1f KiB", s); |
|
723 } else { |
|
724 snprintf(str, 16, "%.0f KiB", s); |
|
725 } |
|
726 } else if(size < 0x40000000) { |
|
727 float s = (float)size/0x100000; |
|
728 int diff = (s*100 - (int)s*100); |
|
729 if(diff > 90) { |
|
730 diff = 0; |
|
731 s += 0.10f; |
|
732 } |
|
733 if(size < 0xa00000 && diff != 0) { |
|
734 // size < 10 MiB |
|
735 snprintf(str, 16, "%.1f MiB", s); |
|
736 } else { |
|
737 size /= 0x100000; |
|
738 snprintf(str, 16, "%.0f MiB", s); |
|
739 } |
|
740 } else if(size < 0x1000000000ULL) { |
|
741 float s = (float)size/0x40000000; |
|
742 int diff = (s*100 - (int)s*100); |
|
743 if(diff > 90) { |
|
744 diff = 0; |
|
745 s += 0.10f; |
|
746 } |
|
747 if(size < 0x280000000 && diff != 0) { |
|
748 // size < 10 GiB |
|
749 snprintf(str, 16, "%.1f GiB", s); |
|
750 } else { |
|
751 size /= 0x40000000; |
|
752 snprintf(str, 16, "%.0f GiB", s); |
|
753 } |
|
754 } else { |
|
755 size /= 1024; |
|
756 float s = (float)size/0x40000000; |
|
757 int diff = (s*100 - (int)s*100); |
|
758 if(diff > 90) { |
|
759 diff = 0; |
|
760 s += 0.10f; |
|
761 } |
|
762 if(size < 0x280000000 && diff != 0) { |
|
763 // size < 10 TiB |
|
764 snprintf(str, 16, "%.1f TiB", s); |
|
765 } else { |
|
766 size /= 0x40000000; |
|
767 snprintf(str, 16, "%.0f TiB", s); |
|
768 } |
|
769 } |
|
770 return str; |
|
771 } |
|
772 |
|
773 char* util_date_str(time_t tm) { |
|
774 struct tm t; |
|
775 struct tm n; |
|
776 time_t now = time(NULL); |
|
777 #ifdef _WIN32 |
|
778 memcpy(&t, localtime(&tm), sizeof(struct tm)); |
|
779 memcpy(&n, localtime(&now), sizeof(struct tm)); |
|
780 #else |
|
781 localtime_r(&tm, &t); |
|
782 localtime_r(&now, &n); |
|
783 #endif /* _WIN32 */ |
|
784 char *str = malloc(16); |
|
785 if(t.tm_year == n.tm_year) { |
|
786 strftime(str, 16, "%b %d %H:%M", &t); |
|
787 } else { |
|
788 strftime(str, 16, "%b %d %Y", &t); |
|
789 } |
|
790 return str; |
|
791 } |
|
792 |
705 |
793 |
706 char* util_xml_get_text(const xmlNode *elm) { |
794 char* util_xml_get_text(const xmlNode *elm) { |
707 xmlNode *node = elm->children; |
795 xmlNode *node = elm->children; |
708 while(node) { |
796 while(node) { |
709 if(node->type == XML_TEXT_NODE) { |
797 if(node->type == XML_TEXT_NODE) { |