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