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