3 #include <ccan/tap/tap.h>
9 /* We don't actually want it to exit... */
10 static jmp_buf exited;
11 #define exit(status) longjmp(exited, (status) + 1)
13 #define printf saved_printf
14 static int saved_printf(const char *fmt, ...);
16 #define fprintf saved_fprintf
17 static int saved_fprintf(FILE *ignored, const char *fmt, ...);
19 #define vfprintf(f, fmt, ap) saved_vprintf(fmt, ap)
20 static int saved_vprintf(const char *fmt, va_list ap);
22 #define malloc(size) saved_malloc(size)
23 static void *saved_malloc(size_t size);
25 #include <ccan/opt/helpers.c>
26 #include <ccan/opt/opt.c>
27 #include <ccan/opt/usage.c>
28 #include <ccan/opt/parse.c>
30 static void reset_options(void)
34 opt_count = opt_num_short = opt_num_short_arg = opt_num_long = 0;
37 static char *output = NULL;
39 static int saved_vprintf(const char *fmt, va_list ap)
42 int ret = vasprintf(&p, fmt, ap);
45 output = realloc(output, strlen(output) + strlen(p) + 1);
53 static int saved_printf(const char *fmt, ...)
59 ret = saved_vprintf(fmt, ap);
64 static int saved_fprintf(FILE *ignored, const char *fmt, ...)
70 ret = saved_vprintf(fmt, ap);
76 static void *last_allocation;
77 static void *saved_malloc(size_t size)
79 return last_allocation = malloc(size);
83 int main(int argc, char *argv[])
91 opt_register_noarg("-a", opt_set_bool, &arg, "");
92 ok1(parse_args(&argc, &argv, "-a", NULL));
94 opt_register_arg("-b", opt_set_bool_arg, NULL, &arg, "");
95 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
97 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
99 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
101 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
103 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
105 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
107 /* opt_set_invbool */
111 opt_register_noarg("-a", opt_set_invbool, &arg, "");
112 ok1(parse_args(&argc, &argv, "-a", NULL));
114 opt_register_arg("-b", opt_set_invbool_arg, NULL,
116 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
118 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
120 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
122 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
124 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
126 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
130 char *arg = (char *)"wrong";
132 opt_register_arg("-a", opt_set_charp, NULL, &arg, "All");
133 ok1(parse_args(&argc, &argv, "-a", "string", NULL));
134 ok1(strcmp(arg, "string") == 0);
140 opt_register_arg("-a", opt_set_intval, NULL, &arg, "All");
141 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
143 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
145 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
147 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
148 if (sizeof(int) == 4)
149 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
151 fail("Handle other int sizes");
153 /* opt_set_uintval */
155 unsigned int arg = 1000;
157 opt_register_arg("-a", opt_set_uintval, NULL, &arg, "All");
158 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
160 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
161 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
163 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
164 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
165 if (ULONG_MAX == UINT_MAX) {
166 pass("Can't test overflow");
167 pass("Can't test error message");
170 sprintf(buf, "%lu", ULONG_MAX);
171 ok1(!parse_args(&argc, &argv, "-a", buf, NULL));
172 ok1(strstr(err_output, ": -a: value '")
173 && strstr(err_output, buf)
174 && strstr(err_output, "' does not fit into an integer"));
177 /* opt_set_longval */
181 opt_register_arg("-a", opt_set_longval, NULL, &arg, "All");
182 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
184 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
186 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
188 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
189 if (sizeof(long) == 4)
190 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
191 else if (sizeof(long)== 8)
192 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
194 fail("FIXME: Handle other long sizes");
196 /* opt_set_ulongval */
198 unsigned long int arg = 1000;
200 opt_register_arg("-a", opt_set_ulongval, NULL, &arg, "All");
201 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
203 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
204 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
206 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
207 if (sizeof(long) == 4)
208 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
209 else if (sizeof(long)== 8)
210 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
212 fail("FIXME: Handle other long sizes");
216 const long long k = 1024;
217 const long long M = k * k;
218 const long long G = k * k * k;
219 const long long T = k * k * k * k;
220 const long long P = k * k * k * k * k;
221 const long long E = k * k * k * k * k * k;
223 /* opt_set_uintval_bi */
225 unsigned int arg = 1000;
227 opt_register_arg("-a", opt_set_uintval_bi, NULL,
229 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
231 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
232 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
235 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
238 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
240 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
241 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
243 ok1(!parse_args(&argc, &argv, "-a", "-1K", NULL));
246 /* opt_set_intval_bi */
250 opt_register_arg("-a", opt_set_intval_bi, NULL,
252 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
254 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
256 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
259 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
262 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
264 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
265 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
267 ok1(parse_args(&argc, &argv, "-a", "-1K", NULL));
272 /* opt_set_ulongval_bi */
274 unsigned long int arg = 1000;
277 opt_register_arg("-a", opt_set_ulongval_bi, NULL,
279 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
281 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
282 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
285 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
287 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
288 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
290 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
292 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
294 /*note, 2999M > max signed 32 bit long, 1 << 31*/
295 ok1(parse_args(&argc, &argv, "-a", "2999m", NULL));
296 ok1(arg == 2999 * M);
297 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
299 ok1(!parse_args(&argc, &argv, "-a", "-1G", NULL));
300 if (sizeof(long) == 4){
301 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
302 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
303 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
305 else if (sizeof(long) == 8){
306 ok1(!parse_args(&argc, &argv, "-a",
307 "18446744073709551616", NULL));
308 ok1(!parse_args(&argc, &argv, "-a", "8E", NULL));
309 ok1(parse_args(&argc, &argv, "-a", "3E", NULL));
312 fail("FIXME: Handle other long sizes");
315 /* opt_set_longval_bi */
320 opt_register_arg("-a", opt_set_longval_bi, NULL,
322 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
324 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
326 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
328 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
329 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
330 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
332 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
333 ok1(arg == -100 * k);
334 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
336 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
338 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
340 ok1(parse_args(&argc, &argv, "-a", "-1G", NULL));
342 if (sizeof(long) == 4){
343 ok1(!parse_args(&argc, &argv, "-a", "2147483648", NULL));
344 ok1(!parse_args(&argc, &argv, "-a", "2G", NULL));
345 ok1(!parse_args(&argc, &argv, "-a", "2048m", NULL));
346 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
347 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
349 else if (sizeof(long) == 8){
350 ok1(!parse_args(&argc, &argv, "-a",
351 "9223372036854775808", NULL));
352 ok1(parse_args(&argc, &argv, "-a", "3E", NULL));
354 ok1(parse_args(&argc, &argv, "-a", "123T", NULL));
358 fail("FIXME: Handle other long sizes");
362 /* opt_set_longlongval_bi */
364 long long int arg = 1000;
366 opt_register_arg("-a", opt_set_longlongval_bi, NULL,
368 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
370 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
372 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
374 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
375 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
376 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
377 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
379 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
380 ok1(arg == -100 * k);
381 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
383 ok1(parse_args(&argc, &argv, "-a", "-333333M", NULL));
384 ok1(arg == -333333 * M);
385 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
387 ok1(parse_args(&argc, &argv, "-a", "1024t", NULL));
388 ok1(arg == 1024 * T);
389 ok1(parse_args(&argc, &argv, "-a", "123P", NULL));
391 ok1(parse_args(&argc, &argv, "-a", "-3E", NULL));
394 if (sizeof(long long) == 8){
395 ok1(!parse_args(&argc, &argv, "-a",
396 "9223372036854775808", NULL));
397 /*8E and 922337.. are both 1 << 63*/
398 ok1(!parse_args(&argc, &argv, "-a", "8E", NULL));
401 fail("FIXME: Handle other long long int"
402 " sizes (specifically %lu bytes)",
405 /* opt_set_ulonglongval_bi */
407 unsigned long long int arg = 1000;
409 opt_register_arg("-a", opt_set_ulonglongval_bi, NULL,
411 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
413 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
414 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
416 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
417 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
418 ok1(parse_args(&argc, &argv, "-a", "100G", NULL));
420 ok1(!parse_args(&argc, &argv, "-a", "-100G", NULL));
421 ok1(parse_args(&argc, &argv, "-a", "8191P", NULL));
422 ok1(arg == 8191 * P);
425 /* opt_show_intval_bi */
428 char buf[OPT_SHOW_LEN+2] = { 0 };
429 buf[OPT_SHOW_LEN] = '!';
431 opt_show_intval_bi(buf, &i);
432 ok1(strcmp(buf, "-77") == 0);
434 opt_show_intval_bi(buf, &i);
435 ok1(strcmp(buf, "0") == 0);
436 ok1(buf[OPT_SHOW_LEN] == '!');
438 opt_show_intval_bi(buf, &i);
439 ok1(strcmp(buf, "77") == 0);
440 ok1(buf[OPT_SHOW_LEN] == '!');
442 opt_show_intval_bi(buf, &i);
443 ok1(strcmp(buf, "-1234k") == 0);
444 ok1(buf[OPT_SHOW_LEN] == '!');
446 opt_show_intval_bi(buf, &i);
447 ok1(strcmp(buf, "500M") == 0);
448 ok1(buf[OPT_SHOW_LEN] == '!');
450 opt_show_intval_bi(buf, &i);
451 ok1(strcmp(buf, "1G") == 0);
452 ok1(buf[OPT_SHOW_LEN] == '!');
455 /* opt_show_longval_bi */
458 char buf[OPT_SHOW_LEN+2] = { 0 };
459 buf[OPT_SHOW_LEN] = '!';
461 opt_show_longval_bi(buf, &i);
462 ok1(strcmp(buf, "-77") == 0);
463 ok1(buf[OPT_SHOW_LEN] == '!');
465 opt_show_longval_bi(buf, &i);
466 ok1(strcmp(buf, "77") == 0);
467 ok1(buf[OPT_SHOW_LEN] == '!');
469 opt_show_longval_bi(buf, &i);
470 ok1(strcmp(buf, "-1k") == 0);
471 ok1(buf[OPT_SHOW_LEN] == '!');
473 opt_show_longval_bi(buf, &i);
474 ok1(strcmp(buf, "500M") == 0);
475 ok1(buf[OPT_SHOW_LEN] == '!');
477 opt_show_longval_bi(buf, &i);
478 ok1(strcmp(buf, "1G") == 0);
479 ok1(buf[OPT_SHOW_LEN] == '!');
481 opt_show_longval_bi(buf, &i);
482 ok1(strcmp(buf, "0") == 0);
483 ok1(buf[OPT_SHOW_LEN] == '!');
486 /* opt_show_llongval_bi */
489 char buf[OPT_SHOW_LEN+2] = { 0 };
490 buf[OPT_SHOW_LEN] = '!';
492 opt_show_longlongval_bi(buf, &i);
493 ok1(strcmp(buf, "-7777") == 0);
494 ok1(buf[OPT_SHOW_LEN] == '!');
496 opt_show_longlongval_bi(buf, &i);
497 ok1(strcmp(buf, "7777") == 0);
498 ok1(buf[OPT_SHOW_LEN] == '!');
500 opt_show_longlongval_bi(buf, &i);
501 ok1(strcmp(buf, "-10000M") == 0);
502 ok1(buf[OPT_SHOW_LEN] == '!');
504 opt_show_longlongval_bi(buf, &i);
505 ok1(strcmp(buf, "5P") == 0);
506 ok1(buf[OPT_SHOW_LEN] == '!');
508 opt_show_longlongval_bi(buf, &i);
509 ok1(strcmp(buf, "1E") == 0);
510 ok1(buf[OPT_SHOW_LEN] == '!');
513 /* opt_show_uintval_bi */
516 char buf[OPT_SHOW_LEN+2] = { 0 };
517 buf[OPT_SHOW_LEN] = '!';
519 opt_show_uintval_bi(buf, &i);
520 ok1(strcmp(buf, "77") == 0);
521 ok1(buf[OPT_SHOW_LEN] == '!');
523 opt_show_uintval_bi(buf, &i);
524 ok1(strcmp(buf, "1234k") == 0);
525 ok1(buf[OPT_SHOW_LEN] == '!');
527 opt_show_uintval_bi(buf, &i);
528 ok1(strcmp(buf, "500M") == 0);
529 ok1(buf[OPT_SHOW_LEN] == '!');
531 opt_show_uintval_bi(buf, &i);
532 ok1(strcmp(buf, "1G") == 0);
533 ok1(buf[OPT_SHOW_LEN] == '!');
536 /* opt_show_ulongval_bi */
539 char buf[OPT_SHOW_LEN+2] = { 0 };
540 buf[OPT_SHOW_LEN] = '!';
542 opt_show_ulongval_bi(buf, &i);
543 ok1(strcmp(buf, "77") == 0);
544 ok1(buf[OPT_SHOW_LEN] == '!');
546 opt_show_ulongval_bi(buf, &i);
547 ok1(strcmp(buf, "1k") == 0);
548 ok1(buf[OPT_SHOW_LEN] == '!');
550 opt_show_ulongval_bi(buf, &i);
551 ok1(strcmp(buf, "500M") == 0);
552 ok1(buf[OPT_SHOW_LEN] == '!');
554 opt_show_ulongval_bi(buf, &i);
555 ok1(strcmp(buf, "1G") == 0);
556 ok1(buf[OPT_SHOW_LEN] == '!');
558 opt_show_ulongval_bi(buf, &i);
559 ok1(strcmp(buf, "0") == 0);
560 ok1(buf[OPT_SHOW_LEN] == '!');
563 /* opt_show_ullongval_bi */
566 char buf[OPT_SHOW_LEN+2] = { 0 };
567 buf[OPT_SHOW_LEN] = '!';
569 opt_show_ulonglongval_bi(buf, &i);
570 ok1(strcmp(buf, "7777") == 0);
571 ok1(buf[OPT_SHOW_LEN] == '!');
573 opt_show_ulonglongval_bi(buf, &i);
574 ok1(strcmp(buf, "10000M") == 0);
575 ok1(buf[OPT_SHOW_LEN] == '!');
577 opt_show_ulonglongval_bi(buf, &i);
578 ok1(strcmp(buf, "5P") == 0);
579 ok1(buf[OPT_SHOW_LEN] == '!');
581 opt_show_ulonglongval_bi(buf, &i);
582 ok1(strcmp(buf, "1E") == 0);
583 ok1(buf[OPT_SHOW_LEN] == '!');
588 const long long k = 1000;
589 const long long M = k * k;
590 const long long G = k * k * k;
591 const long long T = k * k * k * k;
592 const long long P = k * k * k * k * k;
593 const long long E = k * k * k * k * k * k;
595 /* opt_set_uintval_si */
597 unsigned int arg = 1000;
599 opt_register_arg("-a", opt_set_uintval_si, NULL,
601 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
603 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
604 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
607 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
610 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
612 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
613 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
615 ok1(!parse_args(&argc, &argv, "-a", "-1K", NULL));
616 if (sizeof(unsigned int) < 8)
617 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
619 pass("can't test int truncation when int is so huge");
622 /* opt_set_intval_si */
626 opt_register_arg("-a", opt_set_intval_si, NULL,
628 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
630 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
632 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
635 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
638 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
640 ok1(!parse_args(&argc, &argv, "-a", "", NULL));
641 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
642 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
644 ok1(parse_args(&argc, &argv, "-a", "-1K", NULL));
647 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
649 pass("can't test int truncation when int is so huge");
653 /* opt_set_ulongval_si */
655 unsigned long long int arg = 1000;
658 opt_register_arg("-a", opt_set_ulongval_si, NULL,
660 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
662 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
663 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
665 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
666 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
667 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
669 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
671 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
673 /*note, 2999M > max signed 32 bit long, 1 << 31*/
674 ok1(parse_args(&argc, &argv, "-a", "2999m", NULL));
675 ok1(arg == 2999 * M);
676 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
678 ok1(!parse_args(&argc, &argv, "-a", "-1G", NULL));
679 ok1(parse_args(&argc, &argv, "-a", "4G", NULL));
680 ok1(arg == 4000000000);
681 if (sizeof(long) == 4){
682 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
683 ok1(!parse_args(&argc, &argv, "-a", "4295M", NULL));
684 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
685 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
687 else if (sizeof(long)== 8){
688 ok1(!parse_args(&argc, &argv, "-a",
689 "18446744073709551616", NULL));
690 ok1(parse_args(&argc, &argv, "-a", "9E", NULL));
691 ok1(arg == 9000000000000000000ULL);
692 ok1(!parse_args(&argc, &argv, "-a", "19E", NULL));
695 fail("FIXME: Handle other long sizes");
698 /* opt_set_longval_si */
703 opt_register_arg("-a", opt_set_longval_si, NULL,
705 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
707 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
709 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
711 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
712 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
713 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
715 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
716 ok1(arg == -100 * k);
717 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
719 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
721 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
723 ok1(parse_args(&argc, &argv, "-a", "-1G", NULL));
725 if (sizeof(long) == 4){
726 ok1(!parse_args(&argc, &argv, "-a", "2147483648", NULL));
727 ok1(!parse_args(&argc, &argv, "-a", "4G", NULL));
728 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
729 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
730 ok1(parse_args(&argc, &argv, "-a", "1999m", NULL));
731 ok1(arg == 1999 * M);
733 else if (sizeof(long)== 8){
734 ok1(!parse_args(&argc, &argv, "-a",
735 "9223372036854775808", NULL));
736 ok1(!parse_args(&argc, &argv, "-a", "9224P", NULL));
737 ok1(parse_args(&argc, &argv, "-a", "9E", NULL));
739 ok1(parse_args(&argc, &argv, "-a", "123T", NULL));
743 fail("FIXME: Handle other long sizes");
747 /* opt_set_longlongval_si */
749 long long int arg = 1000;
751 opt_register_arg("-a", opt_set_longlongval_si, NULL,
753 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
755 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
757 ok1(parse_args(&argc, &argv, "-a", "0T", NULL));
759 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
760 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
761 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
762 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
764 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
765 ok1(arg == -100 * k);
766 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
768 ok1(parse_args(&argc, &argv, "-a", "-333333M", NULL));
769 ok1(arg == -333333 * M);
770 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
772 ok1(parse_args(&argc, &argv, "-a", "1024t", NULL));
773 ok1(arg == 1024 * T);
774 ok1(parse_args(&argc, &argv, "-a", "123P", NULL));
776 ok1(parse_args(&argc, &argv, "-a", "-3E", NULL));
778 ok1(parse_args(&argc, &argv, "-a", "8E", NULL));
779 if (sizeof(long long) == 8){
780 ok1(!parse_args(&argc, &argv, "-a",
781 "9223372036854775808", NULL));
782 ok1(!parse_args(&argc, &argv, "-a",
786 fail("FIXME: Handle other long long int"
787 " sizes (specifically %lu bytes)",
791 /* opt_set_ulonglongval_si */
793 unsigned long long int arg = 1000;
795 opt_register_arg("-a", opt_set_ulonglongval_si, NULL,
797 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
799 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
800 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
802 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
803 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
804 ok1(parse_args(&argc, &argv, "-a", "100G", NULL));
806 ok1(!parse_args(&argc, &argv, "-a", "-100G", NULL));
807 ok1(parse_args(&argc, &argv, "-a", "8E", NULL));
809 /* opt_show_intval_si */
812 char buf[OPT_SHOW_LEN+2] = { 0 };
813 buf[OPT_SHOW_LEN] = '!';
815 opt_show_intval_si(buf, &i);
816 ok1(strcmp(buf, "-77") == 0);
818 opt_show_intval_si(buf, &i);
819 ok1(strcmp(buf, "0") == 0);
820 ok1(buf[OPT_SHOW_LEN] == '!');
822 opt_show_intval_si(buf, &i);
823 ok1(strcmp(buf, "77") == 0);
824 ok1(buf[OPT_SHOW_LEN] == '!');
826 opt_show_intval_si(buf, &i);
827 ok1(strcmp(buf, "-1234k") == 0);
828 ok1(buf[OPT_SHOW_LEN] == '!');
830 opt_show_intval_si(buf, &i);
831 ok1(strcmp(buf, "500M") == 0);
832 ok1(buf[OPT_SHOW_LEN] == '!');
834 opt_show_intval_si(buf, &i);
835 ok1(strcmp(buf, "1G") == 0);
836 ok1(buf[OPT_SHOW_LEN] == '!');
839 /* opt_show_longval_si */
842 char buf[OPT_SHOW_LEN+2] = { 0 };
843 buf[OPT_SHOW_LEN] = '!';
845 opt_show_longval_si(buf, &i);
846 ok1(strcmp(buf, "-77") == 0);
847 ok1(buf[OPT_SHOW_LEN] == '!');
849 opt_show_longval_si(buf, &i);
850 ok1(strcmp(buf, "77") == 0);
851 ok1(buf[OPT_SHOW_LEN] == '!');
853 opt_show_longval_si(buf, &i);
854 ok1(strcmp(buf, "-1k") == 0);
855 ok1(buf[OPT_SHOW_LEN] == '!');
857 opt_show_longval_si(buf, &i);
858 ok1(strcmp(buf, "500M") == 0);
859 ok1(buf[OPT_SHOW_LEN] == '!');
861 opt_show_longval_si(buf, &i);
862 ok1(strcmp(buf, "1G") == 0);
863 ok1(buf[OPT_SHOW_LEN] == '!');
865 opt_show_longval_si(buf, &i);
866 ok1(strcmp(buf, "0") == 0);
867 ok1(buf[OPT_SHOW_LEN] == '!');
870 /* opt_show_llongval_si */
873 char buf[OPT_SHOW_LEN+2] = { 0 };
874 buf[OPT_SHOW_LEN] = '!';
876 opt_show_longlongval_si(buf, &i);
877 ok1(strcmp(buf, "-7777") == 0);
878 ok1(buf[OPT_SHOW_LEN] == '!');
880 opt_show_longlongval_si(buf, &i);
881 ok1(strcmp(buf, "7777") == 0);
882 ok1(buf[OPT_SHOW_LEN] == '!');
884 opt_show_longlongval_si(buf, &i);
885 ok1(strcmp(buf, "-10240M") == 0);
886 ok1(buf[OPT_SHOW_LEN] == '!');
888 opt_show_longlongval_si(buf, &i);
889 ok1(strcmp(buf, "5P") == 0);
890 ok1(buf[OPT_SHOW_LEN] == '!');
892 opt_show_longlongval_si(buf, &i);
893 ok1(strcmp(buf, "2E") == 0);
894 ok1(buf[OPT_SHOW_LEN] == '!');
897 /* opt_show_uintval_si */
900 char buf[OPT_SHOW_LEN+2] = { 0 };
901 buf[OPT_SHOW_LEN] = '!';
903 opt_show_uintval_si(buf, &i);
904 ok1(strcmp(buf, "77") == 0);
905 ok1(buf[OPT_SHOW_LEN] == '!');
907 opt_show_uintval_si(buf, &i);
908 ok1(strcmp(buf, "1234k") == 0);
909 ok1(buf[OPT_SHOW_LEN] == '!');
911 opt_show_uintval_si(buf, &i);
912 ok1(strcmp(buf, "500M") == 0);
913 ok1(buf[OPT_SHOW_LEN] == '!');
915 opt_show_uintval_si(buf, &i);
916 ok1(strcmp(buf, "1G") == 0);
917 ok1(buf[OPT_SHOW_LEN] == '!');
920 /* opt_show_ulongval_si */
923 char buf[OPT_SHOW_LEN+2] = { 0 };
924 buf[OPT_SHOW_LEN] = '!';
926 opt_show_ulongval_si(buf, &i);
927 ok1(strcmp(buf, "77") == 0);
928 ok1(buf[OPT_SHOW_LEN] == '!');
930 opt_show_ulongval_si(buf, &i);
931 ok1(strcmp(buf, "1k") == 0);
932 ok1(buf[OPT_SHOW_LEN] == '!');
934 opt_show_ulongval_si(buf, &i);
935 ok1(strcmp(buf, "500M") == 0);
936 ok1(buf[OPT_SHOW_LEN] == '!');
938 opt_show_ulongval_si(buf, &i);
939 ok1(strcmp(buf, "1024M") == 0);
940 ok1(buf[OPT_SHOW_LEN] == '!');
942 opt_show_ulongval_si(buf, &i);
943 ok1(strcmp(buf, "0") == 0);
944 ok1(buf[OPT_SHOW_LEN] == '!');
947 /* opt_show_ullongval_si */
950 char buf[OPT_SHOW_LEN+2] = { 0 };
951 buf[OPT_SHOW_LEN] = '!';
953 opt_show_ulonglongval_si(buf, &i);
954 ok1(strcmp(buf, "7777") == 0);
955 ok1(buf[OPT_SHOW_LEN] == '!');
957 opt_show_ulonglongval_si(buf, &i);
958 ok1(strcmp(buf, "10240M") == 0);
959 ok1(buf[OPT_SHOW_LEN] == '!');
961 opt_show_ulonglongval_si(buf, &i);
962 ok1(strcmp(buf, "5P") == 0);
963 ok1(buf[OPT_SHOW_LEN] == '!');
965 opt_show_ulonglongval_si(buf, &i);
966 ok1(strcmp(buf, "1E") == 0);
967 ok1(buf[OPT_SHOW_LEN] == '!');
977 opt_register_noarg("-a", opt_inc_intval, &arg, "");
978 ok1(parse_args(&argc, &argv, "-a", NULL));
980 ok1(parse_args(&argc, &argv, "-a", "-a", NULL));
982 ok1(parse_args(&argc, &argv, "-aa", NULL));
986 /* opt_show_version_and_exit. */
990 opt_register_noarg("-a",
991 opt_version_and_exit, "1.2.3", "");
992 /* parse_args allocates argv */
996 argv = malloc(sizeof(argv[0]) * 3);
997 argv[0] = "thisprog";
1001 exitval = setjmp(exited);
1003 opt_parse(&argc, argv, save_err_output);
1004 fail("opt_show_version_and_exit returned?");
1006 ok1(exitval - 1 == 0);
1008 ok1(strcmp(output, "1.2.3\n") == 0);
1014 /* opt_usage_and_exit. */
1018 opt_register_noarg("-a",
1019 opt_usage_and_exit, "[args]", "");
1022 argv = malloc(sizeof(argv[0]) * 3);
1023 argv[0] = "thisprog";
1027 exitval = setjmp(exited);
1029 opt_parse(&argc, argv, save_err_output);
1030 fail("opt_usage_and_exit returned?");
1032 ok1(exitval - 1 == 0);
1034 ok1(strstr(output, "[args]"));
1035 ok1(strstr(output, argv[0]));
1036 ok1(strstr(output, "[-a]"));
1039 /* It exits without freeing usage string. */
1040 free(last_allocation);
1047 char buf[OPT_SHOW_LEN+2] = { 0 };
1048 buf[OPT_SHOW_LEN] = '!';
1051 opt_show_bool(buf, &b);
1052 ok1(strcmp(buf, "true") == 0);
1053 ok1(buf[OPT_SHOW_LEN] == '!');
1056 opt_show_bool(buf, &b);
1057 ok1(strcmp(buf, "false") == 0);
1058 ok1(buf[OPT_SHOW_LEN] == '!');
1061 /* opt_show_invbool */
1064 char buf[OPT_SHOW_LEN+2] = { 0 };
1065 buf[OPT_SHOW_LEN] = '!';
1068 opt_show_invbool(buf, &b);
1069 ok1(strcmp(buf, "false") == 0);
1070 ok1(buf[OPT_SHOW_LEN] == '!');
1073 opt_show_invbool(buf, &b);
1074 ok1(strcmp(buf, "true") == 0);
1075 ok1(buf[OPT_SHOW_LEN] == '!');
1078 /* opt_show_charp */
1080 char str[OPT_SHOW_LEN*2], *p;
1081 char buf[OPT_SHOW_LEN+2] = { 0 };
1082 buf[OPT_SHOW_LEN] = '!';
1087 opt_show_charp(buf, &p);
1088 ok1(strcmp(buf, "\"short\"") == 0);
1089 ok1(buf[OPT_SHOW_LEN] == '!');
1091 /* Truncate test. */
1092 memset(p, 'x', OPT_SHOW_LEN*2);
1093 p[OPT_SHOW_LEN*2-1] = '\0';
1094 opt_show_charp(buf, &p);
1096 ok1(buf[OPT_SHOW_LEN-1] == '"');
1097 ok1(buf[OPT_SHOW_LEN] == '!');
1098 ok1(strspn(buf+1, "x") == OPT_SHOW_LEN-2);
1101 /* opt_show_intval */
1104 char buf[OPT_SHOW_LEN+2] = { 0 };
1105 buf[OPT_SHOW_LEN] = '!';
1108 opt_show_intval(buf, &i);
1109 ok1(strcmp(buf, "-77") == 0);
1110 ok1(buf[OPT_SHOW_LEN] == '!');
1113 opt_show_intval(buf, &i);
1114 ok1(strcmp(buf, "77") == 0);
1115 ok1(buf[OPT_SHOW_LEN] == '!');
1118 /* opt_show_uintval */
1121 char buf[OPT_SHOW_LEN+2] = { 0 };
1122 buf[OPT_SHOW_LEN] = '!';
1125 opt_show_uintval(buf, &ui);
1126 ok1(strcmp(buf, "4294967295") == 0);
1127 ok1(buf[OPT_SHOW_LEN] == '!');
1130 /* opt_show_longval */
1133 char buf[OPT_SHOW_LEN+2] = { 0 };
1134 buf[OPT_SHOW_LEN] = '!';
1137 opt_show_longval(buf, &l);
1138 ok1(strcmp(buf, "1234567890") == 0);
1139 ok1(buf[OPT_SHOW_LEN] == '!');
1142 /* opt_show_ulongval */
1145 char buf[OPT_SHOW_LEN+2] = { 0 };
1146 buf[OPT_SHOW_LEN] = '!';
1149 opt_show_ulongval(buf, &ul);
1150 ok1(strcmp(buf, "4294967295") == 0);
1151 ok1(buf[OPT_SHOW_LEN] == '!');
1154 /* opt_log_stderr. */
1157 opt_register_noarg("-a",
1158 opt_usage_and_exit, "[args]", "");
1161 argv = malloc(sizeof(argv[0]) * 3);
1162 argv[0] = "thisprog";
1163 argv[1] = "--garbage";
1165 ok1(!opt_parse(&argc, argv, opt_log_stderr));
1167 "thisprog: --garbage: unrecognized option\n"));
1173 /* opt_log_stderr_exit. */
1177 opt_register_noarg("-a",
1178 opt_usage_and_exit, "[args]", "");
1180 argv = malloc(sizeof(argv[0]) * 3);
1181 argv[0] = "thisprog";
1182 argv[1] = "--garbage";
1184 exitval = setjmp(exited);
1186 opt_parse(&argc, argv, opt_log_stderr_exit);
1187 fail("opt_log_stderr_exit returned?");
1189 ok1(exitval - 1 == 1);
1193 "thisprog: --garbage: unrecognized option\n"));
1198 //diag("%s\n", err_output);
1199 return exit_status();