Привет, внимательно посмотрел твой инклюд. Идея нормальная — держать конфиг в памяти и писать на диск только при закрытии. Но реализация… мягко говоря, сыроватая. Я бу лучше использовал mxini. А так же вот что заметил при чтении кода ( на сервере не тестировал, лишь пробежался глазами ):
Самый критичный баг — ты вставляешь нулевой байт прямо в середину файла
В макросе _PENIS_SET_VALUE после того, как записал новое значение, у тебя стоит строчка:
penis_buffer[file_id]{start + new_len} = 0;
Проблема в том, что это происходит
после сдвига хвоста буфера. Если после изменённого ключа есть ещё хоть какие-то данные (а они почти всегда есть), ты просто затираешь начало этого хвоста нулевым байтом.
Потом penis_close честно записывает весь буфер на диск через fputchar. В итоге в конфиге появляется \0 посреди файла. Любой нормальный редактор или парсер после этого ключа уже ничего не видит. Данные портятся молча.
Это даже не «можно столкнуться», это
гарантированно происходит при любом изменении существующего ключа, если он не последний в файле.
2. Переполнение массива ключей
Когда ключа ещё нет и ты добавляешь новый, у тебя:
penis_key_pos[file_id][penis_key_count[file_id]++] = pos;
Никакой проверки на PENIS_MAX_KEYS. В open и create ты проверяешь, а здесь — нет. Достаточно добавить больше ключей, чем лимит, и получаешь запись за границы массива. Классика.
3. Разная логика сбора ключей в create и open
В create ты запоминаешь вообще каждый встреченный '='.В open — только первый '=' на строке (из-за флага in_new_line).
После create → close → open поведение библиотеки может измениться. Особенно если в значениях случайно окажется знак равенства.
4. remove криво вырезает строки
Ты останавливаешься на \r или \n, потом иногда пропускаешь только \r, но не всегда забираешь следующий \n. В итоге после нескольких удалений файл начинает зарастать пустыми строками и обрывками переносов. Позиции ключей при этом тоже легко разъезжаются.
5. Тихое обрезание строк до 128 символов
Во всех set_* у тебя new_val[128]. Длинное значение просто молча обрежется. Ни ошибки, ни предупреждения. Для конфигов, где могут быть длинные строки — неприятный сюрприз.
Так то код хороший, более менее читабельный, но я бы лучше использовал mxIni. Он надежнее, хоть и чуть уступает в скорости.
ред: p.s. для написания темы на форуме ты использовал нейронку. Так что не стоит обвинять меня в том что я писал через нее XML-теги. Ты сделал можно сказать тоже самое.