annotate tests/ini_test.c @ 110:a70010512a1f

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