This commit is contained in:
german 2025-12-16 13:11:40 +04:00
commit 9586457689
8 changed files with 362 additions and 0 deletions

4
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,4 @@
{
"makefile.configureOnOpen": false,
"C_Cpp.errorSquiggles": "disabled"
}

45
Makefile Normal file
View File

@ -0,0 +1,45 @@
#
# Makefile
#
# Copyright 2025
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
#
CC=gcc
OPTIONS=-O2 -Wall -ansi
OUTPUT_NAME=microconf
COPY=cp
INPUT_NAME=example.c
REMOVE=rm
INSTALL_NAME=/usr/local/bin/microconf-example
MODE=chmod +x
RUN_OF=./
.PHONY: clear run install uninstall
$(OUTPUT_NAME): $(INPUT_NAME)
$(CC) $(OPTIONS) $(INPUT_NAME) -o $(OUTPUT_NAME)
clear:
$(REMOVE) -f $(OUTPUT_NAME)
run:
$(MODE) $(OUTPUT_NAME)
$(RUN_OF)$(OUTPUT_NAME)
install:
$(COPY) $(OUTPUT_NAME) $(INSTALL_NAME)
uninstall:
$(REMOVE) $(INSTALL_NAME)

11
README.md Normal file
View File

@ -0,0 +1,11 @@
# Microconf
Парсер формата конфигурации.
## Пример
Для компиляции примера используйте:
```bash
cd ~/microconf
make clear
make
./microconf```
## Версия
- 1.0 - Бета

85
example.c Normal file
View File

@ -0,0 +1,85 @@
/*
* example.c
*
* Copyright 2025
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#include "microconf.h"
/* Настройки */
#define TEST_FILE "microconf_test.conf"
#define LEN_MAX_VAL 20
#define LEN_MAX_KEY 10
#define VALS_COUNT 3
/* Массивы */
char vals[VALS_COUNT][LEN_MAX_VAL] = {""};
char keys[VALS_COUNT][LEN_MAX_KEY] = {""};
/* Готовый обработчик, требует только имена массивов */
#define INPUT_KEYS_NUM keys
#define INPUT_VALS_NUM vals
#include "handler.h"
/*
*
* Можно определить свой обработчик, например:
*
* save_data_t my_handler(unsigned long num) {
* save_data_t t;
* t.key = keys[num];
* t.value = vals[num];
* return t;
* }
*
*/
int main(void) {
/* Отрыть файл */
file_t fp = fopen(TEST_FILE, "r");
/* Функция:
* int microconf_compile (
* файловая_структура,
* обработчик_ввода,
* максимальная_длинна_ключа,
* максимальная_длинна_значения,
* максимальноеоличество_ключей
* );
*/
int status = microconf_compile(fp, microconf_std_handler, LEN_MAX_KEY, LEN_MAX_VAL, VALS_COUNT);
/* При ошибке - аварийно завершить */
if (status == EXIT_FAILURE) return status;
/* Вывести в консоль */
unsigned char num_read = 0;
while (num_read < 3) {
char* key = keys[num_read];
char* val = vals[num_read];
printf("Key=%s Value=%s\n", key, val);
num_read ++;
}
/* Закрытие файла и успешное завершение программы */
fclose(fp);
return EXIT_SUCCESS;
}

41
handler.h Normal file
View File

@ -0,0 +1,41 @@
/*
* handler.h
*
* Copyright 2025
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#if (!defined(__HANDLERS_H_FILE))
#define __HANDLERS_H_FILE
#include "microconf.h"
#if (!defined(INPUT_KEYS_NUM)) || (!defined(INPUT_VALS_NUM))
#error Please specify array names
#endif
save_data_t microconf_std_handler(unsigned long num) {
save_data_t t;
t.key = INPUT_KEYS_NUM[num];
t.value = INPUT_VALS_NUM[num];
return t;
}
#endif

BIN
microconf Executable file

Binary file not shown.

151
microconf.h Normal file
View File

@ -0,0 +1,151 @@
/*
* microconf.h
*
* Copyright 2025
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#if (!defined(__LIB_MICROCONF_PARSER))
#define __LIB_MICROCONF_PARSER
#define bool char
#define true 1
#define is_space_test(x) (x <= 32 && x >= 0)
#define false 0
#define ulong unsigned long
#include <stdio.h>
#include <stdlib.h>
typedef FILE* file_t;
typedef struct {
char* key;
char* value;
} save_data_t;
int _microconf_read_file(file_t fp, save_data_t (*input_handler) (ulong), size_t max_len, size_t max_len_val, ulong max_cnt) {
int c;
bool is_comment = false;
bool is_space = true;
bool read_key = false;
bool read_val = false;
ulong num = 0;
size_t key_addr = 0;
size_t val_addr = 0;
save_data_t sv = {NULL, NULL};
int old = '\0';
ulong str_num = 0;
while ((c = getc(fp)) != EOF) {
/* Разделитель - перенос строки ('\n') */
if (c == '\n') {
is_comment = false;
is_space = true;
read_key = false;
read_val = false;
key_addr = 0;
val_addr = 0;
str_num ++;
}
/* Считать комментарием все до конца строки */
if (c == '#') is_comment = true;
/* Если символ не входит в комментарий, то: */
if (!is_comment) {
/* Пропустить пробелы в начале строки */
if (is_space && !is_space_test(c)) {
is_space = false;
read_key = true;
if (num == max_cnt) {
puts("\033[1mmicroconf: \033[91mThe memory is full!\033[0m Code: READ_COUNT_ERR");
return EXIT_FAILURE;
}
sv = input_handler(num);
num ++;
key_addr = 0;
val_addr = 0;
}
}
/* Чтение значения */
if (read_val) {
if (c == '\n' || c == '#' || c == EOF) {
val_addr --;
sv.value[val_addr] = '\0';
read_val = false;
}
if (read_val) {
if (sv.value != NULL) {
sv.value[val_addr] = c;
}
val_addr ++;
if (key_addr >= max_len) {
puts("\033[1mmicroconf: \033[91mThe memory is full!\033[0m Code: READ_VAL_ERR");
return EXIT_FAILURE;
}
}
}
/* Чтение ключа */
if (read_key) {
if (c == ':' && old == ':') {
key_addr --;
sv.key[key_addr] = '\0';
read_key = false;
read_val = true;
val_addr = 0;
}
if (read_key) {
if (sv.key != NULL) {
sv.key[key_addr] = c;
}
key_addr ++;
if (key_addr >= max_len) {
puts("\033[1mmicroconf: \033[91mThe memory is full!\033[0m Code: READ_KEY_ERR");
return EXIT_FAILURE;
}
}
}
/* Проверка синтаксиса файла */
if ((c == '\n' || c == '#' || c == EOF) && read_key) {
printf("\033[1mmicroconf: \033[91mSyntax error on line %lu\033[0m\n", str_num);
return EXIT_FAILURE;
}
/* Сохраняем старое значение в переменную */
old = c;
}
return EXIT_SUCCESS;
}
int microconf_compile(file_t fp, save_data_t (*input_handler) (ulong), size_t max_len, size_t max_len_val, ulong max_cnt) {
if (fp == NULL) {
puts("\033[1mmicroconf: \033[91mUnable to open file!\033[0m");
return EXIT_FAILURE;
}
rewind(fp);
return _microconf_read_file(fp, input_handler, max_len, max_len_val, max_cnt);
}
#undef bool
#undef ulong
#undef true
#undef false
#undef is_space_test
#endif

25
microconf_test.conf Normal file
View File

@ -0,0 +1,25 @@
#
# microconf_test.conf
#
# Copyright 2025
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
#
key_1::value_1 # Value
key_2::value_2 # Value
key_3::value_3 # Value