annotate ini.c @ 89:1dcf1b92fc46

Remove abandonned module
author David Demelier <markand@malikania.fr>
date Wed, 30 Nov 2011 11:08:04 +0100
parents d27a6fd446ea
children 145493469aa0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
2 * ini.c -- parse .ini like files
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2011, David Demelier <markand@malikania.fr>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <sys/queue.h>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdio.h>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <stdlib.h>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <stdarg.h>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <string.h>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <ctype.h>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <errno.h>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
27 #include "ini.h"
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
81
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
29 /* -------------------------------------------------------- */
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
30 /* structure definitions */
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
31 /* -------------------------------------------------------- */
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
33 struct ini_option {
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 char *key; /* option name */
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 char *value; /* option value */
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
36 STAILQ_ENTRY(ini_option) next;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 };
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
39 struct ini_section {
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 char *key; /* section key */
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
41 STAILQ_HEAD(, ini_option) options;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
42 STAILQ_ENTRY(ini_section) next;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 };
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
45 struct ini_config {
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 const char *path; /* file path */
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
47 int flags; /* optional flags */
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
48 int ignore; /* must ignore (no redefine) */
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
49
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
50 /* Current section in file */
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
51 struct ini_section *current;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
52
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
53 /* Current file line properties */
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
54 char *line; /* line buffer */
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 int lineno; /* number of line */
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
56 int linesize; /* initial line size */
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
57
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 /* For querying functions */
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
59 STAILQ_HEAD(, ini_section) sections;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 };
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
87
d27a6fd446ea Get rid of mixed case
David Demelier <markand@malikania.fr>
parents: 86
diff changeset
62 static char ini_error[1024 + 1];
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
81
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
64 /* -------------------------------------------------------- */
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
65 /* prototypes */
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
66 /* -------------------------------------------------------- */
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
67
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
68 static void *ini_read(struct ini_config *, FILE *);
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
69 static int ini_getline(struct ini_config *, FILE *);
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
70 static void *ini_readline(struct ini_config *);
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
71 static int ini_switch(struct ini_config *, char **);
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
72 static int ini_register(struct ini_config *, char **);
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
73 static void *ini_fatal(struct ini_config *, FILE *, const char *, ...);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 static char *xstrndup(const char *, size_t);
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
75 static struct ini_option *xoptiondup(const struct ini_option *option);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
77 #define I_VERBOSE(file) ((file)->flags & INI_VERBOSE)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
78 #define I_NOREDEFINE(file) ((file)->flags & INI_NOREDEFINE)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
79 #define I_FAILERROR(file) ((file)->flags & INI_FAILERROR)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
81 #define SKIP_SPACES(lp) while (isspace(*lp) && *lp != '\0') ++lp
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 #define WARN(file, fmt, ...) \
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 if (I_VERBOSE((file))) \
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 fprintf(stderr, fmt, __VA_ARGS__)
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
85
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
86 /* --------------------------------------------------------
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
87 * public functions
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
88 * -------------------------------------------------------- */
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
89
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
90 struct ini_config *
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
91 ini_load(const char *path, int flags)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 {
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 FILE *fp;
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
94 struct ini_config *conf;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
95
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
96 if ((conf = calloc(1, sizeof (struct ini_config))) == NULL)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
97 return ini_fatal(conf, fp, "%s", strerror(errno));
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 if ((fp = fopen(path, "r")) == NULL)
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
100 return ini_fatal(conf, fp, "%s: %s", path, strerror(errno));
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
101
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
102 if ((conf->line = calloc(1024 + 1, 1)) == NULL)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
103 return ini_fatal(conf, fp, "%s", strerror(errno));
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
105 STAILQ_INIT(&conf->sections);
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
106 conf->path = path;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
107 conf->flags = flags;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
108 conf->ignore = 1;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
109 conf->lineno = 1;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
110 conf->linesize = 1024;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
111
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
112 return ini_read(conf, fp);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
114
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 /*
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
116 * Returns a NULL terminated list of section names. If parameter
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 * number is not NULL, number is set to the total number of
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 * section correctly parsed.
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 */
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 char **
81
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
122 ini_get_sections_names(const struct ini_config *conf, int *number)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 {
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
124 struct ini_section *s;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 char **list;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 int i;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 i = 0;
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
129 STAILQ_FOREACH(s, &conf->sections, next)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
130 ++ i;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
131
81
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
132 /* For safety */
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
133 if (number != NULL)
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
134 *number = 0;
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
135
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
136 if ((list = calloc(i + 1, sizeof (char *))) == NULL)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
137 return NULL;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
138
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 if (number != NULL)
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 *number = i;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
141
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
142 i = 0;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
143 STAILQ_FOREACH(s, &conf->sections, next)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
144 list[i++] = s->key;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
145
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
146 return list;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
147 }
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
148
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
149 /*
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
150 * Returns a NULL terminated list of struct ini_section that could be used
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
151 * with ini_get_option(). This function makes sense only when the config
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
152 * has multiple definition enabled.
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
153 */
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
154
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
155 struct ini_section **
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
156 ini_get_sections(const struct ini_config *conf, const char *key, int *nb)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
157 {
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
158 struct ini_section **list;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
159 struct ini_section *s;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
160 int i;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
161
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
162 /* Do not use this function on simple config */
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
163 if (I_NOREDEFINE(conf)) {
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
164 errno = EINVAL;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
165 return NULL;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
166 }
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
167
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
168 i = 0;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
169 STAILQ_FOREACH(s, &conf->sections, next)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
170 if (strcmp(s->key, key) == 0)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
171 ++ i;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
172
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
173 if ((list = calloc(i + 1, sizeof (struct ini_section *))) == NULL)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 return NULL;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
175
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
176 if (nb != NULL)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
177 *nb = i;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
178
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 i = 0;
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
180 STAILQ_FOREACH(s, &conf->sections, next)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
181 if (strcmp(s->key, key) == 0)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
182 list[i++] = s;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
183
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 return list;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
186
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 /*
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 * Select the section for further query. This improves performance as it does
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
189 * not need to seek each time the section. It can't be used when multiple
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
190 * definition is enabled because it seek from the beginning, you should use
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
191 * ini_get_sections() and then ini_get_option() for each section.
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 */
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
193
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
194 struct ini_section *
81
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
195 ini_select_section(const struct ini_config *conf, const char *section)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 {
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
197 struct ini_section *s;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
199 STAILQ_FOREACH(s, &conf->sections, next)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
200 if (strcmp(s->key, section) == 0)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
201 return s;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
202
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 return NULL;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
205
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 /*
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
207 * Wrapper for a simpler usage of ini_select and ini_option. This
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 * does not modify the selector so you can safely continue the
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
209 * call to ini_option independantly. Warning, this function returns the
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 * first occurence of the option so it is not advised to use it
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 */
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
212
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 char *
86
ff1fcb6e385f Fix a possible infinite loop
David Demelier <markand@malikania.fr>
parents: 85
diff changeset
214 ini_get_option_once(const struct ini_config *conf, const char *sect, const char *key)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 {
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
216 struct ini_option *o;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
217 struct ini_section *s;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
218
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
219 STAILQ_FOREACH(s, &conf->sections, next)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 if (strcmp(s->key, sect) == 0)
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 break;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
222
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 STAILQ_FOREACH(o, &s->options, next)
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 if (strcmp(o->key, key) == 0)
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 return o->value;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
226
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 return NULL;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
229
73
653d583376c9 Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents: 72
diff changeset
230 /*
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
231 * Return a NULL list of all available options in the section.
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
232 */
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
233
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
234 char **
81
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
235 ini_get_option_names(const struct ini_section *section, int *nb)
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
236 {
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
237 char **list;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
238 struct ini_option *o;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
239 int i;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
240
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
241 i = 0;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
242 STAILQ_FOREACH(o, &section->options, next)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
243 ++ i;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
244
81
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
245 if (nb != NULL)
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
246 *nb = i;
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
247
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
248 if ((list = calloc(i + 1, sizeof (char *))) == NULL)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
249 return NULL;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
250
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
251 if (nb != NULL)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
252 *nb = i;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
253
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
254 i = 0;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
255 STAILQ_FOREACH(o, &section->options, next)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
256 list[i++] = o->key;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
257
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
258 return list;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
259 }
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
260
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
261 /*
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
262 * Get the option in the current selected option. Note, you must call
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
263 * ini_select() before using this function. Returns the value of
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
264 * key or NULL if the option does not exists.
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
265 */
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
266
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
267 char *
81
f42bcb9e7b4a Add const and little security fix with *nb pointer
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
268 ini_get_option(const struct ini_section *section, const char *key)
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
269 {
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
270 struct ini_option *o;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
271
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
272 STAILQ_FOREACH(o, &section->options, next)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
273 if (strcmp(o->key, key) == 0)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
274 return o->value;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
275
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
276 return NULL;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
277 }
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
278
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
279 /*
82
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
280 * These section provide very small API to convert value
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
281 * and store them to the dst pointer. Because you can also
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
282 * use your own handlers, the user data here can't be used.
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
283 */
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
284
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
285 void
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
286 ini_value_dispatch(struct ini_config *config, struct ini_handler *hdrs, int length)
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
287 {
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
288 const char *sectionName;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
289 int i;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
290 char *value;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
291 struct ini_section *section;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
292
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
293 sectionName = NULL;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
294 for (i = 0; i < length; ++i) {
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
295 /* Do not select the same section for performance. */
83
f028a84bc3f1 Fix an error
David Demelier <markand@malikania.fr>
parents: 82
diff changeset
296 if (sectionName == NULL || strcmp(hdrs[i].section, sectionName) != 0) {
82
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
297 sectionName = hdrs[i].section;
83
f028a84bc3f1 Fix an error
David Demelier <markand@malikania.fr>
parents: 82
diff changeset
298 section = ini_select_section(config, hdrs[i].section);
82
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
299 }
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
300
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
301 /* Skip the section if does not exists in the config */
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
302 if (section == NULL)
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
303 continue;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
304
85
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
305 value = ini_get_option(section, hdrs[i].option);
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
306 hdrs[i].handler(hdrs[i].dst, value, hdrs[i].userdata);
82
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
307 }
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
308 }
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
309
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
310 void
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
311 ini_convert_bool(void *dst, const char *value, void *dummy)
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
312 {
84
89e4d8d63bfa Fix a conversion failure in ini
David Demelier <markand@malikania.fr>
parents: 83
diff changeset
313 char *p = dst;
82
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
314
85
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
315 if (value == NULL)
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
316 return ;
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
317
82
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
318 if (strcmp(value, "yes") == 0 ||
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
319 strcmp(value, "true") == 0 ||
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
320 strcmp(value, "1") == 0)
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
321 *p = 1;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
322 else
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
323 *p = 0;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
324 (void)dummy;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
325 }
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
326
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
327
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
328 void
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
329 ini_convert_int(void *dst, const char *value, void *dummy)
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
330 {
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
331 int *p = dst;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
332
85
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
333 if (value == NULL)
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
334 return ;
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
335
82
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
336 *p = (int) strtol(value, NULL, 10);
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
337 (void)dummy;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
338 }
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
339
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
340 void
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
341 ini_convert_short(void *dst, const char *value, void *dummy)
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
342 {
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
343 short *p = dst;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
344
85
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
345 if (value == NULL)
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
346 return ;
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
347
82
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
348 *p = (short) strtol(value, NULL, 10);
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
349 (void)dummy;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
350 }
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
351
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
352 void
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
353 ini_convert_string(void *dst, const char *value, void *dummy)
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
354 {
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
355 char **p = dst;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
356
85
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
357 if (value == NULL)
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
358 *p = NULL;
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
359 else
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
360 *p = strdup(value);
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
361
82
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
362 (void)dummy;
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
363 }
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
364
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
365 /*
73
653d583376c9 Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents: 72
diff changeset
366 * Return the last error or "No error" if there is not error at all.
653d583376c9 Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents: 72
diff changeset
367 */
653d583376c9 Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents: 72
diff changeset
368
653d583376c9 Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents: 72
diff changeset
369 char *
87
d27a6fd446ea Get rid of mixed case
David Demelier <markand@malikania.fr>
parents: 86
diff changeset
370 ini_get_error(void)
73
653d583376c9 Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents: 72
diff changeset
371 {
87
d27a6fd446ea Get rid of mixed case
David Demelier <markand@malikania.fr>
parents: 86
diff changeset
372 if (ini_error[0] == '\0')
73
653d583376c9 Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents: 72
diff changeset
373 return "No error";
653d583376c9 Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents: 72
diff changeset
374
87
d27a6fd446ea Get rid of mixed case
David Demelier <markand@malikania.fr>
parents: 86
diff changeset
375 return ini_error;
73
653d583376c9 Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents: 72
diff changeset
376 }
653d583376c9 Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents: 72
diff changeset
377
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
378 void
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
379 ini_free(struct ini_config *conf, int freeSections, int freeOptions)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 {
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
381 struct ini_section *s, *stmp;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
382 struct ini_option *o, *otmp;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
383
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
384 STAILQ_FOREACH_SAFE(s, &conf->sections, next, stmp) {
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
385 STAILQ_FOREACH_SAFE(o, &s->options, next, otmp) {
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
386 if (freeOptions) {
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 free(o->key);
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
388 free(o->value);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
389
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
390 STAILQ_REMOVE(&s->options, o, ini_option, next);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 free(o);
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
392 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
393 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
394
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
395 if (freeSections)
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
396 free(s->key);
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
397
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
398 STAILQ_REMOVE(&conf->sections, s, ini_section, next);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 free(s);
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
400 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
401
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
402 free(conf);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
403 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
404
82
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
405 /* --------------------------------------------------------
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
406 * private functions
c8bbdbedcf07 Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents: 81
diff changeset
407 * -------------------------------------------------------- */
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
408
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
409 /*
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
410 * Read file line per line and try to parse ini like file. Lines
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
411 * starting with # or empty line are ignored. Returns the file
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
412 * on success and NULL on failure.
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
413 */
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
414
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
415 static void *
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
416 ini_read(struct ini_config *conf, FILE *fp)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
417 {
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
418 while (ini_getline(conf, fp) == 0) {
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
419 if (ini_readline(conf) == NULL) {
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
420 free(conf->line);
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
421 ini_free(conf, 1, 1);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
422
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
423 fclose(fp);
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
424 return NULL;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
425 }
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
426
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
427 ++ conf->lineno;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
428 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
429
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
430 /* Clean up */
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
431 free(conf->line);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
432 fclose(fp);
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
433
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
434 return conf;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
435 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
436
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
437 /*
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
438 * Read the next line until the next '\n' character is found. Returns 0
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
439 * if the system had enough memory or -1 on allocation failure or on
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
440 * end of file.
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
441 */
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
442
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
443 static int
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
444 ini_getline(struct ini_config *conf, FILE *fp)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
445 {
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
446 int ch, pos;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
447
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
448 memset(conf->line, 0, conf->linesize);
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
449 pos = 0;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
450
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
451 while ((ch = fgetc(fp)) != '\n') {
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
452 if (feof(fp) || ferror(fp))
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
453 return -1;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
454
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
455 /* End of buffer, realloc */
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
456 if (pos == conf->linesize) {
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
457 conf->line = realloc(conf->line, conf->linesize + 513);
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
458 if (conf->line == NULL)
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
459 return -1;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
460
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
461 conf->linesize += 512;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
462 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
463
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
464 conf->line[pos++] = ch;
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
465 }
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
466
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
467 conf->line[pos] = '\0';
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
468
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
469 return 0;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
470 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
471
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
472 /*
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
473 * Read the next line that have been successfully read. Returns NULL
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
474 * on allocation failure (instanciation of new section or option)
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
475 * or the file on success.
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
476 */
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
477
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
478 static void *
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
479 ini_readline(struct ini_config *conf)
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
480 {
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
481 char *lp;
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
482 int (*handler)(struct ini_config *, char **);
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
483
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
484 lp = conf->line;
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
485 SKIP_SPACES(lp);
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
486
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
487 /* Ignore empty line or comment */
75
37fa222d7cc6 Use ';' as comment with #
David Demelier <markand@malikania.fr>
parents: 74
diff changeset
488 if (*lp == '\0' || *lp == '#' || *lp == ';')
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
489 return conf;
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
490
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
491 while (*lp != '\0') {
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
492 SKIP_SPACES(lp);
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
493
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
494 /* Skip comments again and empty lines */
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
495 if (*lp == '\0' || *lp == '#' || *lp == ';')
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
496 return conf;
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
497
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
498 #ifdef INI_DEBUG
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
499 printf("-- line[%d] == [%s]\n", conf->lineno, conf->line);
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
500 #endif
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
501
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
502 if (*lp == '[')
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
503 handler = &ini_switch;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
504 else if (!conf->ignore)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
505 handler = &ini_register;
86
ff1fcb6e385f Fix a possible infinite loop
David Demelier <markand@malikania.fr>
parents: 85
diff changeset
506 else {
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
507 handler = NULL;
86
ff1fcb6e385f Fix a possible infinite loop
David Demelier <markand@malikania.fr>
parents: 85
diff changeset
508 ++ lp;
ff1fcb6e385f Fix a possible infinite loop
David Demelier <markand@malikania.fr>
parents: 85
diff changeset
509 }
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
510
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
511 /* Success or not? */
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
512 if (handler != NULL && handler(conf, &lp) < 0)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
513 return (I_FAILERROR(conf)) ? NULL : conf;
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
514
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
515 SKIP_SPACES(lp);
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
516 }
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
517
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
518 return conf;
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
519 }
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
520
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
521 /* On failure, seek next space */
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
522 #define SEEK_NEXT(lp) \
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
523 for (; !isspace(**lp) && **lp != '\0'; ++(*lp)) \
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
524 continue;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
525
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
526 /* On other failure seek until the next line '\0' */
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
527 #define SEEK_NL(lp) \
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
528 for (; !isspace(**lp) && **lp != '\0'; ++(*lp))
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
529
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
530 /*
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
531 * Parse the new section (function called when '[' is found). Returns
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
532 * 0 or parse error (to avoid ini_readling from stopping) or -1 on
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
533 * allocation failure.
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
534 */
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
535
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
536 static int
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
537 ini_switch(struct ini_config *conf, char **lp)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
538 {
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
539 char *endSection;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
540
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
541 /* Section not parsed, ignore next option to prevent breakage */
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
542 if ((endSection = strchr(*lp, ']')) == NULL) {
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
543 WARN(conf, "line %d: parse error\n", conf->lineno);
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
544 SEEK_NEXT(lp);
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
545 return (conf->ignore = 1) - 2; /* single line rocks */
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
546 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
547
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
548 /* Redefinition of previous and not allowed */
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
549 ++(*lp);
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
550 if (conf->current != NULL && I_NOREDEFINE(conf) &&
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
551 (strncmp(conf->current->key, *lp, endSection - *lp)) == 0) {
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
552 WARN(conf, "line %d: redefining %s\n", conf->lineno, conf->current->key);
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
553 SEEK_NEXT(lp);
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
554 return (conf->ignore = 1) - 2;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
555 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
556
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
557 if ((conf->current = malloc(sizeof (struct ini_section))) == NULL)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
558 return -1;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
559
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
560 if ((conf->current->key = xstrndup(*lp, endSection - *lp)) == NULL) {
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
561 free(conf->current);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
562 return -1;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
563 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
564
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
565 *lp = endSection + 1;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
566
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
567 #ifdef INI_DEBUG
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
568 printf("-- current section is now [%s]\n", conf->current->key);
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
569 #endif
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
570
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
571 /* Finally add the new section to the config */
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
572 STAILQ_INIT(&conf->current->options);
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
573 STAILQ_INSERT_TAIL(&conf->sections, conf->current, next);
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
574
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
575 return (conf->ignore = 0);
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
576 }
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
577
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
578 /*
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
579 * Store the new option that have been parsed. Returns 0 on success or
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
580 * on parse error (to avoid ini_readline from stopping) and -1 on
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
581 * allocation failure.
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
582 */
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
583
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
584 static int
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
585 ini_register(struct ini_config *conf, char **lp)
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
586 {
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
587 char *assignKey, *endKey, *endValue, token = '\0';
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
588 int length = 0;
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
589 struct ini_option *option, tmp;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
590
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
591 /* No '=' found */
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
592 if ((assignKey = strchr(*lp, '=')) == NULL) {
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
593 WARN(conf, "line %d: missing '='\n", conf->lineno);
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
594 SEEK_NEXT(lp);
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
595 return -1;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
596 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
597
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
598 /* Find end of option */
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
599 endKey = *lp;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
600 for (; !isspace(*endKey) && *endKey != '\0' && *endKey != '='; ++endKey)
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
601 continue;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
602
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
603 /* Do not register empty option name */
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
604 if (endKey - *lp <= 0) {
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
605 WARN(conf, "line %d: 0-length option\n", conf->lineno);
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
606 SEEK_NL(lp);
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
607 return -1;
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
608 }
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
609
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
610 memset(&tmp, 0, sizeof (struct ini_option));
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
611 if ((tmp.key = xstrndup(*lp, endKey - *lp)) == NULL)
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
612 return -1;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
613
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
614 endValue = &assignKey[1];
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
615 SKIP_SPACES(endValue);
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
616
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
617 /* Find end of option value */
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
618 token = *endValue;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
619 if (token == '\'' || token == '"') {
85
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
620 for (*lp = ++endValue; *endValue != token &&
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
621 *endValue != '\0'; ++endValue)
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
622 continue;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
623
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
624 length = endValue - *lp;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
625
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
626 /* Correctly closed */
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
627 if (token != '\0' && *endValue == token)
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
628 ++ endValue;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
629 else
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
630 WARN(conf, "line %d: missing '%c'\n", conf->lineno, token);
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
631 } else {
85
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
632 for (*lp = endValue; !isspace(*endValue) && *endValue != '\0' &&
8cea08140a71 Fix comment issue and switch ini_value_dispatch to allow NULL values
David Demelier <markand@malikania.fr>
parents: 84
diff changeset
633 *endValue != '#' && *endValue != ';'; ++endValue)
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
634 continue;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
635
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
636 length = endValue - *lp;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
637 }
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
638
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
639 if (length != 0)
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
640 tmp.value = xstrndup(*lp, length);
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
641
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
642 if ((option = xoptiondup(&tmp)) == NULL)
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
643 return -1;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
644
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
645 #ifdef INI_DEBUG
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
646 printf("-- next option [%s] is set to [%s]\n", tmp.key, tmp.value);
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
647 #endif
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
648
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
649 /* Finally add the new option to the current section */
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
650 *lp = endValue;
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
651 STAILQ_INSERT_TAIL(&conf->current->options, option, next);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
652
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
653 return 0;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
654 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
655
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
656 static void *
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
657 ini_fatal(struct ini_config *conf, FILE *fp, const char *fmt, ...)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
658 {
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
659 va_list ap;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
660
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
661 if (conf != NULL) {
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
662 struct ini_section *s, *stmp;
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
663 struct ini_option *o, *otmp;
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
664
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
665 if (conf->line != NULL)
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
666 free(conf->line);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
667
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
668 STAILQ_FOREACH_SAFE(s, &conf->sections, next, stmp) {
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
669 STAILQ_FOREACH_SAFE(o, &s->options, next, otmp) {
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
670 free(o->key);
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
671 free(o->value);
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
672
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
673 STAILQ_REMOVE(&s->options, o, ini_option, next);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
674
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
675 free(o);
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
676 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
677
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
678 free(s->key);
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
679 free(s);
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
680 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
681
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
682 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
683
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
684 if (fp != NULL)
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
685 fclose(fp);
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
686
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
687 va_start(ap, fmt);
87
d27a6fd446ea Get rid of mixed case
David Demelier <markand@malikania.fr>
parents: 86
diff changeset
688 vsnprintf(ini_error, 1024, fmt, ap);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
689 va_end(ap);
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
690
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
691 /* Directly print error if VERBOSE is enabled */
87
d27a6fd446ea Get rid of mixed case
David Demelier <markand@malikania.fr>
parents: 86
diff changeset
692 WARN(conf, "%s\n", ini_error);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
693
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
694 free(conf);
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
695
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
696 return NULL;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
697 }
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
698
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
699 static char *
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
700 xstrndup(const char *src, size_t max)
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
701 {
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
702 char *res;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
703 size_t length;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
704
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
705 for (length = 0; length < max && src[length] != '\0'; ++length)
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
706 continue;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
707
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
708 if ((res = malloc(length + 1)) == NULL)
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
709 return NULL;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
710
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
711 memcpy(res, src, length);
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
712 res[length] = '\0';
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
713
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
714 return res;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
715 }
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
716
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
717 static struct ini_option *
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
718 xoptiondup(const struct ini_option *option)
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
719 {
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
720 struct ini_option *res;
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
721
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
722 /*
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
723 * Value may be NULL but not option's key.
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
724 */
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
725 if (option->key == NULL) {
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
726 if (option->value != NULL)
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
727 free(option->value);
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
728
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
729 return NULL;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
730 }
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
731
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
732 if ((res = malloc(sizeof (struct ini_option))) == NULL)
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
733 return NULL;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
734
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
735 res->key = option->key;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
736 res->value = option->value;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
737
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
738 return res;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
739 }