LINUX.ORG.RU

[UNIX]Прямой аналог QSettings на чистом Си

 


0

1

В общем что-то такое, как QSettings, но на чистом си и сугобо для системных целей. В общем хранилка конфигурации. О всяких GConf не стоит говорить, надо что-нибудь предельно легкое. А писать враппер для конфигов слишком тяжко, XML - слишком громоздко.

В Glib есть Key-Value parser (GKeyFile).

Написать самому нельзя? Думаю что это было бы не очень трудно.

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

В Glib есть Key-Value parser (GKeyFile).

Glib - не тяжеловато ли, для системного софта?

Написать самому нельзя? Думаю что это было бы не очень трудно.

Можно конечно, но что-то я сомневаюсь, что нет стандартных решений.

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

> Написать самому нельзя? Думаю что это было бы не очень трудно.

Хватит уже изобретать велосипеды!

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

Еще есть libconfuse. Поддерживает более сложные форматы данных, в частности списки. Использовалась во втором авесоме.

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

Могу дать функции, которые я написал для этой либы для своего проекта, которые инкапсулируют сохранение-загрузку отдельных скалярных элементов, векторов этих скаляров и списков отдельных объектов.

Хидер выглядит так:

#ifndef _ZEXAM_CORE_CFG_H_
#define _ZEXAM_CORE_CFG_H_

#include <libconfig.h>
#include "zlog.h"

int cfg_load_scalar(void *outval, int type, 
		    const struct config_setting_t *parent_s,
		    const char *child_s_name,
		    struct zlog *log);

int cfg_save_scalar(const void *inval, int type,
		    struct config_setting_t *parent_s,
		    const char *child_s_name,
		    struct zlog *log);

int cfg_load_vec(void **outval, size_t *outcount, int type, 
		 const struct config_setting_t *parent_s,
		 const char *child_s_name,
		 struct zlog *log);

int cfg_save_vec(const void *inval, size_t count, int type,
		 struct config_setting_t *parent_s,
		 const char *child_s_name,
		 struct zlog *log);

typedef void (* cfg_initfn)(void *);
typedef void (* cfg_destroyfn)(void *);
typedef int (* cfg_loadfn)(void *, const void *, int, void *);
typedef int (* cfg_savefn)(const void *, void *, int ,void *);

int cfg_load_list(void **outval, size_t *count, size_t structsize, 
		  cfg_initfn initfn, cfg_destroyfn destroyfn,
		  cfg_loadfn loadfn, int load_mode,
		  const struct config_setting_t *parent_s,
		  const char *child_s_name,
		  struct zlog *log);

int cfg_save_list(void *children, size_t count, size_t structsize,
		  cfg_savefn savefn, int save_mode,
		  struct config_setting_t *parent_s,
		  const char *child_s_name,
		  struct zlog *log);

int cfg_load_obj_from_file(void *obj, cfg_loadfn loadfn,
			   int mode, const char *fpath, struct zlog *log);

int cfg_save_obj_to_file(void *obj, cfg_savefn savefn,
			 int mode, const char *fpath, struct zlog *log);

#endif

Использоваие выглядит следующим образом:

int zquestion_save(const struct zquestion *q, struct config_setting_t *s,
		   int mode, struct zlog *log)
{
	int status;

	status = cfg_save_scalar(&q->index, CONFIG_TYPE_INT, s, CFG_INDEX, log);
	if (status != 0) return -1;

	status = cfg_save_scalar(&q->text, CONFIG_TYPE_STRING, s, CFG_TEXT, log);
	if (status != 0) return -1;

	status = cfg_save_list(q->answers, q->nb_answers, sizeof(struct zanswer),
			       zanswer_save, mode, s, CFG_ANSWERS, log);
	if (status != 0) return -1;

	if (mode == MODE_SERVER) {
		status = cfg_save_scalar(&q->price, CONFIG_TYPE_FLOAT, s, 
					 CFG_PRICE, log);
		if (status != 0) return -1;

		status = cfg_save_scalar(&q->check_mode, CONFIG_TYPE_INT, s, 
					 CFG_CHECK_MODE, log);
		if (status != 0) return -1;		
	}

	return 0;
}

Очень удобная для меня вещь.

bk_ ★★
()

glib, libxml2 ест ьпрактически везде. С другой стороны если конфиги совсем маленькие, можно и ini-парсер какой-нибудь заюзать. И встроить прямо в проект.

tensai_cirno ★★★★★
()

Если у тебя конфиг просто Ключ-Значение, то там писанины на 10 минут.

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