File: runtime-options.patch

package info (click to toggle)
libinih 42-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 272 kB
  • sloc: ansic: 459; cpp: 101; sh: 36; makefile: 5
file content (292 lines) | stat: -rw-r--r-- 9,281 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
diff --git a/ini.c b/ini.c
index dcc50eb..0fae910 100644
--- a/ini.c
+++ b/ini.c
@@ -17,13 +17,22 @@ https://github.com/benhoyt/inih
 
 #include "ini.h"
 
-#if !INI_USE_STACK
 #include <stdlib.h>
-#endif
 
 #define MAX_SECTION 50
 #define MAX_NAME 50
 
+bool ini_allow_multiline = INI_ALLOW_MULTILINE;
+bool ini_allow_bom = INI_ALLOW_BOM;
+char* ini_start_comment_prefixes = INI_START_COMMENT_PREFIXES;
+bool ini_allow_inline_comments = INI_ALLOW_INLINE_COMMENTS;
+char* ini_inline_comment_prefixes = INI_INLINE_COMMENT_PREFIXES;
+bool ini_use_stack = INI_USE_STACK;
+int ini_max_line = INI_MAX_LINE;
+bool ini_allow_realloc = INI_ALLOW_REALLOC;
+int ini_initial_alloc = INI_INITIAL_ALLOC;
+bool ini_stop_on_first_error = INI_STOP_ON_FIRST_ERROR;
+
 /* Used by ini_parse_string() to keep track of string parsing state. */
 typedef struct {
     const char* ptr;
@@ -52,18 +61,18 @@ static char* lskip(const char* s)
    be prefixed by a whitespace character to register as a comment. */
 static char* find_chars_or_comment(const char* s, const char* chars)
 {
-#if INI_ALLOW_INLINE_COMMENTS
-    int was_space = 0;
-    while (*s && (!chars || !strchr(chars, *s)) &&
-           !(was_space && strchr(INI_INLINE_COMMENT_PREFIXES, *s))) {
-        was_space = isspace((unsigned char)(*s));
-        s++;
-    }
-#else
-    while (*s && (!chars || !strchr(chars, *s))) {
-        s++;
+    if (ini_allow_inline_comments) {
+        int was_space = 0;
+        while (*s && (!chars || !strchr(chars, *s)) &&
+               !(was_space && strchr(ini_inline_comment_prefixes, *s))) {
+            was_space = isspace((unsigned char)(*s));
+            s++;
+        }
+    } else {
+        while (*s && (!chars || !strchr(chars, *s))) {
+            s++;
+        }
     }
-#endif
     return (char*)s;
 }
 
@@ -80,17 +89,17 @@ int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
                      void* user)
 {
     /* Uses a fair bit of stack (use heap instead if you need to) */
-#if INI_USE_STACK
-    char line[INI_MAX_LINE];
-    int max_line = INI_MAX_LINE;
-#else
     char* line;
-    int max_line = INI_INITIAL_ALLOC;
-#endif
-#if INI_ALLOW_REALLOC
+    char line_buf[ini_max_line];
+    int max_line;
+    if (ini_use_stack) {
+        line = line_buf;
+        max_line = ini_max_line;
+    } else {
+        max_line = ini_initial_alloc;
+    }
     char* new_line;
     int offset;
-#endif
     char section[MAX_SECTION] = "";
     char prev_name[MAX_NAME] = "";
 
@@ -101,64 +110,56 @@ int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
     int lineno = 0;
     int error = 0;
 
-#if !INI_USE_STACK
-    line = (char*)malloc(INI_INITIAL_ALLOC);
-    if (!line) {
-        return -2;
+    if (!ini_use_stack) {
+        line = (char*)malloc(ini_initial_alloc);
+        if (!line) {
+            return -2;
+        }
     }
-#endif
 
-#if INI_HANDLER_LINENO
 #define HANDLER(u, s, n, v) handler(u, s, n, v, lineno)
-#else
-#define HANDLER(u, s, n, v) handler(u, s, n, v)
-#endif
 
     /* Scan through stream line by line */
     while (reader(line, max_line, stream) != NULL) {
-#if INI_ALLOW_REALLOC
-        offset = strlen(line);
-        while (offset == max_line - 1 && line[offset - 1] != '\n') {
-            max_line *= 2;
-            if (max_line > INI_MAX_LINE)
-                max_line = INI_MAX_LINE;
-            new_line = realloc(line, max_line);
-            if (!new_line) {
-                free(line);
-                return -2;
+        if (ini_allow_realloc) {
+            offset = strlen(line);
+            while (offset == max_line - 1 && line[offset - 1] != '\n') {
+                max_line *= 2;
+                if (max_line > ini_max_line)
+                    max_line = ini_max_line;
+                new_line = realloc(line, max_line);
+                if (!new_line) {
+                    free(line);
+                    return -2;
+                }
+                line = new_line;
+                if (reader(line + offset, max_line - offset, stream) == NULL)
+                    break;
+                if (max_line >= ini_max_line)
+                    break;
+                offset += strlen(line + offset);
             }
-            line = new_line;
-            if (reader(line + offset, max_line - offset, stream) == NULL)
-                break;
-            if (max_line >= INI_MAX_LINE)
-                break;
-            offset += strlen(line + offset);
         }
-#endif
 
         lineno++;
 
         start = line;
-#if INI_ALLOW_BOM
-        if (lineno == 1 && (unsigned char)start[0] == 0xEF &&
+        if (ini_allow_bom && lineno == 1 && (unsigned char)start[0] == 0xEF &&
                            (unsigned char)start[1] == 0xBB &&
                            (unsigned char)start[2] == 0xBF) {
             start += 3;
         }
-#endif
         start = lskip(rstrip(start));
 
-        if (strchr(INI_START_COMMENT_PREFIXES, *start)) {
+        if (strchr(ini_start_comment_prefixes, *start)) {
             /* Start-of-line comment */
         }
-#if INI_ALLOW_MULTILINE
-        else if (*prev_name && *start && start > line) {
+        else if (ini_allow_multiline && *prev_name && *start && start > line) {
             /* Non-blank line with leading whitespace, treat as continuation
                of previous name's value (as per Python configparser). */
             if (!HANDLER(user, section, prev_name, start) && !error)
                 error = lineno;
         }
-#endif
         else if (*start == '[') {
             /* A "[section]" line */
             end = find_chars_or_comment(start + 1, "]");
@@ -179,11 +180,11 @@ int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
                 *end = '\0';
                 name = rstrip(start);
                 value = end + 1;
-#if INI_ALLOW_INLINE_COMMENTS
-                end = find_chars_or_comment(value, NULL);
-                if (*end)
-                    *end = '\0';
-#endif
+                if (ini_allow_inline_comments) {
+                    end = find_chars_or_comment(value, NULL);
+                    if (*end)
+                        *end = '\0';
+                }
                 value = lskip(value);
                 rstrip(value);
 
@@ -198,15 +199,13 @@ int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
             }
         }
 
-#if INI_STOP_ON_FIRST_ERROR
-        if (error)
+        if (ini_stop_on_first_error && error)
             break;
-#endif
     }
 
-#if !INI_USE_STACK
-    free(line);
-#endif
+    if (!ini_use_stack) {
+        free(line);
+    }
 
     return error;
 }
diff --git a/ini.h b/ini.h
index f45ba40..affbb4a 100644
--- a/ini.h
+++ b/ini.h
@@ -16,6 +16,7 @@ extern "C" {
 #endif
 
 #include <stdio.h>
+#include <stdbool.h>
 
 /* Nonzero if ini_handler callback should accept lineno parameter. */
 #ifndef INI_HANDLER_LINENO
@@ -71,18 +72,21 @@ int ini_parse_string(const char* string, ini_handler handler, void* user);
 #ifndef INI_ALLOW_MULTILINE
 #define INI_ALLOW_MULTILINE 1
 #endif
+extern bool ini_allow_multiline;
 
 /* Nonzero to allow a UTF-8 BOM sequence (0xEF 0xBB 0xBF) at the start of
    the file. See http://code.google.com/p/inih/issues/detail?id=21 */
 #ifndef INI_ALLOW_BOM
 #define INI_ALLOW_BOM 1
 #endif
+extern bool ini_allow_bom;
 
 /* Chars that begin a start-of-line comment. Per Python configparser, allow
    both ; and # comments at the start of a line by default. */
 #ifndef INI_START_COMMENT_PREFIXES
 #define INI_START_COMMENT_PREFIXES ";#"
 #endif
+extern char* ini_start_comment_prefixes;
 
 /* Nonzero to allow inline comments (with valid inline comment characters
    specified by INI_INLINE_COMMENT_PREFIXES). Set to 0 to turn off and match
@@ -90,20 +94,24 @@ int ini_parse_string(const char* string, ini_handler handler, void* user);
 #ifndef INI_ALLOW_INLINE_COMMENTS
 #define INI_ALLOW_INLINE_COMMENTS 1
 #endif
+extern bool ini_allow_inline_comments;
 #ifndef INI_INLINE_COMMENT_PREFIXES
 #define INI_INLINE_COMMENT_PREFIXES ";"
 #endif
+extern char* ini_inline_comment_prefixes;
 
 /* Nonzero to use stack for line buffer, zero to use heap (malloc/free). */
 #ifndef INI_USE_STACK
 #define INI_USE_STACK 1
 #endif
+extern bool ini_use_stack;
 
 /* Maximum line length for any line in INI file (stack or heap). Note that
    this must be 3 more than the longest line (due to '\r', '\n', and '\0'). */
 #ifndef INI_MAX_LINE
 #define INI_MAX_LINE 200
 #endif
+extern int ini_max_line;
 
 /* Nonzero to allow heap line buffer to grow via realloc(), zero for a
    fixed-size buffer of INI_MAX_LINE bytes. Only applies if INI_USE_STACK is
@@ -111,17 +119,20 @@ int ini_parse_string(const char* string, ini_handler handler, void* user);
 #ifndef INI_ALLOW_REALLOC
 #define INI_ALLOW_REALLOC 0
 #endif
+extern bool ini_allow_realloc;
 
 /* Initial size in bytes for heap line buffer. Only applies if INI_USE_STACK
    is zero. */
 #ifndef INI_INITIAL_ALLOC
 #define INI_INITIAL_ALLOC 200
 #endif
+extern int ini_initial_alloc;
 
 /* Stop parsing on first error (default is to keep parsing). */
 #ifndef INI_STOP_ON_FIRST_ERROR
 #define INI_STOP_ON_FIRST_ERROR 0
 #endif
+extern bool ini_stop_on_first_error;
 
 #ifdef __cplusplus
 }