Mercurial > code
annotate ini.h @ 115:1d0e5580d402
Reduce code for cosmetic
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 13 Feb 2012 19:46:22 +0100 |
parents | eac1f370910a |
children | 07800b7af208 |
rev | line source |
---|---|
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * ini.h -- parse .ini like files |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
97 | 4 * Copyright (c) 2011, 2012, David Demelier <markand@malikania.fr> |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #ifndef _INI_H_ |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #define _INI_H_ |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #define INI_VERBOSE (1 << 0) /* be verbose */ |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #define INI_NOREDEFINE (1 << 1) /* do not allow redefinitions */ |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 #define INI_FAILERROR (1 << 2) /* abort parsing on first error */ |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 |
96
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
26 typedef struct ini_config INI_Config; |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
27 typedef struct ini_section INI_Section; |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
28 typedef struct ini_option INI_Option; |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
29 typedef struct ini_handler INI_Handler; |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
30 |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
31 typedef void (*INI_ConvertFunc)(void *, const char *, void *); |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
32 |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
33 /* -------------------------------------------------------- |
105
eac1f370910a
English review (thanks afranke@)
David Demelier <markand@malikania.fr>
parents:
102
diff
changeset
|
34 * Structure definitions |
96
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
35 * -------------------------------------------------------- */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
36 |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
37 struct ini_config { |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
38 /* General settings */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
39 const char *path; /* file path */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
40 int flags; /* optional flags */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
41 |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
42 /* Sections that have been parsed */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
43 INI_Section *sections; /* linked-list of sections */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
44 |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
45 /* Private fields */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
46 INI_Section *_current; /* current working section */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
47 char *_line; /* line buffer */ |
105
eac1f370910a
English review (thanks afranke@)
David Demelier <markand@malikania.fr>
parents:
102
diff
changeset
|
48 int _lineno; /* number of current line */ |
96
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
49 int _linesize; /* initial line size */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
50 int _ignore; /* must ignore (no redefine) */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
51 }; |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
52 |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
53 struct ini_option { |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
54 char *key; /* option name */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
55 char *value; /* option value */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
56 INI_Option *next; /* next option */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
57 }; |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
58 |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
59 struct ini_section { |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
60 char *key; /* section key */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
61 INI_Option *options; /* linked-list of options */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
62 INI_Section *next; /* linked-list of sections */ |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
63 }; |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 |
82
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
65 struct ini_handler { |
96
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
66 char *key; /* option to check */ |
82
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
67 void *dst; /* where to store */ |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
68 |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
69 /* Conversion function */ |
96
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
70 INI_ConvertFunc handler; |
82
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
71 void *userdata; /* optional user data */ |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
72 }; |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
73 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 /* -------------------------------------------------------- |
105
eac1f370910a
English review (thanks afranke@)
David Demelier <markand@malikania.fr>
parents:
102
diff
changeset
|
75 * Main functions |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 * -------------------------------------------------------- */ |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 |
96
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
78 INI_Config * |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 ini_load(const char *, int); |
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 |
96
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
81 INI_Section * |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
82 ini_select_section(const INI_Config *, const char *); |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 |
96
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
84 INI_Option * |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
85 ini_select_option(const INI_Section *, const char *); |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 |
100
85ddc81848bd
Add a little helper in ini.c to find an option
David Demelier <markand@malikania.fr>
parents:
97
diff
changeset
|
87 INI_Option * |
85ddc81848bd
Add a little helper in ini.c to find an option
David Demelier <markand@malikania.fr>
parents:
97
diff
changeset
|
88 ini_find(const INI_Config *, const char *, const char *); |
85ddc81848bd
Add a little helper in ini.c to find an option
David Demelier <markand@malikania.fr>
parents:
97
diff
changeset
|
89 |
102
735d6c774f7a
Reorder protos in ini.h
David Demelier <markand@malikania.fr>
parents:
100
diff
changeset
|
90 char * |
735d6c774f7a
Reorder protos in ini.h
David Demelier <markand@malikania.fr>
parents:
100
diff
changeset
|
91 ini_get_error(void); |
735d6c774f7a
Reorder protos in ini.h
David Demelier <markand@malikania.fr>
parents:
100
diff
changeset
|
92 |
96
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
93 void |
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
94 ini_free(INI_Config *, int, int); |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 |
82
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
96 /* -------------------------------------------------------- |
105
eac1f370910a
English review (thanks afranke@)
David Demelier <markand@malikania.fr>
parents:
102
diff
changeset
|
97 * Convenient api to query and convert data |
82
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
98 * -------------------------------------------------------- */ |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
99 |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
100 /* |
105
eac1f370910a
English review (thanks afranke@)
David Demelier <markand@malikania.fr>
parents:
102
diff
changeset
|
101 * For the config, read all available values and store them in |
82
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
102 * the array ini_handler. |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
103 */ |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
104 |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
105 void |
96
dcaf2c61c902
Big change in ini, much cleaner and simpler
David Demelier <markand@malikania.fr>
parents:
90
diff
changeset
|
106 ini_dispatch(INI_Section *, INI_Handler *, int); |
82
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
107 |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
108 /* |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
109 * Convert to bool. dst must be (char *). |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
110 * It converts "yes" "true" "1" or opposites. Only lower |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
111 * case is supported right now. |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
112 */ |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
113 |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
114 void |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
115 ini_convert_bool(void *, const char *, void *); |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
116 |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
117 /* |
105
eac1f370910a
English review (thanks afranke@)
David Demelier <markand@malikania.fr>
parents:
102
diff
changeset
|
118 * Convert to an int. dst must be (int *). |
82
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
119 */ |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
120 |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
121 void |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
122 ini_convert_int(void *, const char *, void *); |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
123 |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
124 /* |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
125 * Convert to a short. dst must be (short *). |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
126 */ |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
127 |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
128 void |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
129 ini_convert_short(void *, const char *, void *); |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
130 |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
131 /* |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
132 * Convert to a char *. dst must be (char **). This |
105
eac1f370910a
English review (thanks afranke@)
David Demelier <markand@malikania.fr>
parents:
102
diff
changeset
|
133 * function uses strdup(). You need to free the dst |
82
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
134 * pointer. |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
135 */ |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
136 |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
137 void |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
138 ini_convert_string(void *, const char *, void *); |
c8bbdbedcf07
Added a little convenient API for ini
David Demelier <markand@malikania.fr>
parents:
81
diff
changeset
|
139 |
79
fd817a7dbf2f
Switched a lot of things in ini
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
140 #endif /* _INI_H_ */ |