--- /dev/null
+/* 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;
+}