Mercurial > code
annotate ini.c @ 79:fd817a7dbf2f
Switched a lot of things in ini
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 15 Nov 2011 20:12:48 +0100 |
parents | inifile.c@4c5f69f5f409 |
children | f42bcb9e7b4a |
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 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 /* -------------------------------------------------------- |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 * structure definitions |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 * -------------------------------------------------------- */ |
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 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
62 static char iniError[1024 + 1]; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 /* -------------------------------------------------------- |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 * prototypes |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 * -------------------------------------------------------- */ |
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 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 /* -------------------------------------------------------- |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 * public functions |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 * -------------------------------------------------------- */ |
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 ** |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
122 ini_get_sections_names(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 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
132 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
|
133 return NULL; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 if (number != NULL) |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 *number = i; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
138 i = 0; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
139 STAILQ_FOREACH(s, &conf->sections, next) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
140 list[i++] = s->key; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
141 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
142 return list; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
143 } |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
144 |
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 * 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
|
147 * 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
|
148 * has multiple definition enabled. |
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 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
151 struct ini_section ** |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
152 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
|
153 { |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
154 struct ini_section **list; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
155 struct ini_section *s; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
156 int i; |
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 /* 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
|
159 if (I_NOREDEFINE(conf)) { |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
160 errno = EINVAL; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
161 return NULL; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
162 } |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
163 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
164 i = 0; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
165 STAILQ_FOREACH(s, &conf->sections, next) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
166 if (strcmp(s->key, key) == 0) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
167 ++ i; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
168 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
169 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
|
170 return NULL; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
172 if (nb != NULL) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
173 *nb = i; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
174 |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 i = 0; |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
176 STAILQ_FOREACH(s, &conf->sections, next) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
177 if (strcmp(s->key, key) == 0) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
178 list[i++] = s; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 return list; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 |
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 * 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
|
185 * 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
|
186 * 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
|
187 * 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
|
188 */ |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
190 struct ini_section * |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
191 ini_select_section(struct ini_config *conf, const char *section) |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
192 { |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
193 struct ini_section *s; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
194 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
195 STAILQ_FOREACH(s, &conf->sections, next) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
196 if (strcmp(s->key, section) == 0) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
197 return s; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
198 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
199 return NULL; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
200 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 /* |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
203 * 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
|
204 * 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
|
205 * 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
|
206 * 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
|
207 */ |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 char * |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
210 ini_option_once(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
|
211 { |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
212 struct ini_option *o; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
213 struct ini_section *s; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
214 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
215 STAILQ_FOREACH(s, &conf->sections, next) |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
216 if (strcmp(s->key, sect) == 0) |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
217 break; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
218 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
219 STAILQ_FOREACH(o, &s->options, next) |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
220 if (strcmp(o->key, key) == 0) |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
221 return o->value; |
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 return NULL; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
224 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
225 |
73
653d583376c9
Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
226 /* |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
227 * 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
|
228 */ |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
229 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
230 char ** |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
231 ini_get_option_names(struct ini_section *section, int *nb) |
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 char **list; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
234 struct ini_option *o; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
235 int i; |
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 i = 0; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
238 STAILQ_FOREACH(o, §ion->options, next) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
239 ++ 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 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
|
242 return NULL; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
243 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
244 if (nb != NULL) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
245 *nb = i; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
246 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
247 i = 0; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
248 STAILQ_FOREACH(o, §ion->options, next) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
249 list[i++] = o->key; |
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 return list; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
252 } |
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 /* |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
255 * 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
|
256 * 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
|
257 * 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
|
258 */ |
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 char * |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
261 ini_get_option(struct ini_section *section, const char *key) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
262 { |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
263 struct ini_option *o; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
264 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
265 STAILQ_FOREACH(o, §ion->options, next) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
266 if (strcmp(o->key, key) == 0) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
267 return o->value; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
268 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
269 return NULL; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
270 } |
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 /* |
73
653d583376c9
Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
273 * 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
|
274 */ |
653d583376c9
Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
275 |
653d583376c9
Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
276 char * |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
277 ini_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
|
278 { |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
279 if (iniError[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
|
280 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
|
281 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
282 return iniError; |
73
653d583376c9
Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
283 } |
653d583376c9
Added the inifile_error() function and renamed inifile_option_simple() to _once()
David Demelier <markand@malikania.fr>
parents:
72
diff
changeset
|
284 |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
285 void |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
286 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
|
287 { |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
288 struct ini_section *s, *stmp; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
289 struct ini_option *o, *otmp; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
290 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
291 STAILQ_FOREACH_SAFE(s, &conf->sections, next, stmp) { |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
292 STAILQ_FOREACH_SAFE(o, &s->options, next, otmp) { |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
293 if (freeOptions) { |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
294 free(o->key); |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
295 free(o->value); |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
296 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
297 STAILQ_REMOVE(&s->options, o, ini_option, next); |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
298 free(o); |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
299 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
300 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
301 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
302 if (freeSections) |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
303 free(s->key); |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
304 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
305 STAILQ_REMOVE(&conf->sections, s, ini_section, next); |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
306 free(s); |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
307 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
308 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
309 free(conf); |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
310 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
311 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
312 /* -------------------------------------------------------- |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
313 * private functions |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
314 * -------------------------------------------------------- */ |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
315 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
316 /* |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
317 * 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
|
318 * starting with # or empty line are ignored. Returns the file |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
319 * on success and NULL on failure. |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
320 */ |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
321 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
322 static void * |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
323 ini_read(struct ini_config *conf, FILE *fp) |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
324 { |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
325 while (ini_getline(conf, fp) == 0) { |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
326 if (ini_readline(conf) == NULL) { |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
327 free(conf->line); |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
328 ini_free(conf, 1, 1); |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
329 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
330 fclose(fp); |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
331 return NULL; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
332 } |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
333 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
334 ++ conf->lineno; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
335 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
336 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
337 /* Clean up */ |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
338 free(conf->line); |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
339 fclose(fp); |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
340 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
341 return conf; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
342 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
343 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
344 /* |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
345 * 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
|
346 * 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
|
347 * end of file. |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
348 */ |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
349 |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
350 static int |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
351 ini_getline(struct ini_config *conf, FILE *fp) |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
352 { |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
353 int ch, pos; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
354 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
355 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
|
356 pos = 0; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
357 |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
358 while ((ch = fgetc(fp)) != '\n') { |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
359 if (feof(fp) || ferror(fp)) |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
360 return -1; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
361 |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
362 /* End of buffer, realloc */ |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
363 if (pos == conf->linesize) { |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
364 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
|
365 if (conf->line == NULL) |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
366 return -1; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
367 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
368 conf->linesize += 512; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
369 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
370 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
371 conf->line[pos++] = ch; |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
372 } |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
373 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
374 conf->line[pos] = '\0'; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
375 |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
376 return 0; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
377 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
378 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
379 /* |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
380 * 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
|
381 * 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
|
382 * or the file on success. |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
383 */ |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
384 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
385 static void * |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
386 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
|
387 { |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
388 char *lp; |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
389 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
|
390 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
391 lp = conf->line; |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
392 SKIP_SPACES(lp); |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
393 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
394 /* Ignore empty line or comment */ |
75
37fa222d7cc6
Use ';' as comment with #
David Demelier <markand@malikania.fr>
parents:
74
diff
changeset
|
395 if (*lp == '\0' || *lp == '#' || *lp == ';') |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
396 return conf; |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
397 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
398 while (*lp != '\0') { |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
399 SKIP_SPACES(lp); |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
400 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
401 /* Skip comments again and empty lines */ |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
402 if (*lp == '\0' || *lp == '#' || *lp == ';') |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
403 return conf; |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
404 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
405 #ifdef INI_DEBUG |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
406 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
|
407 #endif |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
408 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
409 if (*lp == '[') |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
410 handler = &ini_switch; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
411 else if (!conf->ignore) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
412 handler = &ini_register; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
413 else |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
414 handler = NULL; |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
415 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
416 /* Success or not? */ |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
417 if (handler != NULL && handler(conf, &lp) < 0) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
418 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
|
419 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
420 SKIP_SPACES(lp); |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
421 } |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
422 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
423 return conf; |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
424 } |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
425 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
426 /* On failure, seek next space */ |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
427 #define SEEK_NEXT(lp) \ |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
428 for (; !isspace(**lp) && **lp != '\0'; ++(*lp)) \ |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
429 continue; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
430 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
431 /* 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
|
432 #define SEEK_NL(lp) \ |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
433 for (; !isspace(**lp) && **lp != '\0'; ++(*lp)) |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
434 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
435 /* |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
436 * 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
|
437 * 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
|
438 * allocation failure. |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
439 */ |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
440 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
441 static int |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
442 ini_switch(struct ini_config *conf, char **lp) |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
443 { |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
444 char *endSection; |
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 /* 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
|
447 if ((endSection = strchr(*lp, ']')) == NULL) { |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
448 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
|
449 SEEK_NEXT(lp); |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
450 return (conf->ignore = 1) - 2; /* single line rocks */ |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
451 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
452 |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
453 /* Redefinition of previous and not allowed */ |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
454 ++(*lp); |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
455 if (conf->current != NULL && I_NOREDEFINE(conf) && |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
456 (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
|
457 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
|
458 SEEK_NEXT(lp); |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
459 return (conf->ignore = 1) - 2; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
460 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
461 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
462 if ((conf->current = malloc(sizeof (struct ini_section))) == NULL) |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
463 return -1; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
464 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
465 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
|
466 free(conf->current); |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
467 return -1; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
468 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
469 |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
470 *lp = endSection + 1; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
471 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
472 #ifdef INI_DEBUG |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
473 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
|
474 #endif |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
475 |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
476 /* 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
|
477 STAILQ_INIT(&conf->current->options); |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
478 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
|
479 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
480 return (conf->ignore = 0); |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
481 } |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
482 |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
483 /* |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
484 * 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
|
485 * 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
|
486 * allocation failure. |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
487 */ |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
488 |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
489 static int |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
490 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
|
491 { |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
492 char *assignKey, *endKey, *endValue, token = '\0'; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
493 int length = 0; |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
494 struct ini_option *option, tmp; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
495 |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
496 /* No '=' found */ |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
497 if ((assignKey = strchr(*lp, '=')) == NULL) { |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
498 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
|
499 SEEK_NEXT(lp); |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
500 return -1; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
501 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
502 |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
503 /* Find end of option */ |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
504 endKey = *lp; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
505 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
|
506 continue; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
507 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
508 /* Do not register empty option name */ |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
509 if (endKey - *lp <= 0) { |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
510 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
|
511 SEEK_NL(lp); |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
512 return -1; |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
513 } |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
514 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
515 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
|
516 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
|
517 return -1; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
518 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
519 endValue = &assignKey[1]; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
520 SKIP_SPACES(endValue); |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
521 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
522 /* Find end of option value */ |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
523 token = *endValue; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
524 if (token == '\'' || token == '"') { |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
525 for (*lp = ++endValue; *endValue != token && *endValue != '\0'; ++endValue) |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
526 continue; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
527 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
528 length = endValue - *lp; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
529 |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
530 /* Correctly closed */ |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
531 if (token != '\0' && *endValue == token) |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
532 ++ endValue; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
533 else |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
534 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
|
535 } else { |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
536 for (*lp = endValue; !isspace(*endValue) && *endValue != '\0'; ++endValue) |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
537 continue; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
538 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
539 length = endValue - *lp; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
540 } |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
541 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
542 if (length != 0) |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
543 tmp.value = xstrndup(*lp, length); |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
544 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
545 if ((option = xoptiondup(&tmp)) == NULL) |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
546 return -1; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
547 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
548 #ifdef INI_DEBUG |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
549 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
|
550 #endif |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
551 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
552 /* 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
|
553 *lp = endValue; |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
554 STAILQ_INSERT_TAIL(&conf->current->options, option, next); |
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 return 0; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
557 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
558 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
559 static void * |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
560 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
|
561 { |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
562 va_list ap; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
563 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
564 if (conf != NULL) { |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
565 struct ini_section *s, *stmp; |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
566 struct ini_option *o, *otmp; |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
567 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
568 if (conf->line != NULL) |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
569 free(conf->line); |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
570 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
571 STAILQ_FOREACH_SAFE(s, &conf->sections, next, stmp) { |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
572 STAILQ_FOREACH_SAFE(o, &s->options, next, otmp) { |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
573 free(o->key); |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
574 free(o->value); |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
575 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
576 STAILQ_REMOVE(&s->options, o, ini_option, next); |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
577 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
578 free(o); |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
579 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
580 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
581 free(s->key); |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
582 free(s); |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
583 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
584 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
585 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
586 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
587 if (fp != NULL) |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
588 fclose(fp); |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
589 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
590 va_start(ap, fmt); |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
591 vsnprintf(iniError, 1024, fmt, ap); |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
592 va_end(ap); |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
593 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
594 /* Directly print error if VERBOSE is enabled */ |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
595 WARN(conf, "%s\n", iniError); |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
596 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
597 free(conf); |
71
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
598 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
599 return NULL; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
600 } |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
601 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
602 static char * |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
603 xstrndup(const char *src, size_t max) |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
604 { |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
605 char *res; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
606 size_t length; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
607 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
608 for (length = 0; length < max && src[length] != '\0'; ++length) |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
609 continue; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
610 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
611 if ((res = malloc(length + 1)) == NULL) |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
612 return NULL; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
613 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
614 memcpy(res, src, length); |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
615 res[length] = '\0'; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
616 |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
617 return res; |
6981419d48c1
Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
618 } |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
619 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
620 static struct ini_option * |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
621 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
|
622 { |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
623 struct ini_option *res; |
72
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
624 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
625 /* |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
626 * 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
|
627 */ |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
628 if (option->key == NULL) { |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
629 if (option->value != NULL) |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
630 free(option->value); |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
631 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
632 return NULL; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
633 } |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
634 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
76
diff
changeset
|
635 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
|
636 return NULL; |
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 res->key = option->key; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
639 res->value = option->value; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
640 |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
641 return res; |
262c053206f6
Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents:
71
diff
changeset
|
642 } |