96 lines
3.0 KiB
C
96 lines
3.0 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <time.h>
|
|
#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';
|
|
}
|