Mercurial > code
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 |
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 | 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, §ion->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, §ion->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, §ion->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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 } |