mirror of https://github.com/fairyglade/ly.git
				
				
				
			
		
			
				
	
	
		
			96 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
| # Configator
 | |
| 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](https://github.com/nullgemm/argoat.git)
 | |
| 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.
 | |
| 
 | |
| ## Testing
 | |
| Run `make` to compile an example executable and perform basic testing
 | |
| 
 | |
| ## Using
 | |
| ### TL;DR
 | |
| 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...
 | |
| 
 | |
| ### Details
 | |
| 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);
 | |
| ```
 |