]> oss.titaniummirror.com Git - repo_shell.git/blobdiff - inih/examples/ini_xmacros.c
Add support for /etc/repo_shell.cfg
[repo_shell.git] / inih / examples / ini_xmacros.c
diff --git a/inih/examples/ini_xmacros.c b/inih/examples/ini_xmacros.c
new file mode 100644 (file)
index 0000000..a2cab43
--- /dev/null
@@ -0,0 +1,46 @@
+/* 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;
+}