#include #include #include #include #include #include "utils.h" char* my_strcasestr(const char *haystack, const char *needle) { if (!haystack || !needle || *needle == '\0') return (char*)haystack; size_t needle_len = strlen(needle); while (*haystack) { if (strncasecmp(haystack, needle, needle_len) == 0) return (char*)haystack; haystack++; } return NULL; } void html_escape(const char *src, char *dst, size_t dst_size) { if (!src || !dst || dst_size == 0) return; char *p = dst; size_t i = 0; while (*src && i < dst_size - 6) { switch (*src) { case '<': strcpy(p, "<"); p += 4; i += 4; break; case '>': strcpy(p, ">"); p += 4; i += 4; break; case '"': strcpy(p, """); p += 6; i += 6; break; case '&': strcpy(p, "&"); p += 5; i += 5; break; default: *p++ = *src; i++; break; } src++; } *p = '\0'; } void format_size(long long size, char* buffer) { if (size < 1024) snprintf(buffer, 32, "%lld B", size); else if (size < 1024 * 1024) snprintf(buffer, 32, "%.1f KB", size / 1024.0); else if (size < 1024 * 1024 * 1024) snprintf(buffer, 32, "%.1f MB", size / (1024.0 * 1024.0)); else snprintf(buffer, 32, "%.1f GB", size / (1024.0 * 1024.0 * 1024.0)); } void format_date(time_t mtime, char* buffer, size_t size) { struct tm *tm_info = localtime(&mtime); strftime(buffer, size, "%d.%m.%Y", tm_info); } void url_encode(const char *src, char *dst, size_t dst_size) { static const char *hex = "0123456789ABCDEF"; char *p = dst; size_t i = 0; while (*src && i < dst_size - 3) { unsigned char c = (unsigned char)*src; if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || strchr("-_.~", c)) { *p++ = c; i++; } else if (c == ' ') { *p++ = '%'; *p++ = '2'; *p++ = '0'; i += 3; } else { *p++ = '%'; *p++ = hex[(c >> 4) & 0xF]; *p++ = hex[c & 0xF]; i += 3; } src++; } *p = '\0'; } void url_decode_enhanced(const char *src, char *dst, size_t dst_size) { char *p = dst; size_t decoded_len = 0; while (*src && decoded_len < dst_size - 1) { if (*src == '%') { if (src[1] && src[2] && isxdigit(src[1]) && isxdigit(src[2])) { char hex[3] = {src[1], src[2], '\0'}; unsigned char c = (unsigned char)strtol(hex, NULL, 16); if (c >= 0x80 || c >= 0x20 || c == 0x0A || c == 0x0D) { *p++ = c; decoded_len++; } else { *p++ = '_'; decoded_len++; } src += 3; } else { src++; } } else if (*src == '+') { *p++ = ' '; decoded_len++; src++; } else { *p++ = *src++; decoded_len++; } } *p = '\0'; }