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