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