LINUX.ORG.RU

[C89] libconfig - парочка удобных вспомогательных функций


0

1

По ходу разработки одного проекта написал несколько функций, которые позволяют удобно загружать/сохранять данные через libconfig'овские структуры.

https://github.com/zdo/libconfig_helper

Может, кому будет полезно.

Краткое описание:

умеет работать со «скалярными» типами (int, char*, float), массивами скаляров и массивами структур.

Все это в добавок обернуто в небольшую систему логирования. Так что, при возникновении ЛЮБОЙ ошибки в лог (struct hlog, see code) будет записано точное место ошибки с описанием и местом в иерархии (н-р, «exams[0].tests[1].questions[3].text: some error cause»).

Осталось забацать пару примеров. Сейчас они есть только как часть другого проекта - zexam.

★★

libconfig распространяется на условиях LGPL, что позволяет его использовать везде, а твои несколько функций имеют лицензию GPL, что очень сильно ограничивает область применения

Reset ★★★★★
()

1. Приведи пример, показывающий, чем твой helper удобнее стандартного API libconfig'a. На первыйй взгляд: ты просто 5 функций стандартного интерфейса запихнул в одну, добавив параметр type и возвращаешь значения через void *.

2. Тянуть логгер, пишущий в файл - это скорее минус чем плюс.

anonymous
()
Ответ на: комментарий от anonymous

Анон, посмотри не только первые две функции.

bk_ ★★
() автор топика
Ответ на: комментарий от anonymous

пишущий в файл

я работаю через tmpfile()

FILE интерфейс очень удобен

bk_ ★★
() автор топика

Сложно вам, сишникам, живётся.

vasilenko ★★
()

Почитайте, что такое switch и как его использовать. Длинные портянки «if ... else if ... else if ... else if ... else if ...» вызывают чувство неудомения и заставляют задуматься о вас и ваших умениях

anonymous
()

C - это скальпель. на нем намного приятнее получается работать непосредственно с

int config_setting_get_int ( const config_setting_t * setting )
int config_setting_set_int ( config_setting_t * setting, int value )
чем с обобщенными решениями типа
int config_save_scalar(const void *inval, int type,
		       struct config_setting_t *parent_s,
		       const char *child_s_name,
		       struct hlog *log)
int config_load_scalar(void *outval, int type,
		       const struct config_setting_t *parent_s,
		       const char *child_s_name,
		       struct hlog *log)
потому что получается «кака» приходится уточнять типы и городить if'ы

anonymous
()
Ответ на: комментарий от bk_

Получается, что этой штукой никто кроме тебя не будет пользоваться. И нафиг было писать о ней тут?

Reset ★★★★★
()
Ответ на: комментарий от Reset

Если ТЫ ей не будешь пользоваться - флаг тебе в руки.

Ораторы выше и ты, видимо, не понимаете, что эти функции дают значительное уменьшение числа строк кода, когда необходимо не просто загрузить данные из конфига, а проверить все возможные исключительные ситуации и аккуратно их залогировать.

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

Ну дают и что? Если кому-то это понадобится, то он сам напишет этот десяток строк заново с нуля, ибо у тебя GPL.

Reset ★★★★★
()
Ответ на: комментарий от bk_

> Если ТЫ ей не будешь пользоваться - флаг тебе в руки.

Ты на ровном месте создал форк библиотеки, пригодный для использования только в чистых GPL-проектах. Ты хотел именно этого?

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

> А что ты имеешь против чистых GPL-проектов?!

то, что замена всего лишь несколько базовых библиотек на GPL - превратит любой дистрибутив в бесполезную игрушку

aho
()
Ответ на: комментарий от aho

Тут ты прав.

Еще раз повторю - перелицензировать под lgpl не составит труда, если это реально нужно. Возможно, стоит это сделать до появления реальной необходимости. Я подумаю.

bk_ ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.