47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Parse a configuration file into a struct using X-Macros */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <string.h>
 | |
| #include "../ini.h"
 | |
| 
 | |
| /* define the config struct type */
 | |
| typedef struct {
 | |
|     #define CFG(s, n, default) char *s##_##n;
 | |
|     #include "config.def"
 | |
| } config;
 | |
| 
 | |
| /* create one and fill in its default values */
 | |
| config Config = {
 | |
|     #define CFG(s, n, default) default,
 | |
|     #include "config.def"
 | |
| };
 | |
| 
 | |
| /* process a line of the INI file, storing valid values into config struct */
 | |
| int handler(void *user, const char *section, const char *name,
 | |
|             const char *value)
 | |
| {
 | |
|     config *cfg = (config *)user;
 | |
| 
 | |
|     if (0) ;
 | |
|     #define CFG(s, n, default) else if (strcmp(section, #s)==0 && \
 | |
|         strcmp(name, #n)==0) cfg->s##_##n = strdup(value);
 | |
|     #include "config.def"
 | |
| 
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| /* print all the variables in the config, one per line */
 | |
| void dump_config(config *cfg)
 | |
| {
 | |
|     #define CFG(s, n, default) printf("%s_%s = %s\n", #s, #n, cfg->s##_##n);
 | |
|     #include "config.def"
 | |
| }
 | |
| 
 | |
| int main(int argc, char* argv[])
 | |
| {
 | |
|     if (ini_parse("test.ini", handler, &Config) < 0)
 | |
|         printf("Can't load 'test.ini', using defaults\n");
 | |
|     dump_config(&Config);
 | |
|     return 0;
 | |
| }
 | 
