Files
dns_service_c/src/decode_hosts.c
T
2025-09-09 13:19:59 +07:00

59 lines
1.4 KiB
C

#include "settings.h"
cJSON *decode_hosts(const char *input) {
if (!input) return NULL;
cJSON *root = cJSON_CreateObject();
if (!root) return NULL;
char *input_copy = strdup(input);
if (!input_copy) {
cJSON_Delete(root);
return NULL;
}
char *save_ptr_line;
char *line = strtok_r(input_copy, "\n", &save_ptr_line);
while (line) {
// Пропускаем пустые строки и комментарии
if (strlen(line) == 0 || line[0] == '#') {
line = strtok_r(NULL, "\n", &save_ptr_line);
continue;
}
// Разбиваем строку на поля
char *fields[1024];
int field_count = 0;
char *save_ptr_field;
char *token = strtok_r(line, " \t", &save_ptr_field);
while (token && field_count < 1024) {
fields[field_count++] = token;
token = strtok_r(NULL, " \t", &save_ptr_field);
}
if (field_count > 0) {
char *key = fields[0];
if (field_count == 1) {
cJSON_AddItemToObject(root, key, cJSON_CreateArray());
} else if (field_count == 2) {
cJSON_AddStringToObject(root, key, fields[1]);
} else {
cJSON *arr = cJSON_CreateArray();
for (int i = 1; i < field_count; i++) {
cJSON_AddItemToArray(arr, cJSON_CreateString(fields[i]));
}
cJSON_AddItemToObject(root, key, arr);
}
}
line = strtok_r(NULL, "\n", &save_ptr_line);
}
free(input_copy);
return root;
}