Configator is a lightweight library for ini config file parsing. This was created to make it easy following the "DRY" coding rule without using macros, and with flexibility in mind.
It integrates very well with the Argoat arguments parser library, by using the same function pointers format. This way, you can easily load settings from an ini file while overloading them with command-line arguments if needed: the handling functions will be the same.
Configator does not use any macro or dynamic memory allocation, and was built in less than 350 lines of C99 code.
Run make
to compile an example executable and perform basic testing
Please see example.c
for the condensed version
(or better, read the actual documentation below).
It is a bit too long to be copied here twice...
Include argoat.h
and compile argoat.c
with your code.
Write the functions that will handle your parameters. They will be called during the parsing process, in the order given by the user
void handle_config_u8(void* data, char** value, const int pars_count)
{
if (pars_count > 0)
{
*((uint8_t*) data) = atoi(*value);
}
}
In your main
, declare the variables to configure.
They will be passed to the corresponding functions as void* data
uint8_t answer = 0;
Declare the arrays of parameters by section, starting with the general section.
If you don't want to handle parameters in some section, just declare it NULL
.
struct configator_param* map_no_section = NULL;
Declare real sections parameters afterwards
struct configator_param map_test_section[] =
{
{"ping", &answer, handle_config_u8},
{"pong", &answer, handle_config_u8},
};
Then group them in the map
struct configator_param* map[] =
{
map_no_section,
map_test_section
};
And declare the sections array. Configator will execute the pointed function
with NULL
arguments at the beginning of each detected section.
You can also declare sections with NULL
parameters, in which case nothing
will be executed.
struct configator_param sections[] =
{
{"network_test", &answer, handle_config_u8},
};
Don't forget to put the right numbers in the lenght variables
uint16_t map_len[] = {0, 2};
uint16_t sections_len = 1;
Then initialize and use configator
struct configator config;
config.map = map;
config.map_len = map_len;
config.sections = sections;
config.sections_len = sections_len;
configator(&config, "config.ini");
printf("answer = %d\n", answer);