]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-extract-word.c
test-ordered-set: add a case where we get 0 for duplicate entries
[thirdparty/systemd.git] / src / test / test-extract-word.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2
3 #include <errno.h>
4 #include <stdlib.h>
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
14 p = original = "foobar waldo";
15 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
16 assert_se(streq(t, "foobar"));
17 free(t);
18 assert_se(p == original + 7);
19
20 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
21 assert_se(streq(t, "waldo"));
22 free(t);
23 assert_se(isempty(p));
24
25 assert_se(extract_first_word(&p, &t, NULL, 0) == 0);
26 assert_se(!t);
27 assert_se(isempty(p));
28
29 p = original = "\"foobar\" \'waldo\'";
30 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
31 assert_se(streq(t, "\"foobar\""));
32 free(t);
33 assert_se(p == original + 9);
34
35 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
36 assert_se(streq(t, "\'waldo\'"));
37 free(t);
38 assert_se(isempty(p));
39
40 assert_se(extract_first_word(&p, &t, NULL, 0) == 0);
41 assert_se(!t);
42 assert_se(isempty(p));
43
44 p = original = "\"foobar\" \'waldo\'";
45 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) > 0);
46 assert_se(streq(t, "foobar"));
47 free(t);
48 assert_se(p == original + 9);
49
50 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) > 0);
51 assert_se(streq(t, "waldo"));
52 free(t);
53 assert_se(isempty(p));
54
55 assert_se(extract_first_word(&p, &t, NULL, 0) == 0);
56 assert_se(!t);
57 assert_se(isempty(p));
58
59 p = original = "\"";
60 assert_se(extract_first_word(&p, &t, NULL, 0) == 1);
61 assert_se(streq(t, "\""));
62 free(t);
63 assert_se(isempty(p));
64
65 p = original = "\"";
66 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) == -EINVAL);
67 assert_se(p == original + 1);
68
69 p = original = "\'";
70 assert_se(extract_first_word(&p, &t, NULL, 0) == 1);
71 assert_se(streq(t, "\'"));
72 free(t);
73 assert_se(isempty(p));
74
75 p = original = "\'";
76 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) == -EINVAL);
77 assert_se(p == original + 1);
78
79 p = original = "\'fooo";
80 assert_se(extract_first_word(&p, &t, NULL, 0) == 1);
81 assert_se(streq(t, "\'fooo"));
82 free(t);
83 assert_se(isempty(p));
84
85 p = original = "KEY=val \"KEY2=val with space\" \"KEY3=val with \\\"quotation\\\"\"";
86 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) == 1);
87 assert_se(streq(t, "KEY=val"));
88 free(t);
89 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) == 1);
90 assert_se(streq(t, "KEY2=val with space"));
91 free(t);
92 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) == 1);
93 assert_se(streq(t, "KEY3=val with \"quotation\""));
94 free(t);
95 assert_se(isempty(p));
96
97 p = original = "KEY=val \"KEY2=val space\" \"KEY3=val with \\\"quotation\\\"\"";
98 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RETAIN_ESCAPE) == 1);
99 assert_se(streq(t, "KEY=val"));
100 free(t);
101 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RETAIN_ESCAPE) == 1);
102 assert_se(streq(t, "\"KEY2=val"));
103 free(t);
104 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RETAIN_ESCAPE) == 1);
105 assert_se(streq(t, "space\""));
106 free(t);
107 assert_se(startswith(p, "\"KEY3="));
108
109 p = original = "\'fooo";
110 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) == -EINVAL);
111 assert_se(p == original + 5);
112
113 p = original = "\'fooo";
114 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_RELAX) > 0);
115 assert_se(streq(t, "fooo"));
116 free(t);
117 assert_se(isempty(p));
118
119 p = original = "\"fooo";
120 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_RELAX) > 0);
121 assert_se(streq(t, "fooo"));
122 free(t);
123 assert_se(isempty(p));
124
125 p = original = "yay\'foo\'bar";
126 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
127 assert_se(streq(t, "yay\'foo\'bar"));
128 free(t);
129 assert_se(isempty(p));
130
131 p = original = "yay\'foo\'bar";
132 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) > 0);
133 assert_se(streq(t, "yayfoobar"));
134 free(t);
135 assert_se(isempty(p));
136
137 p = original = " foobar ";
138 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
139 assert_se(streq(t, "foobar"));
140 free(t);
141 assert_se(isempty(p));
142
143 p = original = " foo\\ba\\x6ar ";
144 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) > 0);
145 assert_se(streq(t, "foo\ba\x6ar"));
146 free(t);
147 assert_se(isempty(p));
148
149 p = original = " foo\\ba\\x6ar ";
150 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
151 assert_se(streq(t, "foobax6ar"));
152 free(t);
153 assert_se(isempty(p));
154
155 p = original = " f\\u00f6o \"pi\\U0001F4A9le\" ";
156 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) > 0);
157 assert_se(streq(t, "föo"));
158 free(t);
159 assert_se(p == original + 13);
160
161 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE) > 0);
162 assert_se(streq(t, "pi\360\237\222\251le"));
163 free(t);
164 assert_se(isempty(p));
165
166 p = original = "fooo\\";
167 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RELAX) > 0);
168 assert_se(streq(t, "fooo"));
169 free(t);
170 assert_se(isempty(p));
171
172 p = original = "fooo\\";
173 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX) > 0);
174 assert_se(streq(t, "fooo\\"));
175 free(t);
176 assert_se(isempty(p));
177
178 p = original = "fooo\\";
179 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
180 assert_se(streq(t, "fooo\\"));
181 free(t);
182 assert_se(isempty(p));
183
184 p = original = "fooo\\";
185 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
186 assert_se(streq(t, "fooo\\"));
187 free(t);
188 assert_se(isempty(p));
189
190 p = original = "\"foo\\";
191 assert_se(extract_first_word(&p, &t, NULL, 0) == -EINVAL);
192 assert_se(p == original + 5);
193
194 p = original = "\"foo\\";
195 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_RELAX) > 0);
196 assert_se(streq(t, "foo"));
197 free(t);
198 assert_se(isempty(p));
199
200 p = original = "foo::bar";
201 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
202 assert_se(streq(t, "foo"));
203 free(t);
204 assert_se(p == original + 5);
205
206 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
207 assert_se(streq(t, "bar"));
208 free(t);
209 assert_se(isempty(p));
210
211 assert_se(extract_first_word(&p, &t, ":", 0) == 0);
212 assert_se(!t);
213 assert_se(isempty(p));
214
215 p = original = "foo\\:bar::waldo";
216 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
217 assert_se(streq(t, "foo:bar"));
218 free(t);
219 assert_se(p == original + 10);
220
221 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
222 assert_se(streq(t, "waldo"));
223 free(t);
224 assert_se(isempty(p));
225
226 assert_se(extract_first_word(&p, &t, ":", 0) == 0);
227 assert_se(!t);
228 assert_se(isempty(p));
229
230 p = original = "\"foo\\";
231 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE_RELAX) == -EINVAL);
232 assert_se(p == original + 5);
233
234 p = original = "\"foo\\";
235 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
236 assert_se(streq(t, "foo\\"));
237 free(t);
238 assert_se(isempty(p));
239
240 p = original = "\"foo\\";
241 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
242 assert_se(streq(t, "foo\\"));
243 free(t);
244 assert_se(isempty(p));
245
246 p = original = "fooo\\ bar quux";
247 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RELAX) > 0);
248 assert_se(streq(t, "fooo bar"));
249 free(t);
250 assert_se(p == original + 10);
251
252 p = original = "fooo\\ bar quux";
253 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX) > 0);
254 assert_se(streq(t, "fooo bar"));
255 free(t);
256 assert_se(p == original + 10);
257
258 p = original = "fooo\\ bar quux";
259 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
260 assert_se(streq(t, "fooo bar"));
261 free(t);
262 assert_se(p == original + 10);
263
264 p = original = "fooo\\ bar quux";
265 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) == -EINVAL);
266 assert_se(p == original + 5);
267
268 p = original = "fooo\\ bar quux";
269 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
270 assert_se(streq(t, "fooo\\ bar"));
271 free(t);
272 assert_se(p == original + 10);
273
274 p = original = "\\w+@\\K[\\d.]+";
275 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) == -EINVAL);
276 assert_se(p == original + 1);
277
278 p = original = "\\w+@\\K[\\d.]+";
279 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
280 assert_se(streq(t, "\\w+@\\K[\\d.]+"));
281 free(t);
282 assert_se(isempty(p));
283
284 p = original = "\\w+\\b";
285 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
286 assert_se(streq(t, "\\w+\b"));
287 free(t);
288 assert_se(isempty(p));
289
290 p = original = "-N ''";
291 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) > 0);
292 assert_se(streq(t, "-N"));
293 free(t);
294 assert_se(p == original + 3);
295
296 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE) > 0);
297 assert_se(streq(t, ""));
298 free(t);
299 assert_se(isempty(p));
300
301 p = original = ":foo\\:bar::waldo:";
302 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
303 assert_se(t);
304 assert_se(streq(t, ""));
305 free(t);
306 assert_se(p == original + 1);
307
308 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
309 assert_se(streq(t, "foo:bar"));
310 free(t);
311 assert_se(p == original + 10);
312
313 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
314 assert_se(t);
315 assert_se(streq(t, ""));
316 free(t);
317 assert_se(p == original + 11);
318
319 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
320 assert_se(streq(t, "waldo"));
321 free(t);
322 assert_se(p == original + 17);
323
324 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
325 assert_se(streq(t, ""));
326 free(t);
327 assert_se(p == NULL);
328
329 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 0);
330 assert_se(!t);
331 assert_se(!p);
332
333 p = "foo\\xbar";
334 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
335 assert_se(streq(t, "fooxbar"));
336 free(t);
337 assert_se(p == NULL);
338
339 p = "foo\\xbar";
340 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RETAIN_ESCAPE) > 0);
341 assert_se(streq(t, "foo\\xbar"));
342 free(t);
343 assert_se(p == NULL);
344 }
345
346 static void test_extract_first_word_and_warn(void) {
347 const char *p, *original;
348 char *t;
349
350 p = original = "foobar waldo";
351 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
352 assert_se(streq(t, "foobar"));
353 free(t);
354 assert_se(p == original + 7);
355
356 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
357 assert_se(streq(t, "waldo"));
358 free(t);
359 assert_se(isempty(p));
360
361 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) == 0);
362 assert_se(!t);
363 assert_se(isempty(p));
364
365 p = original = "\"foobar\" \'waldo\'";
366 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE, NULL, "fake", 1, original) > 0);
367 assert_se(streq(t, "foobar"));
368 free(t);
369 assert_se(p == original + 9);
370
371 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE, NULL, "fake", 1, original) > 0);
372 assert_se(streq(t, "waldo"));
373 free(t);
374 assert_se(isempty(p));
375
376 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) == 0);
377 assert_se(!t);
378 assert_se(isempty(p));
379
380 p = original = "\"";
381 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE, NULL, "fake", 1, original) == -EINVAL);
382 assert_se(p == original + 1);
383
384 p = original = "\'";
385 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE, NULL, "fake", 1, original) == -EINVAL);
386 assert_se(p == original + 1);
387
388 p = original = "\'fooo";
389 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE, NULL, "fake", 1, original) == -EINVAL);
390 assert_se(p == original + 5);
391
392 p = original = "\'fooo";
393 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
394 assert_se(streq(t, "fooo"));
395 free(t);
396 assert_se(isempty(p));
397
398 p = original = " foo\\ba\\x6ar ";
399 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
400 assert_se(streq(t, "foo\ba\x6ar"));
401 free(t);
402 assert_se(isempty(p));
403
404 p = original = " foo\\ba\\x6ar ";
405 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
406 assert_se(streq(t, "foobax6ar"));
407 free(t);
408 assert_se(isempty(p));
409
410 p = original = " f\\u00f6o \"pi\\U0001F4A9le\" ";
411 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
412 assert_se(streq(t, "föo"));
413 free(t);
414 assert_se(p == original + 13);
415
416 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
417 assert_se(streq(t, "pi\360\237\222\251le"));
418 free(t);
419 assert_se(isempty(p));
420
421 p = original = "fooo\\";
422 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
423 assert_se(streq(t, "fooo"));
424 free(t);
425 assert_se(isempty(p));
426
427 p = original = "fooo\\";
428 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
429 assert_se(streq(t, "fooo\\"));
430 free(t);
431 assert_se(isempty(p));
432
433 p = original = "fooo\\";
434 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
435 assert_se(streq(t, "fooo\\"));
436 free(t);
437 assert_se(isempty(p));
438
439 p = original = "\"foo\\";
440 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE, NULL, "fake", 1, original) == -EINVAL);
441 assert_se(p == original + 5);
442
443 p = original = "\"foo\\";
444 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
445 assert_se(streq(t, "foo"));
446 free(t);
447 assert_se(isempty(p));
448
449 p = original = "\"foo\\";
450 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE, NULL, "fake", 1, original) == -EINVAL);
451 assert_se(p == original + 5);
452
453 p = original = "\"foo\\";
454 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
455 assert_se(streq(t, "foo"));
456 free(t);
457 assert_se(isempty(p));
458
459 p = original = "fooo\\ bar quux";
460 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
461 assert_se(streq(t, "fooo bar"));
462 free(t);
463 assert_se(p == original + 10);
464
465 p = original = "fooo\\ bar quux";
466 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
467 assert_se(streq(t, "fooo bar"));
468 free(t);
469 assert_se(p == original + 10);
470
471 p = original = "fooo\\ bar quux";
472 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
473 assert_se(streq(t, "fooo\\ bar"));
474 free(t);
475 assert_se(p == original + 10);
476
477 p = original = "\\w+@\\K[\\d.]+";
478 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
479 assert_se(streq(t, "\\w+@\\K[\\d.]+"));
480 free(t);
481 assert_se(isempty(p));
482
483 p = original = "\\w+\\b";
484 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
485 assert_se(streq(t, "\\w+\b"));
486 free(t);
487 assert_se(isempty(p));
488 }
489
490 static void test_extract_many_words(void) {
491 const char *p, *original;
492 char *a, *b, *c;
493
494 p = original = "foobar waldi piep";
495 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 3);
496 assert_se(isempty(p));
497 assert_se(streq_ptr(a, "foobar"));
498 assert_se(streq_ptr(b, "waldi"));
499 assert_se(streq_ptr(c, "piep"));
500 free(a);
501 free(b);
502 free(c);
503
504 p = original = "'foobar' wa\"ld\"i ";
505 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 2);
506 assert_se(isempty(p));
507 assert_se(streq_ptr(a, "'foobar'"));
508 assert_se(streq_ptr(b, "wa\"ld\"i"));
509 assert_se(streq_ptr(c, NULL));
510 free(a);
511 free(b);
512
513 p = original = "'foobar' wa\"ld\"i ";
514 assert_se(extract_many_words(&p, NULL, EXTRACT_UNQUOTE, &a, &b, &c, NULL) == 2);
515 assert_se(isempty(p));
516 assert_se(streq_ptr(a, "foobar"));
517 assert_se(streq_ptr(b, "waldi"));
518 assert_se(streq_ptr(c, NULL));
519 free(a);
520 free(b);
521
522 p = original = "";
523 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0);
524 assert_se(isempty(p));
525 assert_se(streq_ptr(a, NULL));
526 assert_se(streq_ptr(b, NULL));
527 assert_se(streq_ptr(c, NULL));
528
529 p = original = " ";
530 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0);
531 assert_se(isempty(p));
532 assert_se(streq_ptr(a, NULL));
533 assert_se(streq_ptr(b, NULL));
534 assert_se(streq_ptr(c, NULL));
535
536 p = original = "foobar";
537 assert_se(extract_many_words(&p, NULL, 0, NULL) == 0);
538 assert_se(p == original);
539
540 p = original = "foobar waldi";
541 assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1);
542 assert_se(p == original+7);
543 assert_se(streq_ptr(a, "foobar"));
544 free(a);
545
546 p = original = " foobar ";
547 assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1);
548 assert_se(isempty(p));
549 assert_se(streq_ptr(a, "foobar"));
550 free(a);
551 }
552
553 int main(int argc, char *argv[]) {
554 log_parse_environment();
555 log_open();
556
557 test_extract_first_word();
558 test_extract_first_word_and_warn();
559 test_extract_many_words();
560
561 return 0;
562 }