система модулей

This commit is contained in:
2026-07-24 02:38:57 +08:00
parent 349ea7e91e
commit 30504ce9f4
24 changed files with 1260 additions and 10 deletions

95
src/utils.c Normal file
View File

@@ -0,0 +1,95 @@
#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, "&lt;"); p += 4; i += 4; break;
case '>': strcpy(p, "&gt;"); p += 4; i += 4; break;
case '"': strcpy(p, "&quot;"); p += 6; i += 6; break;
case '&': strcpy(p, "&amp;"); 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';
}