110
|
1 #include <stdio.h> |
|
2 #include <stdlib.h> |
|
3 #include <stdbool.h> |
|
4 #include <string.h> |
|
5 #include <err.h> |
|
6 |
|
7 #include "ini.h" |
|
8 |
|
9 #define LENGTH(x) (sizeof (x)/ sizeof (x[0])) |
|
10 |
|
11 /* |
|
12 * Use this test file with the ini_test.conf like this : |
|
13 * |
|
14 * # |
|
15 * # config file ini_test.conf |
|
16 * # |
|
17 * [general] |
|
18 * nickname = "markand" |
|
19 * email = "markand@malikania.fr" |
|
20 * |
|
21 * [ui] |
|
22 * verbose = true |
|
23 * editor = vim |
|
24 * |
|
25 * # multiple definition |
|
26 * [host] |
|
27 * alias = "freenode" |
|
28 * host = "irc.freenode.net" |
|
29 * port = 6667 |
|
30 * |
|
31 * [host] |
|
32 * alias = "malikania" |
|
33 * host = "irc.malikania.fr" |
|
34 * port = 6667 |
|
35 */ |
|
36 |
|
37 static void |
|
38 list_servers(const INI_Config *config) |
|
39 { |
|
40 /* Server parameters */ |
|
41 char *alias = NULL, *host = NULL; |
|
42 int port = 0; |
|
43 |
|
44 /* Extract server information */ |
|
45 INI_Handler settings[] = { |
|
46 /* option, destination, conversion function */ |
|
47 { "alias", &alias, &ini_convert_string }, |
|
48 { "host", &host, &ini_convert_string }, |
|
49 { "port", &port, &ini_convert_int } |
|
50 }; |
|
51 |
|
52 INI_Section *sc; |
|
53 |
|
54 /* |
|
55 * All sections are added as linked list, so you can just |
|
56 * seek all and keep only the ones you want. |
|
57 */ |
|
58 for (sc = config->sections; sc != NULL; sc = sc->next) { |
|
59 /* Keep only [host] */ |
|
60 if (strcmp(sc->key, "host") != 0) |
|
61 continue; |
|
62 |
|
63 ini_dispatch(sc, settings, LENGTH(settings)); |
|
64 printf("-- new server\n"); |
|
65 printf("-> alias = %s\n", (alias != NULL) ? alias : "<null>"); |
|
66 printf("-> host = %s\n", (host != NULL) ? host : "<null>"); |
|
67 printf("-> port = %d\n", port); |
|
68 |
|
69 free(alias); alias = NULL; |
|
70 free(host); host = NULL; |
|
71 } |
|
72 } |
|
73 |
|
74 static void |
|
75 list_options(const INI_Config *config) |
|
76 { |
|
77 char *nickname = NULL, *email = NULL, *editor = NULL; |
|
78 bool verbose = 0; |
|
79 |
|
80 /* Extract [general] to their values */ |
|
81 INI_Handler general[] = { |
|
82 /* option, destination, conversion function */ |
|
83 { "nickname", &nickname, &ini_convert_string }, |
|
84 { "email", &email, &ini_convert_string } |
|
85 }; |
|
86 |
|
87 /* Extract [ui] to their values */ |
|
88 INI_Handler ui[] = { |
|
89 /* option, destination, conversion function */ |
|
90 { "verbose", &verbose, &ini_convert_bool }, |
|
91 { "editor", &editor, &ini_convert_string } |
|
92 }; |
|
93 |
|
94 INI_Section *sc; |
|
95 |
|
96 /* Always check if the section is present before dispatching */ |
|
97 if ((sc = ini_select_section(config, "general")) != NULL) |
|
98 ini_dispatch(sc, general, LENGTH(general)); |
|
99 if ((sc = ini_select_section(config, "ui")) != NULL) |
|
100 ini_dispatch(sc, ui, LENGTH(ui)); |
|
101 |
|
102 printf("-- general\n"); |
|
103 printf("-> nickname = %s\n", (nickname != NULL) ? nickname : "<null>"); |
|
104 printf("-> email = %s\n", (email != NULL) ? email : "<null>"); |
|
105 printf("-- ui\n"); |
|
106 printf("-> verbose = %s\n", (verbose) ? "true" : "false"); |
|
107 printf("-> editor = %s\n", (editor != NULL) ? editor : "<null>"); |
|
108 |
|
109 free(nickname); free(email); free(editor); |
|
110 } |
|
111 |
|
112 static void |
|
113 list_raw(const INI_Config *config) |
|
114 { |
|
115 INI_Section *sc; |
|
116 INI_Option *opt; |
|
117 |
|
118 printf("-- dump of config\n"); |
|
119 for (sc = config->sections; sc != NULL; sc = sc->next) |
|
120 for (opt = sc->options; opt != NULL; opt = opt->next) |
|
121 printf("%s.%s = %s\n", sc->key, opt->key, |
|
122 (opt->value == NULL) ? "<null>" : opt->value); |
|
123 } |
|
124 |
|
125 int |
|
126 main(void) |
|
127 { |
|
128 INI_Config *config; |
|
129 |
|
130 /* |
|
131 * 1. Try to load the file, it may fails (not found, permissions, |
|
132 * memory, ...) so check everytime. |
|
133 * |
|
134 * INI_VERBOSE flag is great to tell the user about typo in file |
|
135 */ |
|
136 if ((config = ini_load("ini_test.conf", INI_VERBOSE)) == NULL) |
|
137 errx(1, "%s", ini_get_error()); |
|
138 |
|
139 /* 2. List all servers found as [host] */ |
|
140 list_servers(config); |
|
141 |
|
142 /* 3. List options from [general] and [ui] */ |
|
143 list_options(config); |
|
144 |
|
145 /* 4. List all options from all sections */ |
|
146 list_raw(config); |
|
147 |
|
148 /* Finally free everything */ |
|
149 ini_free(config, 1, 1); |
|
150 |
|
151 return 0; |
|
152 } |