]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
23a3c916 | 2 | |
dccca82b | 3 | #include <errno.h> |
23a3c916 | 4 | #include <stdlib.h> |
23a3c916 FB |
5 | |
6 | #include "extract-word.h" | |
7 | #include "log.h" | |
8 | #include "string-util.h" | |
9 | ||
10 | static void test_extract_first_word(void) { | |
11 | const char *p, *original; | |
12 | char *t; | |
13 | ||
0176728a ZJS |
14 | log_info("/* %s */", __func__); |
15 | ||
23a3c916 FB |
16 | p = original = "foobar waldo"; |
17 | assert_se(extract_first_word(&p, &t, NULL, 0) > 0); | |
18 | assert_se(streq(t, "foobar")); | |
19 | free(t); | |
20 | assert_se(p == original + 7); | |
21 | ||
22 | assert_se(extract_first_word(&p, &t, NULL, 0) > 0); | |
23 | assert_se(streq(t, "waldo")); | |
24 | free(t); | |
25 | assert_se(isempty(p)); | |
26 | ||
27 | assert_se(extract_first_word(&p, &t, NULL, 0) == 0); | |
28 | assert_se(!t); | |
29 | assert_se(isempty(p)); | |
30 | ||
31 | p = original = "\"foobar\" \'waldo\'"; | |
32 | assert_se(extract_first_word(&p, &t, NULL, 0) > 0); | |
33 | assert_se(streq(t, "\"foobar\"")); | |
34 | free(t); | |
35 | assert_se(p == original + 9); | |
36 | ||
37 | assert_se(extract_first_word(&p, &t, NULL, 0) > 0); | |
38 | assert_se(streq(t, "\'waldo\'")); | |
39 | free(t); | |
40 | assert_se(isempty(p)); | |
41 | ||
42 | assert_se(extract_first_word(&p, &t, NULL, 0) == 0); | |
43 | assert_se(!t); | |
44 | assert_se(isempty(p)); | |
45 | ||
46 | p = original = "\"foobar\" \'waldo\'"; | |
4ec85141 | 47 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) > 0); |
23a3c916 FB |
48 | assert_se(streq(t, "foobar")); |
49 | free(t); | |
50 | assert_se(p == original + 9); | |
51 | ||
4ec85141 | 52 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) > 0); |
23a3c916 FB |
53 | assert_se(streq(t, "waldo")); |
54 | free(t); | |
55 | assert_se(isempty(p)); | |
56 | ||
57 | assert_se(extract_first_word(&p, &t, NULL, 0) == 0); | |
58 | assert_se(!t); | |
59 | assert_se(isempty(p)); | |
60 | ||
61 | p = original = "\""; | |
62 | assert_se(extract_first_word(&p, &t, NULL, 0) == 1); | |
63 | assert_se(streq(t, "\"")); | |
64 | free(t); | |
65 | assert_se(isempty(p)); | |
66 | ||
67 | p = original = "\""; | |
4ec85141 | 68 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) == -EINVAL); |
23a3c916 FB |
69 | assert_se(p == original + 1); |
70 | ||
71 | p = original = "\'"; | |
72 | assert_se(extract_first_word(&p, &t, NULL, 0) == 1); | |
73 | assert_se(streq(t, "\'")); | |
74 | free(t); | |
75 | assert_se(isempty(p)); | |
76 | ||
77 | p = original = "\'"; | |
4ec85141 | 78 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) == -EINVAL); |
23a3c916 FB |
79 | assert_se(p == original + 1); |
80 | ||
81 | p = original = "\'fooo"; | |
82 | assert_se(extract_first_word(&p, &t, NULL, 0) == 1); | |
83 | assert_se(streq(t, "\'fooo")); | |
84 | free(t); | |
85 | assert_se(isempty(p)); | |
86 | ||
8a07b403 ZJS |
87 | p = original = "KEY=val \"KEY2=val with space\" \"KEY3=val with \\\"quotation\\\"\""; |
88 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) == 1); | |
89 | assert_se(streq(t, "KEY=val")); | |
90 | free(t); | |
91 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) == 1); | |
92 | assert_se(streq(t, "KEY2=val with space")); | |
93 | free(t); | |
94 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) == 1); | |
95 | assert_se(streq(t, "KEY3=val with \"quotation\"")); | |
96 | free(t); | |
97 | assert_se(isempty(p)); | |
98 | ||
99 | p = original = "KEY=val \"KEY2=val space\" \"KEY3=val with \\\"quotation\\\"\""; | |
100 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RETAIN_ESCAPE) == 1); | |
101 | assert_se(streq(t, "KEY=val")); | |
102 | free(t); | |
103 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RETAIN_ESCAPE) == 1); | |
104 | assert_se(streq(t, "\"KEY2=val")); | |
105 | free(t); | |
106 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RETAIN_ESCAPE) == 1); | |
107 | assert_se(streq(t, "space\"")); | |
108 | free(t); | |
109 | assert_se(startswith(p, "\"KEY3=")); | |
110 | ||
23a3c916 | 111 | p = original = "\'fooo"; |
4ec85141 | 112 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) == -EINVAL); |
23a3c916 FB |
113 | assert_se(p == original + 5); |
114 | ||
115 | p = original = "\'fooo"; | |
4ec85141 | 116 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_RELAX) > 0); |
23a3c916 FB |
117 | assert_se(streq(t, "fooo")); |
118 | free(t); | |
119 | assert_se(isempty(p)); | |
120 | ||
121 | p = original = "\"fooo"; | |
4ec85141 | 122 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_RELAX) > 0); |
23a3c916 FB |
123 | assert_se(streq(t, "fooo")); |
124 | free(t); | |
125 | assert_se(isempty(p)); | |
126 | ||
127 | p = original = "yay\'foo\'bar"; | |
128 | assert_se(extract_first_word(&p, &t, NULL, 0) > 0); | |
129 | assert_se(streq(t, "yay\'foo\'bar")); | |
130 | free(t); | |
131 | assert_se(isempty(p)); | |
132 | ||
133 | p = original = "yay\'foo\'bar"; | |
4ec85141 | 134 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) > 0); |
23a3c916 FB |
135 | assert_se(streq(t, "yayfoobar")); |
136 | free(t); | |
137 | assert_se(isempty(p)); | |
138 | ||
139 | p = original = " foobar "; | |
140 | assert_se(extract_first_word(&p, &t, NULL, 0) > 0); | |
141 | assert_se(streq(t, "foobar")); | |
142 | free(t); | |
143 | assert_se(isempty(p)); | |
144 | ||
145 | p = original = " foo\\ba\\x6ar "; | |
146 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) > 0); | |
147 | assert_se(streq(t, "foo\ba\x6ar")); | |
148 | free(t); | |
149 | assert_se(isempty(p)); | |
150 | ||
151 | p = original = " foo\\ba\\x6ar "; | |
152 | assert_se(extract_first_word(&p, &t, NULL, 0) > 0); | |
153 | assert_se(streq(t, "foobax6ar")); | |
154 | free(t); | |
155 | assert_se(isempty(p)); | |
156 | ||
157 | p = original = " f\\u00f6o \"pi\\U0001F4A9le\" "; | |
158 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) > 0); | |
159 | assert_se(streq(t, "föo")); | |
160 | free(t); | |
161 | assert_se(p == original + 13); | |
162 | ||
4ec85141 | 163 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE) > 0); |
23a3c916 FB |
164 | assert_se(streq(t, "pi\360\237\222\251le")); |
165 | free(t); | |
166 | assert_se(isempty(p)); | |
167 | ||
168 | p = original = "fooo\\"; | |
169 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RELAX) > 0); | |
170 | assert_se(streq(t, "fooo")); | |
171 | free(t); | |
172 | assert_se(isempty(p)); | |
173 | ||
174 | p = original = "fooo\\"; | |
3141089f | 175 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNESCAPE_RELAX) > 0); |
23a3c916 FB |
176 | assert_se(streq(t, "fooo\\")); |
177 | free(t); | |
178 | assert_se(isempty(p)); | |
179 | ||
180 | p = original = "fooo\\"; | |
3141089f | 181 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNESCAPE_RELAX|EXTRACT_RELAX) > 0); |
23a3c916 FB |
182 | assert_se(streq(t, "fooo\\")); |
183 | free(t); | |
184 | assert_se(isempty(p)); | |
185 | ||
186 | p = original = "fooo\\"; | |
3141089f | 187 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX) > 0); |
23a3c916 FB |
188 | assert_se(streq(t, "fooo\\")); |
189 | free(t); | |
190 | assert_se(isempty(p)); | |
191 | ||
192 | p = original = "\"foo\\"; | |
193 | assert_se(extract_first_word(&p, &t, NULL, 0) == -EINVAL); | |
194 | assert_se(p == original + 5); | |
195 | ||
196 | p = original = "\"foo\\"; | |
4ec85141 | 197 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_RELAX) > 0); |
23a3c916 FB |
198 | assert_se(streq(t, "foo")); |
199 | free(t); | |
200 | assert_se(isempty(p)); | |
201 | ||
202 | p = original = "foo::bar"; | |
203 | assert_se(extract_first_word(&p, &t, ":", 0) == 1); | |
204 | assert_se(streq(t, "foo")); | |
205 | free(t); | |
206 | assert_se(p == original + 5); | |
207 | ||
208 | assert_se(extract_first_word(&p, &t, ":", 0) == 1); | |
209 | assert_se(streq(t, "bar")); | |
210 | free(t); | |
211 | assert_se(isempty(p)); | |
212 | ||
213 | assert_se(extract_first_word(&p, &t, ":", 0) == 0); | |
214 | assert_se(!t); | |
215 | assert_se(isempty(p)); | |
216 | ||
217 | p = original = "foo\\:bar::waldo"; | |
218 | assert_se(extract_first_word(&p, &t, ":", 0) == 1); | |
219 | assert_se(streq(t, "foo:bar")); | |
220 | free(t); | |
221 | assert_se(p == original + 10); | |
222 | ||
223 | assert_se(extract_first_word(&p, &t, ":", 0) == 1); | |
224 | assert_se(streq(t, "waldo")); | |
225 | free(t); | |
226 | assert_se(isempty(p)); | |
227 | ||
228 | assert_se(extract_first_word(&p, &t, ":", 0) == 0); | |
229 | assert_se(!t); | |
230 | assert_se(isempty(p)); | |
231 | ||
232 | p = original = "\"foo\\"; | |
3141089f | 233 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_UNESCAPE_RELAX) == -EINVAL); |
23a3c916 FB |
234 | assert_se(p == original + 5); |
235 | ||
236 | p = original = "\"foo\\"; | |
3141089f | 237 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_UNESCAPE_RELAX|EXTRACT_RELAX) > 0); |
23a3c916 FB |
238 | assert_se(streq(t, "foo\\")); |
239 | free(t); | |
240 | assert_se(isempty(p)); | |
241 | ||
242 | p = original = "\"foo\\"; | |
3141089f | 243 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX|EXTRACT_RELAX) > 0); |
23a3c916 FB |
244 | assert_se(streq(t, "foo\\")); |
245 | free(t); | |
246 | assert_se(isempty(p)); | |
247 | ||
248 | p = original = "fooo\\ bar quux"; | |
249 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RELAX) > 0); | |
250 | assert_se(streq(t, "fooo bar")); | |
251 | free(t); | |
252 | assert_se(p == original + 10); | |
253 | ||
254 | p = original = "fooo\\ bar quux"; | |
3141089f | 255 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNESCAPE_RELAX) > 0); |
23a3c916 FB |
256 | assert_se(streq(t, "fooo bar")); |
257 | free(t); | |
258 | assert_se(p == original + 10); | |
259 | ||
260 | p = original = "fooo\\ bar quux"; | |
3141089f | 261 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNESCAPE_RELAX|EXTRACT_RELAX) > 0); |
23a3c916 FB |
262 | assert_se(streq(t, "fooo bar")); |
263 | free(t); | |
264 | assert_se(p == original + 10); | |
265 | ||
266 | p = original = "fooo\\ bar quux"; | |
267 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) == -EINVAL); | |
268 | assert_se(p == original + 5); | |
269 | ||
270 | p = original = "fooo\\ bar quux"; | |
3141089f | 271 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX) > 0); |
23a3c916 FB |
272 | assert_se(streq(t, "fooo\\ bar")); |
273 | free(t); | |
274 | assert_se(p == original + 10); | |
275 | ||
276 | p = original = "\\w+@\\K[\\d.]+"; | |
277 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) == -EINVAL); | |
278 | assert_se(p == original + 1); | |
279 | ||
280 | p = original = "\\w+@\\K[\\d.]+"; | |
3141089f | 281 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX) > 0); |
23a3c916 FB |
282 | assert_se(streq(t, "\\w+@\\K[\\d.]+")); |
283 | free(t); | |
284 | assert_se(isempty(p)); | |
285 | ||
286 | p = original = "\\w+\\b"; | |
3141089f | 287 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX) > 0); |
23a3c916 FB |
288 | assert_se(streq(t, "\\w+\b")); |
289 | free(t); | |
290 | assert_se(isempty(p)); | |
291 | ||
292 | p = original = "-N ''"; | |
4ec85141 | 293 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) > 0); |
23a3c916 FB |
294 | assert_se(streq(t, "-N")); |
295 | free(t); | |
296 | assert_se(p == original + 3); | |
297 | ||
4ec85141 | 298 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) > 0); |
23a3c916 FB |
299 | assert_se(streq(t, "")); |
300 | free(t); | |
301 | assert_se(isempty(p)); | |
302 | ||
303 | p = original = ":foo\\:bar::waldo:"; | |
304 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1); | |
305 | assert_se(t); | |
306 | assert_se(streq(t, "")); | |
307 | free(t); | |
308 | assert_se(p == original + 1); | |
309 | ||
310 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1); | |
311 | assert_se(streq(t, "foo:bar")); | |
312 | free(t); | |
313 | assert_se(p == original + 10); | |
314 | ||
315 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1); | |
316 | assert_se(t); | |
317 | assert_se(streq(t, "")); | |
318 | free(t); | |
319 | assert_se(p == original + 11); | |
320 | ||
321 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1); | |
322 | assert_se(streq(t, "waldo")); | |
323 | free(t); | |
324 | assert_se(p == original + 17); | |
325 | ||
326 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1); | |
327 | assert_se(streq(t, "")); | |
328 | free(t); | |
329 | assert_se(p == NULL); | |
330 | ||
331 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 0); | |
332 | assert_se(!t); | |
333 | assert_se(!p); | |
c89f52ac LP |
334 | |
335 | p = "foo\\xbar"; | |
336 | assert_se(extract_first_word(&p, &t, NULL, 0) > 0); | |
337 | assert_se(streq(t, "fooxbar")); | |
338 | free(t); | |
339 | assert_se(p == NULL); | |
340 | ||
341 | p = "foo\\xbar"; | |
342 | assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RETAIN_ESCAPE) > 0); | |
343 | assert_se(streq(t, "foo\\xbar")); | |
344 | free(t); | |
345 | assert_se(p == NULL); | |
1e198efc | 346 | |
8723c716 ZJS |
347 | p = "\\:"; |
348 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == 1); | |
349 | assert_se(streq(t, ":")); | |
350 | free(t); | |
351 | assert_se(p == NULL); | |
352 | ||
353 | p = "a\\:b"; | |
354 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == 1); | |
355 | assert_se(streq(t, "a:b")); | |
356 | free(t); | |
357 | assert_se(p == NULL); | |
358 | ||
359 | p = "a\\ b:c"; | |
360 | assert_se(extract_first_word(&p, &t, WHITESPACE ":", EXTRACT_UNESCAPE_SEPARATORS) == 1); | |
361 | assert_se(streq(t, "a b")); | |
362 | free(t); | |
363 | assert_se(extract_first_word(&p, &t, WHITESPACE ":", EXTRACT_UNESCAPE_SEPARATORS) == 1); | |
364 | assert_se(streq(t, "c")); | |
365 | free(t); | |
366 | assert_se(p == NULL); | |
367 | ||
76c4e48e ZJS |
368 | p = "a\\ b:c\\x"; |
369 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == -EINVAL); | |
370 | ||
371 | p = "a\\\\ b:c\\\\x"; | |
372 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == 1); | |
373 | assert_se(streq(t, "a\\ b")); | |
374 | free(t); | |
375 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == 1); | |
376 | assert_se(streq(t, "c\\x")); | |
377 | free(t); | |
378 | assert_se(p == NULL); | |
379 | ||
1e198efc ZJS |
380 | p = "\\:"; |
381 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == 1); | |
382 | assert_se(streq(t, ":")); | |
383 | free(t); | |
384 | assert_se(p == NULL); | |
385 | ||
386 | p = "a\\:b"; | |
387 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == 1); | |
388 | assert_se(streq(t, "a:b")); | |
389 | free(t); | |
390 | assert_se(p == NULL); | |
391 | ||
392 | p = "a\\ b:c"; | |
393 | assert_se(extract_first_word(&p, &t, WHITESPACE ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == 1); | |
394 | assert_se(streq(t, "a b")); | |
395 | free(t); | |
396 | assert_se(extract_first_word(&p, &t, WHITESPACE ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == 1); | |
397 | assert_se(streq(t, "c")); | |
398 | free(t); | |
399 | assert_se(p == NULL); | |
400 | ||
76c4e48e ZJS |
401 | p = "a\\ b:c\\x"; |
402 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == -EINVAL); | |
403 | ||
404 | p = "a\\\\ b:c\\\\x"; | |
405 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == 1); | |
406 | assert_se(streq(t, "a\\ b")); | |
407 | free(t); | |
408 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == 1); | |
409 | assert_se(streq(t, "c\\x")); | |
410 | free(t); | |
411 | assert_se(p == NULL); | |
412 | ||
1e198efc ZJS |
413 | p = "\\:"; |
414 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE) == -EINVAL); | |
415 | ||
416 | p = "a\\:b"; | |
417 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE) == -EINVAL); | |
418 | assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE) == 1); | |
419 | assert_se(streq(t, "b")); | |
420 | free(t); | |
421 | ||
422 | p = "a\\ b:c"; | |
423 | assert_se(extract_first_word(&p, &t, WHITESPACE ":", EXTRACT_CUNESCAPE) == -EINVAL); | |
424 | assert_se(extract_first_word(&p, &t, WHITESPACE ":", EXTRACT_CUNESCAPE) == 1); | |
425 | assert_se(streq(t, "b")); | |
426 | free(t); | |
427 | assert_se(extract_first_word(&p, &t, WHITESPACE ":", EXTRACT_CUNESCAPE) == 1); | |
428 | assert_se(streq(t, "c")); | |
429 | free(t); | |
430 | assert_se(p == NULL); | |
b01339f7 LB |
431 | |
432 | p = original = "foobar=\"waldo\"maldo, baldo"; | |
433 | assert_se(extract_first_word(&p, &t, "=\", ", 0) > 0); | |
434 | assert_se(streq(t, "foobar")); | |
435 | free(t); | |
436 | assert_se(extract_first_word(&p, &t, "=\", ", 0) > 0); | |
437 | assert_se(streq(t, "waldo")); | |
438 | free(t); | |
439 | assert_se(extract_first_word(&p, &t, "=\", ", 0) > 0); | |
440 | assert_se(streq(t, "maldo")); | |
441 | free(t); | |
442 | assert_se(extract_first_word(&p, &t, "=\", ", 0) > 0); | |
443 | assert_se(streq(t, "baldo")); | |
444 | free(t); | |
23a3c916 FB |
445 | } |
446 | ||
447 | static void test_extract_first_word_and_warn(void) { | |
448 | const char *p, *original; | |
449 | char *t; | |
450 | ||
0176728a ZJS |
451 | log_info("/* %s */", __func__); |
452 | ||
23a3c916 FB |
453 | p = original = "foobar waldo"; |
454 | assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0); | |
455 | assert_se(streq(t, "foobar")); | |
456 | free(t); | |
457 | assert_se(p == original + 7); | |
458 | ||
459 | assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0); | |
460 | assert_se(streq(t, "waldo")); | |
461 | free(t); | |
462 | assert_se(isempty(p)); | |
463 | ||
464 | assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) == 0); | |
465 | assert_se(!t); | |
466 | assert_se(isempty(p)); | |
467 | ||
468 | p = original = "\"foobar\" \'waldo\'"; | |
4ec85141 | 469 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE, NULL, "fake", 1, original) > 0); |
23a3c916 FB |
470 | assert_se(streq(t, "foobar")); |
471 | free(t); | |
472 | assert_se(p == original + 9); | |
473 | ||
4ec85141 | 474 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE, NULL, "fake", 1, original) > 0); |
23a3c916 FB |
475 | assert_se(streq(t, "waldo")); |
476 | free(t); | |
477 | assert_se(isempty(p)); | |
478 | ||
479 | assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) == 0); | |
480 | assert_se(!t); | |
481 | assert_se(isempty(p)); | |
482 | ||
483 | p = original = "\""; | |
4ec85141 | 484 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE, NULL, "fake", 1, original) == -EINVAL); |
23a3c916 FB |
485 | assert_se(p == original + 1); |
486 | ||
487 | p = original = "\'"; | |
4ec85141 | 488 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE, NULL, "fake", 1, original) == -EINVAL); |
23a3c916 FB |
489 | assert_se(p == original + 1); |
490 | ||
491 | p = original = "\'fooo"; | |
4ec85141 | 492 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE, NULL, "fake", 1, original) == -EINVAL); |
23a3c916 FB |
493 | assert_se(p == original + 5); |
494 | ||
495 | p = original = "\'fooo"; | |
4ec85141 | 496 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_RELAX, NULL, "fake", 1, original) > 0); |
23a3c916 FB |
497 | assert_se(streq(t, "fooo")); |
498 | free(t); | |
499 | assert_se(isempty(p)); | |
500 | ||
501 | p = original = " foo\\ba\\x6ar "; | |
502 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0); | |
503 | assert_se(streq(t, "foo\ba\x6ar")); | |
504 | free(t); | |
505 | assert_se(isempty(p)); | |
506 | ||
507 | p = original = " foo\\ba\\x6ar "; | |
508 | assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0); | |
509 | assert_se(streq(t, "foobax6ar")); | |
510 | free(t); | |
511 | assert_se(isempty(p)); | |
512 | ||
513 | p = original = " f\\u00f6o \"pi\\U0001F4A9le\" "; | |
514 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0); | |
515 | assert_se(streq(t, "föo")); | |
516 | free(t); | |
517 | assert_se(p == original + 13); | |
518 | ||
4ec85141 | 519 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0); |
23a3c916 FB |
520 | assert_se(streq(t, "pi\360\237\222\251le")); |
521 | free(t); | |
522 | assert_se(isempty(p)); | |
523 | ||
524 | p = original = "fooo\\"; | |
525 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_RELAX, NULL, "fake", 1, original) > 0); | |
526 | assert_se(streq(t, "fooo")); | |
527 | free(t); | |
528 | assert_se(isempty(p)); | |
529 | ||
530 | p = original = "fooo\\"; | |
531 | assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0); | |
532 | assert_se(streq(t, "fooo\\")); | |
533 | free(t); | |
534 | assert_se(isempty(p)); | |
535 | ||
536 | p = original = "fooo\\"; | |
537 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0); | |
538 | assert_se(streq(t, "fooo\\")); | |
539 | free(t); | |
540 | assert_se(isempty(p)); | |
541 | ||
542 | p = original = "\"foo\\"; | |
4ec85141 | 543 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE, NULL, "fake", 1, original) == -EINVAL); |
23a3c916 FB |
544 | assert_se(p == original + 5); |
545 | ||
546 | p = original = "\"foo\\"; | |
4ec85141 | 547 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_RELAX, NULL, "fake", 1, original) > 0); |
23a3c916 FB |
548 | assert_se(streq(t, "foo")); |
549 | free(t); | |
550 | assert_se(isempty(p)); | |
551 | ||
552 | p = original = "\"foo\\"; | |
4ec85141 | 553 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE, NULL, "fake", 1, original) == -EINVAL); |
23a3c916 FB |
554 | assert_se(p == original + 5); |
555 | ||
556 | p = original = "\"foo\\"; | |
4ec85141 | 557 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE|EXTRACT_RELAX, NULL, "fake", 1, original) > 0); |
23a3c916 FB |
558 | assert_se(streq(t, "foo")); |
559 | free(t); | |
560 | assert_se(isempty(p)); | |
561 | ||
562 | p = original = "fooo\\ bar quux"; | |
563 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_RELAX, NULL, "fake", 1, original) > 0); | |
564 | assert_se(streq(t, "fooo bar")); | |
565 | free(t); | |
566 | assert_se(p == original + 10); | |
567 | ||
568 | p = original = "fooo\\ bar quux"; | |
569 | assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0); | |
570 | assert_se(streq(t, "fooo bar")); | |
571 | free(t); | |
572 | assert_se(p == original + 10); | |
573 | ||
574 | p = original = "fooo\\ bar quux"; | |
575 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0); | |
576 | assert_se(streq(t, "fooo\\ bar")); | |
577 | free(t); | |
578 | assert_se(p == original + 10); | |
579 | ||
580 | p = original = "\\w+@\\K[\\d.]+"; | |
581 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0); | |
582 | assert_se(streq(t, "\\w+@\\K[\\d.]+")); | |
583 | free(t); | |
584 | assert_se(isempty(p)); | |
585 | ||
586 | p = original = "\\w+\\b"; | |
587 | assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0); | |
588 | assert_se(streq(t, "\\w+\b")); | |
589 | free(t); | |
590 | assert_se(isempty(p)); | |
591 | } | |
592 | ||
593 | static void test_extract_many_words(void) { | |
594 | const char *p, *original; | |
866fdcce | 595 | char *a, *b, *c, *d, *e, *f; |
23a3c916 | 596 | |
0176728a ZJS |
597 | log_info("/* %s */", __func__); |
598 | ||
23a3c916 FB |
599 | p = original = "foobar waldi piep"; |
600 | assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 3); | |
601 | assert_se(isempty(p)); | |
602 | assert_se(streq_ptr(a, "foobar")); | |
603 | assert_se(streq_ptr(b, "waldi")); | |
604 | assert_se(streq_ptr(c, "piep")); | |
605 | free(a); | |
606 | free(b); | |
607 | free(c); | |
608 | ||
866fdcce LB |
609 | p = original = "foobar:waldi:piep ba1:ba2"; |
610 | assert_se(extract_many_words(&p, ":" WHITESPACE, 0, &a, &b, &c, NULL) == 3); | |
611 | assert_se(!isempty(p)); | |
612 | assert_se(streq_ptr(a, "foobar")); | |
613 | assert_se(streq_ptr(b, "waldi")); | |
614 | assert_se(streq_ptr(c, "piep")); | |
615 | assert_se(extract_many_words(&p, ":" WHITESPACE, 0, &d, &e, &f, NULL) == 2); | |
616 | assert_se(isempty(p)); | |
617 | assert_se(streq_ptr(d, "ba1")); | |
618 | assert_se(streq_ptr(e, "ba2")); | |
619 | assert_se(isempty(f)); | |
620 | free(a); | |
621 | free(b); | |
622 | free(c); | |
623 | free(d); | |
624 | free(e); | |
625 | free(f); | |
626 | ||
23a3c916 FB |
627 | p = original = "'foobar' wa\"ld\"i "; |
628 | assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 2); | |
629 | assert_se(isempty(p)); | |
630 | assert_se(streq_ptr(a, "'foobar'")); | |
631 | assert_se(streq_ptr(b, "wa\"ld\"i")); | |
632 | assert_se(streq_ptr(c, NULL)); | |
633 | free(a); | |
634 | free(b); | |
635 | ||
636 | p = original = "'foobar' wa\"ld\"i "; | |
4ec85141 | 637 | assert_se(extract_many_words(&p, NULL, EXTRACT_UNQUOTE, &a, &b, &c, NULL) == 2); |
23a3c916 FB |
638 | assert_se(isempty(p)); |
639 | assert_se(streq_ptr(a, "foobar")); | |
640 | assert_se(streq_ptr(b, "waldi")); | |
641 | assert_se(streq_ptr(c, NULL)); | |
642 | free(a); | |
643 | free(b); | |
644 | ||
645 | p = original = ""; | |
646 | assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0); | |
647 | assert_se(isempty(p)); | |
648 | assert_se(streq_ptr(a, NULL)); | |
649 | assert_se(streq_ptr(b, NULL)); | |
650 | assert_se(streq_ptr(c, NULL)); | |
651 | ||
652 | p = original = " "; | |
653 | assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0); | |
654 | assert_se(isempty(p)); | |
655 | assert_se(streq_ptr(a, NULL)); | |
656 | assert_se(streq_ptr(b, NULL)); | |
657 | assert_se(streq_ptr(c, NULL)); | |
658 | ||
659 | p = original = "foobar"; | |
660 | assert_se(extract_many_words(&p, NULL, 0, NULL) == 0); | |
661 | assert_se(p == original); | |
662 | ||
663 | p = original = "foobar waldi"; | |
664 | assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1); | |
665 | assert_se(p == original+7); | |
666 | assert_se(streq_ptr(a, "foobar")); | |
667 | free(a); | |
668 | ||
669 | p = original = " foobar "; | |
670 | assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1); | |
671 | assert_se(isempty(p)); | |
672 | assert_se(streq_ptr(a, "foobar")); | |
673 | free(a); | |
674 | } | |
675 | ||
676 | int main(int argc, char *argv[]) { | |
677 | log_parse_environment(); | |
678 | log_open(); | |
679 | ||
680 | test_extract_first_word(); | |
681 | test_extract_first_word_and_warn(); | |
682 | test_extract_many_words(); | |
683 | ||
684 | return 0; | |
685 | } |