annotate ini.c @ 167:1167cd06b475

Use stdint.h values
author David Demelier <markand@malikania.fr>
date Thu, 25 Oct 2012 12:57:58 +0200
parents 2563b3e71859
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
2 * ini.c -- parse .ini like files
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
97
0321fc3c0972 Update license
David Demelier <markand@malikania.fr>
parents: 96
diff changeset
4 * Copyright (c) 2011, 2012, David Demelier <markand@malikania.fr>
71
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 <stdio.h>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdlib.h>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <stdarg.h>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <string.h>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <ctype.h>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <errno.h>
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
79
fd817a7dbf2f Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents: 76
diff changeset
26 #include "ini.h"
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
28 /*
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
29 * sys/queue.h bits.
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
30 */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
31
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
32 #if !defined(TAILQ_FIRST)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
33 #define TAILQ_FIRST(head) ((head)->tqh_first)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
34 #endif
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
35
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
36 #if !defined(TAILQ_FOREACH)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
37 #define TAILQ_FOREACH(var, head, field) \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
38 for ((var) = TAILQ_FIRST((head)); \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
39 (var); \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
40 (var) = TAILQ_NEXT((var), field))
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
41 #endif
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
42
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
43 #if !defined(TAILQ_FOREACH_SAFE)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
44 #define TAILQ_FOREACH_SAFE(var, head, field, tvar) \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
45 for ((var) = TAILQ_FIRST((head)); \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
46 (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
47 (var) = (tvar))
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
48 #endif
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
49
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
50 #if !defined(TAILQ_INIT)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
51 #define TAILQ_INIT(head) do { \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
52 TAILQ_FIRST((head)) = NULL; \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
53 (head)->tqh_last = &TAILQ_FIRST((head)); \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
54 } while (0)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
55 #endif
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
56
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
57 #if !defined(TAILQ_INSERT_TAIL)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
58 #define TAILQ_INSERT_TAIL(head, elm, field) do { \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
59 TAILQ_NEXT((elm), field) = NULL; \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
60 (elm)->field.tqe_prev = (head)->tqh_last; \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
61 *(head)->tqh_last = (elm); \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
62 (head)->tqh_last = &TAILQ_NEXT((elm), field); \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
63 } while (0)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
64 #endif
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
65
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
66 #if !defined(TAILQ_NEXT)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
67 #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
68 #endif
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
69
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
70 #if !defined(TAILQ_REMOVE)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
71 #define TAILQ_REMOVE(head, elm, field) do { \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
72 if ((TAILQ_NEXT((elm), field)) != NULL) \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
73 TAILQ_NEXT((elm), field)->field.tqe_prev = \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
74 (elm)->field.tqe_prev; \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
75 else { \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
76 (head)->tqh_last = (elm)->field.tqe_prev; \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
77 } \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
78 *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
79 } while (0)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
80 #endif
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
81
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
82 /* --------------------------------------------------------
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
83 * Structure definitions
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
84 * -------------------------------------------------------- */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
85
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
86 struct ini_private {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
87 struct ini_section *current; /* current working section */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
88 int ignore; /* must ignore (no redefine) */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
89 FILE *fp; /* file pointer to read */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
90
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
91 /* Line buffer */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
92 char *line; /* line data */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
93 int linesize; /* line allocated size */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
94 int lineno; /* number of line in file */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
95
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
96 /* Error reporting */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
97 char error[1024];
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
98 };
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
99
96
dcaf2c61c902 Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents: 90
diff changeset
100 /* --------------------------------------------------------
105
eac1f370910a English review (thanks afranke@)
David Demelier <markand@malikania.fr>
parents: 100
diff changeset
101 * Prototypes
96
dcaf2c61c902 Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents: 90
diff changeset
102 * -------------------------------------------------------- */
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
103
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
104 #define F_VERBOSE(cg) ((cg)->flags & INI_VERBOSE)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
105 #define F_NOREDEFINE(cg) ((cg)->flags & INI_NOREDEFINE)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
106 #define F_FAILERROR(cg) ((cg)->flags & INI_FAILERROR)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
107
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 static char *
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
109 sstrndup(const char *src, size_t max)
71
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 {
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 char *res;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 size_t length;
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 for (length = 0; length < max && src[length] != '\0'; ++length)
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 continue;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
116
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 if ((res = malloc(length + 1)) == NULL)
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 return NULL;
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 memcpy(res, src, length);
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 res[length] = '\0';
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
122
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 return res;
6981419d48c1 Added inifile.c inifile.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 }
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
125
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
126 static void
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
127 sskip(char **lp)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
128 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
129 while (isspace (**lp) && **lp != '\0')
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
130 ++(*lp);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
131 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
132
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
133 static void
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
134 sseek(char **lp)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
135 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
136 while (!isspace(**lp) && **lp != '\0')
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
137 ++(*lp);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
138 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
140 static void
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
141 ini_set_error(struct ini_config *cg, const char *fmt, ...)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
142 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
143 va_list ap;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
144
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
145 va_start(ap, fmt);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
146 if (cg->pv->error)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
147 vsnprintf(cg->pv->error, sizeof (cg->pv->error), fmt, ap);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
148 va_end(ap);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
149 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
150
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
151 static void
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
152 ini_warn(struct ini_config *cg, const char *fmt, ...)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
153 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
154 va_list ap;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
155
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
156 va_start(ap, fmt);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
157 if (F_VERBOSE(cg)) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
158 vprintf(fmt, ap);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
159 fputc('\n', stdout);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
160 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
161
145
24efccba44e4 Remove tests
David Demelier <markand@malikania.fr>
parents: 139
diff changeset
162 if (F_FAILERROR(cg)) {
24efccba44e4 Remove tests
David Demelier <markand@malikania.fr>
parents: 139
diff changeset
163 va_start(ap, fmt);
24efccba44e4 Remove tests
David Demelier <markand@malikania.fr>
parents: 139
diff changeset
164 vsnprintf(cg->pv->error, sizeof (cg->pv->error), fmt, ap);
24efccba44e4 Remove tests
David Demelier <markand@malikania.fr>
parents: 139
diff changeset
165 va_end(ap);
24efccba44e4 Remove tests
David Demelier <markand@malikania.fr>
parents: 139
diff changeset
166 }
24efccba44e4 Remove tests
David Demelier <markand@malikania.fr>
parents: 139
diff changeset
167
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
168 va_end(ap);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
169 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
170
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
171 /*
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
172 * Add a new section, this function only returns -1 on fatal error that may
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
173 * be impossible to continue parsing for the current line.
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
174 */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
175
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
176 static int
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
177 ini_add_section(struct ini_config *cg, char **lp)
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
178 {
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
179 char *begin = *lp, *end;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
180 size_t length;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
181 struct ini_section *section = NULL;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
182
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
183 if (!(end = strchr(begin, ']'))) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
184 ini_warn(cg, "line %d: syntax error after [", cg->pv->lineno);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
185 goto bad;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
186 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
187
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
188 length = end - begin;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
189
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
190 /* May not redefine? */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
191 if (cg->pv->current && F_NOREDEFINE(cg))
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
192 if (strncmp(cg->pv->current->key, begin, length) == 0) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
193 ini_warn(cg, "line %d: redefining %s", cg->pv->lineno,
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
194 cg->pv->current->key);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
195 goto bad;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
196 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
197
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
198 /* Allocate a new section and add it */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
199 if (!(section = calloc(1, sizeof (*section))))
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
200 goto bad;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
201
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
202 if (!(section->key = sstrndup(begin, length)))
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
203 goto bad;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
204
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
205 TAILQ_INIT(&section->options);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
206 TAILQ_INSERT_TAIL(&cg->sections, section, link);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
207 cg->pv->current = section;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
208 cg->pv->ignore = 0;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
209
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
210 /* Trigger an event for the new section */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
211 if (cg->open)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
212 cg->open(cg->data, section->key);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
213
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
214 *lp = &end[1];
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
215
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
216 return 0;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
217
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
218 bad: if (section)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
219 free(section->key);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
220 free(section);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
221
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
222 cg->pv->ignore = 1;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
223 *lp = strchr(*lp, '\0');
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
224
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
225 return F_FAILERROR(cg) ? -1 : 0;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
226 }
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
227
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
228 /*
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
229 * Add a new option, the returns value is same as ini_add_section.
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
230 */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
231
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
232 static int
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
233 ini_add_option(struct ini_config *cg, char **lp)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
234 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
235 char *begin = *lp, *equal, *end;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
236 struct ini_option *option = NULL;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
237
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
238 if (!cg->pv->current) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
239 ini_warn(cg, "line %d: option within no section", cg->pv->lineno);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
240 goto bad;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
241 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
242
146
5109083b4794 Skip comments lines
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
243 if (cg->pv->ignore ||
5109083b4794 Skip comments lines
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
244 !(option = calloc(1, sizeof (*option))))
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
245 goto bad;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
246
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
247 /* Not valid */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
248 if (!(equal = strchr(begin, '='))) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
249 ini_warn(cg, "line %d: missing =", cg->pv->lineno);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
250 goto bad;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
251 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
252
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
253 /* End of option */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
254 end = begin;
146
5109083b4794 Skip comments lines
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
255 sskip(&end);
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
256 sseek(&end);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
257
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
258 option->key = sstrndup(begin, end - begin);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
259
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
260 /* End of value */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
261 begin = &equal[1];
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
262 sskip(&begin);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
263 end = begin;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
264
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
265 if (*end == '\'' || *end == '"') {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
266 for (++end; *end != *begin && *end != '\0'; ++end)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
267 continue;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
268 if (*end != *begin) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
269 ini_warn(cg, "line %d: missing %c",
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
270 cg->pv->lineno, *begin);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
271 *lp = end;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
272 goto bad;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
273 } else
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
274 ++ begin;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
275 } else
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
276 sseek(&end);
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
277
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
278 option->value = sstrndup(begin, end - begin);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
279
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
280 if (!option->key || !option->value) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
281 ini_warn(cg, "line %d: syntax error", cg->pv->lineno);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
282 goto bad;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
283 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
284
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
285 TAILQ_INSERT_TAIL(&cg->pv->current->options, option, link);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
286
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
287 /* Trigger an event for the new section */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
288 if (cg->get)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
289 cg->get(cg->data, cg->pv->current->key, option);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
290
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
291 *lp = &end[1];
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
292
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
293 return 0;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
294
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
295 bad: if (option) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
296 free(option->key);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
297 free(option->value);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
298 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
299 free(option);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
300
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
301 *lp = strchr(*lp, '\0');
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
302
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
303 return F_FAILERROR(cg) ? -1 : 0;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
304 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
305
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
306 static int
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
307 ini_read_line(struct ini_config *cg)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
308 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
309 char *lp = cg->pv->line;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
310 int rv;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
311
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
312 /* Ignore empty line */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
313 if (*lp == '\0' || *lp == '#' || *lp == ';')
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
314 return 0;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
315
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
316 while (*lp != '\0') {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
317 sskip(&lp);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
318
146
5109083b4794 Skip comments lines
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
319 if (*lp == '\0' || *lp == '#' || *lp == ';')
5109083b4794 Skip comments lines
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
320 return 0;
5109083b4794 Skip comments lines
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
321
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
322 /* Begin of section */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
323 if (*lp == '[') {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
324 ++ lp;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
325 rv = ini_add_section(cg, &lp);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
326 /* Begin of option */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
327 } else {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
328 rv = ini_add_option(cg, &lp);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
329 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
330
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
331 if (rv < 0)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
332 return -1;
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
333 }
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
334
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
335 return 0;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
336 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
337
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
338 /*
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
339 * Read the next line until the next '\n' character is found. Returns 0
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
340 * if the system had enough memory or -1 on allocation failure or on
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
341 * end of file. Only for mode == INI_LINEAR
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
342 */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
343
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
344 static int
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
345 ini_get_line(struct ini_config *cg)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
346 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
347 int ch, pos;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
348
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
349 memset(cg->pv->line, 0, cg->pv->linesize);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
350 pos = 0;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
351
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
352 while ((ch = fgetc(cg->pv->fp)) != '\n') {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
353 if (feof(cg->pv->fp) || ferror(cg->pv->fp))
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
354 return -1;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
355
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
356 /* End of buffer, realloc */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
357 if (pos == cg->pv->linesize) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
358 cg->pv->line = realloc(cg->pv->line, cg->pv->linesize + 512);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
359 if (!cg->pv->line)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
360 return -1;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
361
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
362 cg->pv->linesize += 512;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
363 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
364
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
365 cg->pv->line[pos++] = ch;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
366 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
367
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
368 return 0;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
369 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
370
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
371 static int
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
372 ini_open_file(struct ini_config *cg)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
373 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
374 if (!(cg->pv->fp = fopen(cg->path, "r"))) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
375 ini_set_error(cg, "open: %s", cg->path);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
376 return -1;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
377 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
378
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
379 cg->pv->linesize = INI_DEFAULT_LINESIZE;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
380 cg->pv->line = calloc(sizeof (char), cg->pv->linesize);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
381
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
382 if (!cg->pv->line) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
383 ini_set_error(cg, "malloc: %s", strerror(errno));
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
384 return -1;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
385 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
386
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
387 return 0;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
388 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
389
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
390 /* --------------------------------------------------------
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
391 * Public functions
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
392 * -------------------------------------------------------- */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
393
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
394 struct ini_config *
149
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
395 ini_create(const char *path, enum ini_flags flags)
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
396 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
397 struct ini_config *cg;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
398
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
399 cg = calloc(1, sizeof (*cg));
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
400 if (!cg)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
401 return NULL;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
402
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
403 cg->pv = calloc(1, sizeof (struct ini_private));
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
404 if (!cg->pv)
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
405 return NULL;
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
406
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
407 cg->path = path;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
408 cg->flags = flags;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
409
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
410 return cg;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
411 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
412
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
413 void
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
414 ini_set_handlers(struct ini_config *cg, void *data, ini_open_t open,
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
415 ini_get_t get)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
416 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
417 if (!cg)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
418 return;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
419
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
420 cg->data = data;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
421 cg->open = open;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
422 cg->get = get;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
423 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
424
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
425 int
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
426 ini_open(struct ini_config *cg)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
427 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
428 int rv = 0;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
429
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
430 /* Open the file and prepare data for reading */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
431 if (ini_open_file(cg) < 0)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
432 return -1;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
433
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
434 cg->pv->ignore = 1;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
435 cg->pv->lineno = 1;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
436
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
437 TAILQ_INIT(&cg->sections);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
438
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
439 while (ini_get_line(cg) != -1 && !rv) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
440 rv = ini_read_line(cg);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
441 ++ cg->pv->lineno;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
442 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
443
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
444 fclose(cg->pv->fp);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
445
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
446 return rv;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
447 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
448
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
449 /*
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
450 * Search the section `sectname' in the config structure. If the section
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
451 * is not found, this function returns NULL.
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
452 */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
453
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
454 struct ini_section *
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
455 ini_select_section(const struct ini_config *cg, const char *sectname)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
456 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
457 struct ini_section *s;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
458
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
459 TAILQ_FOREACH(s, &cg->sections, link)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
460 if (strcmp(s->key, sectname) == 0)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
461 return s;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
462
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
463 return NULL;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
464 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
465
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
466 /*
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
467 * Search the option `optname' in the section structure, argument
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
468 * section mustn't be NULL. If the option is not found, this function
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
469 * returns NULL.
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
470 */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
471
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
472 struct ini_option *
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
473 ini_select_option(const struct ini_section *sc, const char *name)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
474 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
475 struct ini_option *o;
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
476
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
477 TAILQ_FOREACH(o, &sc->options, link)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
478 if (strcmp(o->key, name) == 0)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
479 return o;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
480
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
481 return NULL;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
482 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
483
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
484 /*
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
485 * Find an option from the config, by section and option names.
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
486 * Returns the option or NULL if not found.
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
487 */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
488
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
489 struct ini_option *
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
490 ini_find(const struct ini_config *cg, const char *scname, const char *optname)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
491 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
492 struct ini_section *sc;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
493
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
494 if ((sc = ini_select_section(cg, scname)))
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
495 return ini_select_option(sc, optname);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
496
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
497 return NULL;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
498 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
499
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
500 /*
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
501 * Return the last error or "No error" if there is no error.
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
502 */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
503
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
504 const char *
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
505 ini_get_error(const struct ini_config *cg)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
506 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
507 if (!cg && errno != 0)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
508 return strerror(errno);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
509
145
24efccba44e4 Remove tests
David Demelier <markand@malikania.fr>
parents: 139
diff changeset
510 if (cg->pv->error[0] == '\0') {
24efccba44e4 Remove tests
David Demelier <markand@malikania.fr>
parents: 139
diff changeset
511 if (errno != 0)
24efccba44e4 Remove tests
David Demelier <markand@malikania.fr>
parents: 139
diff changeset
512 return strerror(errno);
24efccba44e4 Remove tests
David Demelier <markand@malikania.fr>
parents: 139
diff changeset
513
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
514 return "No error";
145
24efccba44e4 Remove tests
David Demelier <markand@malikania.fr>
parents: 139
diff changeset
515 }
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
516
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
517 return cg->pv->error;
72
262c053206f6 Cleaned up lot of things in inifile.c:
David Demelier <markand@malikania.fr>
parents: 71
diff changeset
518 }
139
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
519
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
520 /*
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
521 * Free everything, level may be set like this:
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
522 * 0, only free parser and private resources.
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
523 * 1, free all sections and their keys,
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
524 * 2, free all sections and options keys and values.
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
525 */
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
526
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
527 void
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
528 ini_free(struct ini_config *cg, int level)
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
529 {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
530 struct ini_section *s, *stmp;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
531 struct ini_option *o, *otmp;
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
532
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
533 if (level >= 1) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
534 TAILQ_FOREACH_SAFE(s, &cg->sections, link, stmp) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
535 if (level >= 2) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
536 TAILQ_FOREACH_SAFE(o, &s->options, link, otmp) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
537 TAILQ_REMOVE(&s->options, o, link);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
538 free(o->key);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
539 free(o->value);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
540 free(o);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
541 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
542 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
543
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
544 TAILQ_REMOVE(&cg->sections, s, link);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
545 free(s->key);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
546 free(s);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
547 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
548 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
549
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
550 if (level >= 0) {
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
551 free(cg->pv->line);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
552 free(cg->pv);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
553 free(cg);
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
554 }
d62f2f657768 Introducing new ini API, some changes and use sys/queue.h instead
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
555 }