]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/test/test-extract-word.c
Merge pull request #18701 from bugaevc/mdns-unicast
[thirdparty/systemd.git] / src / test / test-extract-word.c
CommitLineData
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
10static 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
447static 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
593static 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
676int 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}