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 #include <ccan/opt/helpers.c>
23 #include <ccan/opt/opt.c>
24 #include <ccan/opt/usage.c>
25 #include <ccan/opt/parse.c>
27 static char *output = NULL;
29 static int saved_vprintf(const char *fmt, va_list ap)
32 int ret = vasprintf(&p, fmt, ap);
35 output = realloc(output, strlen(output) + strlen(p) + 1);
43 static int saved_printf(const char *fmt, ...)
49 ret = saved_vprintf(fmt, ap);
54 static int saved_fprintf(FILE *ignored, const char *fmt, ...)
60 ret = saved_vprintf(fmt, ap);
65 static void set_args(int *argc, char ***argv, ...)
68 *argv = malloc(sizeof(**argv) * 20);
72 ((*argv)[*argc] = va_arg(ap, char*)) != NULL;
78 int main(int argc, char *argv[])
86 opt_register_noarg("-a", opt_set_bool, &arg, "");
87 ok1(parse_args(&argc, &argv, "-a", NULL));
89 opt_register_arg("-b", opt_set_bool_arg, NULL, &arg, "");
90 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
92 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
94 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
96 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
98 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
100 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
102 /* opt_set_invbool */
106 opt_register_noarg("-a", opt_set_invbool, &arg, "");
107 ok1(parse_args(&argc, &argv, "-a", NULL));
109 opt_register_arg("-b", opt_set_invbool_arg, NULL,
111 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
113 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
115 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
117 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
119 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
121 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
125 char *arg = cast_const(char *, "wrong");
127 opt_register_arg("-a", opt_set_charp, NULL, &arg, "All");
128 ok1(parse_args(&argc, &argv, "-a", "string", NULL));
129 ok1(strcmp(arg, "string") == 0);
135 opt_register_arg("-a", opt_set_intval, NULL, &arg, "All");
136 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
138 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
140 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
142 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
143 if (sizeof(int) == 4)
144 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
146 fail("Handle other int sizes");
148 /* opt_set_uintval */
150 unsigned int arg = 1000;
152 opt_register_arg("-a", opt_set_uintval, NULL, &arg, "All");
153 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
155 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
156 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
158 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
159 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
160 if (ULONG_MAX == UINT_MAX) {
161 pass("Can't test overflow");
162 pass("Can't test error message");
165 sprintf(buf, "%lu", ULONG_MAX);
166 ok1(!parse_args(&argc, &argv, "-a", buf, NULL));
167 ok1(strstr(err_output, ": -a: value '")
168 && strstr(err_output, buf)
169 && strstr(err_output, "' does not fit into an integer"));
172 /* opt_set_longval */
176 opt_register_arg("-a", opt_set_longval, NULL, &arg, "All");
177 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
179 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
181 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
183 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
184 if (sizeof(long) == 4)
185 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
186 else if (sizeof(long)== 8)
187 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
189 fail("FIXME: Handle other long sizes");
191 /* opt_set_ulongval */
193 unsigned long int arg = 1000;
195 opt_register_arg("-a", opt_set_ulongval, NULL, &arg, "All");
196 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
198 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
199 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
201 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
202 if (sizeof(long) == 4)
203 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
204 else if (sizeof(long)== 8)
205 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
207 fail("FIXME: Handle other long sizes");
209 /* opt_set_floatval */
213 opt_register_arg("-a", opt_set_floatval, NULL, &arg, "All");
214 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
216 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
218 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
220 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
222 /* opt_set_doubleval */
226 opt_register_arg("-a", opt_set_doubleval, NULL, &arg, "All");
227 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
229 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
231 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
233 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
237 const long long k = 1024;
238 const long long M = k * k;
239 const long long G = k * k * k;
240 const long long T = k * k * k * k;
241 const long long P = k * k * k * k * k;
242 const long long E = k * k * k * k * k * k;
244 /* opt_set_uintval_bi */
246 unsigned int arg = 1000;
248 opt_register_arg("-a", opt_set_uintval_bi, NULL,
250 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
252 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
253 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
256 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
259 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
261 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
262 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
264 ok1(!parse_args(&argc, &argv, "-a", "-1K", NULL));
267 /* opt_set_intval_bi */
271 opt_register_arg("-a", opt_set_intval_bi, NULL,
273 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
275 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
277 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
280 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
283 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
285 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
286 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
288 ok1(parse_args(&argc, &argv, "-a", "-1K", NULL));
293 /* opt_set_ulongval_bi */
295 unsigned long int arg = 1000;
298 opt_register_arg("-a", opt_set_ulongval_bi, NULL,
300 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
302 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
303 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
306 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
308 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
309 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
311 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
313 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
315 /*note, 2999M > max signed 32 bit long, 1 << 31*/
316 ok1(parse_args(&argc, &argv, "-a", "2999m", NULL));
317 ok1(arg == 2999 * M);
318 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
320 ok1(!parse_args(&argc, &argv, "-a", "-1G", NULL));
321 if (sizeof(long) == 4){
322 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
323 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
324 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
326 else if (sizeof(long) == 8){
327 ok1(!parse_args(&argc, &argv, "-a",
328 "18446744073709551616", NULL));
329 ok1(!parse_args(&argc, &argv, "-a", "8E", NULL));
330 ok1(parse_args(&argc, &argv, "-a", "3E", NULL));
333 fail("FIXME: Handle other long sizes");
336 /* opt_set_longval_bi */
341 opt_register_arg("-a", opt_set_longval_bi, NULL,
343 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
345 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
347 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
349 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
350 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
351 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
353 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
354 ok1(arg == -100 * k);
355 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
357 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
359 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
361 ok1(parse_args(&argc, &argv, "-a", "-1G", NULL));
363 if (sizeof(long) == 4){
364 ok1(!parse_args(&argc, &argv, "-a", "2147483648", NULL));
365 ok1(!parse_args(&argc, &argv, "-a", "2G", NULL));
366 ok1(!parse_args(&argc, &argv, "-a", "2048m", NULL));
367 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
368 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
370 else if (sizeof(long) == 8){
371 ok1(!parse_args(&argc, &argv, "-a",
372 "9223372036854775808", NULL));
373 ok1(parse_args(&argc, &argv, "-a", "3E", NULL));
375 ok1(parse_args(&argc, &argv, "-a", "123T", NULL));
379 fail("FIXME: Handle other long sizes");
383 /* opt_set_longlongval_bi */
385 long long int arg = 1000;
387 opt_register_arg("-a", opt_set_longlongval_bi, NULL,
389 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
391 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
393 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
395 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
396 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
397 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
398 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
400 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
401 ok1(arg == -100 * k);
402 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
404 ok1(parse_args(&argc, &argv, "-a", "-333333M", NULL));
405 ok1(arg == -333333 * M);
406 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
408 ok1(parse_args(&argc, &argv, "-a", "1024t", NULL));
409 ok1(arg == 1024 * T);
410 ok1(parse_args(&argc, &argv, "-a", "123P", NULL));
412 ok1(parse_args(&argc, &argv, "-a", "-3E", NULL));
415 if (sizeof(long long) == 8){
416 ok1(!parse_args(&argc, &argv, "-a",
417 "9223372036854775808", NULL));
418 /*8E and 922337.. are both 1 << 63*/
419 ok1(!parse_args(&argc, &argv, "-a", "8E", NULL));
422 fail("FIXME: Handle other long long int"
423 " sizes (specifically %zu bytes)",
426 /* opt_set_ulonglongval_bi */
428 unsigned long long int arg = 1000;
430 opt_register_arg("-a", opt_set_ulonglongval_bi, NULL,
432 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
434 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
435 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
437 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
438 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
439 ok1(parse_args(&argc, &argv, "-a", "100G", NULL));
441 ok1(!parse_args(&argc, &argv, "-a", "-100G", NULL));
442 ok1(parse_args(&argc, &argv, "-a", "8191P", NULL));
443 ok1(arg == 8191 * P);
446 /* opt_show_intval_bi */
449 char buf[OPT_SHOW_LEN+2] = { 0 };
450 buf[OPT_SHOW_LEN] = '!';
452 opt_show_intval_bi(buf, &i);
453 ok1(strcmp(buf, "-77") == 0);
455 opt_show_intval_bi(buf, &i);
456 ok1(strcmp(buf, "0") == 0);
457 ok1(buf[OPT_SHOW_LEN] == '!');
459 opt_show_intval_bi(buf, &i);
460 ok1(strcmp(buf, "77") == 0);
461 ok1(buf[OPT_SHOW_LEN] == '!');
463 opt_show_intval_bi(buf, &i);
464 ok1(strcmp(buf, "-1234k") == 0);
465 ok1(buf[OPT_SHOW_LEN] == '!');
467 opt_show_intval_bi(buf, &i);
468 ok1(strcmp(buf, "500M") == 0);
469 ok1(buf[OPT_SHOW_LEN] == '!');
471 opt_show_intval_bi(buf, &i);
472 ok1(strcmp(buf, "1G") == 0);
473 ok1(buf[OPT_SHOW_LEN] == '!');
476 /* opt_show_longval_bi */
479 char buf[OPT_SHOW_LEN+2] = { 0 };
480 buf[OPT_SHOW_LEN] = '!';
482 opt_show_longval_bi(buf, &i);
483 ok1(strcmp(buf, "-77") == 0);
484 ok1(buf[OPT_SHOW_LEN] == '!');
486 opt_show_longval_bi(buf, &i);
487 ok1(strcmp(buf, "77") == 0);
488 ok1(buf[OPT_SHOW_LEN] == '!');
490 opt_show_longval_bi(buf, &i);
491 ok1(strcmp(buf, "-1k") == 0);
492 ok1(buf[OPT_SHOW_LEN] == '!');
494 opt_show_longval_bi(buf, &i);
495 ok1(strcmp(buf, "500M") == 0);
496 ok1(buf[OPT_SHOW_LEN] == '!');
498 opt_show_longval_bi(buf, &i);
499 ok1(strcmp(buf, "1G") == 0);
500 ok1(buf[OPT_SHOW_LEN] == '!');
502 opt_show_longval_bi(buf, &i);
503 ok1(strcmp(buf, "0") == 0);
504 ok1(buf[OPT_SHOW_LEN] == '!');
507 /* opt_show_llongval_bi */
510 char buf[OPT_SHOW_LEN+2] = { 0 };
511 buf[OPT_SHOW_LEN] = '!';
513 opt_show_longlongval_bi(buf, &i);
514 ok1(strcmp(buf, "-7777") == 0);
515 ok1(buf[OPT_SHOW_LEN] == '!');
517 opt_show_longlongval_bi(buf, &i);
518 ok1(strcmp(buf, "7777") == 0);
519 ok1(buf[OPT_SHOW_LEN] == '!');
521 opt_show_longlongval_bi(buf, &i);
522 ok1(strcmp(buf, "-10000M") == 0);
523 ok1(buf[OPT_SHOW_LEN] == '!');
525 opt_show_longlongval_bi(buf, &i);
526 ok1(strcmp(buf, "5P") == 0);
527 ok1(buf[OPT_SHOW_LEN] == '!');
529 opt_show_longlongval_bi(buf, &i);
530 ok1(strcmp(buf, "1E") == 0);
531 ok1(buf[OPT_SHOW_LEN] == '!');
534 /* opt_show_uintval_bi */
537 char buf[OPT_SHOW_LEN+2] = { 0 };
538 buf[OPT_SHOW_LEN] = '!';
540 opt_show_uintval_bi(buf, &i);
541 ok1(strcmp(buf, "77") == 0);
542 ok1(buf[OPT_SHOW_LEN] == '!');
544 opt_show_uintval_bi(buf, &i);
545 ok1(strcmp(buf, "1234k") == 0);
546 ok1(buf[OPT_SHOW_LEN] == '!');
548 opt_show_uintval_bi(buf, &i);
549 ok1(strcmp(buf, "500M") == 0);
550 ok1(buf[OPT_SHOW_LEN] == '!');
552 opt_show_uintval_bi(buf, &i);
553 ok1(strcmp(buf, "1G") == 0);
554 ok1(buf[OPT_SHOW_LEN] == '!');
557 /* opt_show_ulongval_bi */
560 char buf[OPT_SHOW_LEN+2] = { 0 };
561 buf[OPT_SHOW_LEN] = '!';
563 opt_show_ulongval_bi(buf, &i);
564 ok1(strcmp(buf, "77") == 0);
565 ok1(buf[OPT_SHOW_LEN] == '!');
567 opt_show_ulongval_bi(buf, &i);
568 ok1(strcmp(buf, "1k") == 0);
569 ok1(buf[OPT_SHOW_LEN] == '!');
571 opt_show_ulongval_bi(buf, &i);
572 ok1(strcmp(buf, "500M") == 0);
573 ok1(buf[OPT_SHOW_LEN] == '!');
575 opt_show_ulongval_bi(buf, &i);
576 ok1(strcmp(buf, "1G") == 0);
577 ok1(buf[OPT_SHOW_LEN] == '!');
579 opt_show_ulongval_bi(buf, &i);
580 ok1(strcmp(buf, "0") == 0);
581 ok1(buf[OPT_SHOW_LEN] == '!');
584 /* opt_show_ullongval_bi */
587 char buf[OPT_SHOW_LEN+2] = { 0 };
588 buf[OPT_SHOW_LEN] = '!';
590 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
591 ok1(strcmp(buf, "7777") == 0);
592 ok1(buf[OPT_SHOW_LEN] == '!');
594 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
595 ok1(strcmp(buf, "10000M") == 0);
596 ok1(buf[OPT_SHOW_LEN] == '!');
598 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
599 ok1(strcmp(buf, "5P") == 0);
600 ok1(buf[OPT_SHOW_LEN] == '!');
602 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
603 ok1(strcmp(buf, "1E") == 0);
604 ok1(buf[OPT_SHOW_LEN] == '!');
609 const long long k = 1000;
610 const long long M = k * k;
611 const long long G = k * k * k;
612 const long long T = k * k * k * k;
613 const long long P = k * k * k * k * k;
614 const long long E = k * k * k * k * k * k;
616 /* opt_set_uintval_si */
618 unsigned int arg = 1000;
620 opt_register_arg("-a", opt_set_uintval_si, NULL,
622 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
624 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
625 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
628 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
631 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
633 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
634 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
636 ok1(!parse_args(&argc, &argv, "-a", "-1K", NULL));
637 if (sizeof(unsigned int) < 8)
638 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
640 pass("can't test int truncation when int is so huge");
643 /* opt_set_intval_si */
647 opt_register_arg("-a", opt_set_intval_si, NULL,
649 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
651 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
653 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
656 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
659 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
661 ok1(!parse_args(&argc, &argv, "-a", "", NULL));
662 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
663 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
665 ok1(parse_args(&argc, &argv, "-a", "-1K", NULL));
668 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
670 pass("can't test int truncation when int is so huge");
674 /* opt_set_ulongval_si */
676 unsigned long int arg = 1000;
679 opt_register_arg("-a", opt_set_ulongval_si, NULL,
681 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
683 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
684 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
686 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
687 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
688 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
690 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
692 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
694 /*note, 2999M > max signed 32 bit long, 1 << 31*/
695 ok1(parse_args(&argc, &argv, "-a", "2999m", NULL));
696 ok1(arg == 2999 * M);
697 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
699 ok1(!parse_args(&argc, &argv, "-a", "-1G", NULL));
700 ok1(parse_args(&argc, &argv, "-a", "4G", NULL));
701 ok1(arg == 4000000000U);
702 if (sizeof(long) == 4){
703 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
704 ok1(!parse_args(&argc, &argv, "-a", "4295M", NULL));
705 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
706 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
708 else if (sizeof(long)== 8){
709 ok1(!parse_args(&argc, &argv, "-a",
710 "18446744073709551616", NULL));
711 ok1(parse_args(&argc, &argv, "-a", "9E", NULL));
712 ok1(arg == 9000000000000000000ULL);
713 ok1(!parse_args(&argc, &argv, "-a", "19E", NULL));
716 fail("FIXME: Handle other long sizes");
719 /* opt_set_longval_si */
724 opt_register_arg("-a", opt_set_longval_si, NULL,
726 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
728 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
730 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
732 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
733 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
734 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
736 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
737 ok1(arg == -100 * k);
738 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
740 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
742 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
744 ok1(parse_args(&argc, &argv, "-a", "-1G", NULL));
746 if (sizeof(long) == 4){
747 ok1(!parse_args(&argc, &argv, "-a", "2147483648", NULL));
748 ok1(!parse_args(&argc, &argv, "-a", "4G", NULL));
749 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
750 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
751 ok1(parse_args(&argc, &argv, "-a", "1999m", NULL));
752 ok1(arg == 1999 * M);
754 else if (sizeof(long)== 8){
755 ok1(!parse_args(&argc, &argv, "-a",
756 "9223372036854775808", NULL));
757 ok1(!parse_args(&argc, &argv, "-a", "9224P", NULL));
758 ok1(parse_args(&argc, &argv, "-a", "9E", NULL));
760 ok1(parse_args(&argc, &argv, "-a", "123T", NULL));
764 fail("FIXME: Handle other long sizes");
768 /* opt_set_longlongval_si */
770 long long int arg = 1000;
772 opt_register_arg("-a", opt_set_longlongval_si, NULL,
774 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
776 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
778 ok1(parse_args(&argc, &argv, "-a", "0T", NULL));
780 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
781 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
782 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
783 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
785 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
786 ok1(arg == -100 * k);
787 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
789 ok1(parse_args(&argc, &argv, "-a", "-333333M", NULL));
790 ok1(arg == -333333 * M);
791 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
793 ok1(parse_args(&argc, &argv, "-a", "1024t", NULL));
794 ok1(arg == 1024 * T);
795 ok1(parse_args(&argc, &argv, "-a", "123P", NULL));
797 ok1(parse_args(&argc, &argv, "-a", "-3E", NULL));
799 ok1(parse_args(&argc, &argv, "-a", "8E", NULL));
800 if (sizeof(long long) == 8){
801 ok1(!parse_args(&argc, &argv, "-a",
802 "9223372036854775808", NULL));
803 ok1(!parse_args(&argc, &argv, "-a",
807 fail("FIXME: Handle other long long int"
808 " sizes (specifically %zu bytes)",
812 /* opt_set_ulonglongval_si */
814 unsigned long long int arg = 1000;
816 opt_register_arg("-a", opt_set_ulonglongval_si, NULL,
818 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
820 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
821 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
823 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
824 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
825 ok1(parse_args(&argc, &argv, "-a", "100G", NULL));
827 ok1(!parse_args(&argc, &argv, "-a", "-100G", NULL));
828 ok1(parse_args(&argc, &argv, "-a", "8E", NULL));
830 /* opt_show_intval_si */
833 char buf[OPT_SHOW_LEN+2] = { 0 };
834 buf[OPT_SHOW_LEN] = '!';
836 opt_show_intval_si(buf, &i);
837 ok1(strcmp(buf, "-77") == 0);
839 opt_show_intval_si(buf, &i);
840 ok1(strcmp(buf, "0") == 0);
841 ok1(buf[OPT_SHOW_LEN] == '!');
843 opt_show_intval_si(buf, &i);
844 ok1(strcmp(buf, "77") == 0);
845 ok1(buf[OPT_SHOW_LEN] == '!');
847 opt_show_intval_si(buf, &i);
848 ok1(strcmp(buf, "-1234k") == 0);
849 ok1(buf[OPT_SHOW_LEN] == '!');
851 opt_show_intval_si(buf, &i);
852 ok1(strcmp(buf, "500M") == 0);
853 ok1(buf[OPT_SHOW_LEN] == '!');
855 opt_show_intval_si(buf, &i);
856 ok1(strcmp(buf, "1G") == 0);
857 ok1(buf[OPT_SHOW_LEN] == '!');
860 /* opt_show_longval_si */
863 char buf[OPT_SHOW_LEN+2] = { 0 };
864 buf[OPT_SHOW_LEN] = '!';
866 opt_show_longval_si(buf, &i);
867 ok1(strcmp(buf, "-77") == 0);
868 ok1(buf[OPT_SHOW_LEN] == '!');
870 opt_show_longval_si(buf, &i);
871 ok1(strcmp(buf, "77") == 0);
872 ok1(buf[OPT_SHOW_LEN] == '!');
874 opt_show_longval_si(buf, &i);
875 ok1(strcmp(buf, "-1k") == 0);
876 ok1(buf[OPT_SHOW_LEN] == '!');
878 opt_show_longval_si(buf, &i);
879 ok1(strcmp(buf, "500M") == 0);
880 ok1(buf[OPT_SHOW_LEN] == '!');
882 opt_show_longval_si(buf, &i);
883 ok1(strcmp(buf, "1G") == 0);
884 ok1(buf[OPT_SHOW_LEN] == '!');
886 opt_show_longval_si(buf, &i);
887 ok1(strcmp(buf, "0") == 0);
888 ok1(buf[OPT_SHOW_LEN] == '!');
891 /* opt_show_llongval_si */
894 char buf[OPT_SHOW_LEN+2] = { 0 };
895 buf[OPT_SHOW_LEN] = '!';
897 opt_show_longlongval_si(buf, &i);
898 ok1(strcmp(buf, "-7777") == 0);
899 ok1(buf[OPT_SHOW_LEN] == '!');
901 opt_show_longlongval_si(buf, &i);
902 ok1(strcmp(buf, "7777") == 0);
903 ok1(buf[OPT_SHOW_LEN] == '!');
905 opt_show_longlongval_si(buf, &i);
906 ok1(strcmp(buf, "-10240M") == 0);
907 ok1(buf[OPT_SHOW_LEN] == '!');
909 opt_show_longlongval_si(buf, &i);
910 ok1(strcmp(buf, "5P") == 0);
911 ok1(buf[OPT_SHOW_LEN] == '!');
913 opt_show_longlongval_si(buf, &i);
914 ok1(strcmp(buf, "2E") == 0);
915 ok1(buf[OPT_SHOW_LEN] == '!');
918 /* opt_show_uintval_si */
921 char buf[OPT_SHOW_LEN+2] = { 0 };
922 buf[OPT_SHOW_LEN] = '!';
924 opt_show_uintval_si(buf, &i);
925 ok1(strcmp(buf, "77") == 0);
926 ok1(buf[OPT_SHOW_LEN] == '!');
928 opt_show_uintval_si(buf, &i);
929 ok1(strcmp(buf, "1234k") == 0);
930 ok1(buf[OPT_SHOW_LEN] == '!');
932 opt_show_uintval_si(buf, &i);
933 ok1(strcmp(buf, "500M") == 0);
934 ok1(buf[OPT_SHOW_LEN] == '!');
936 opt_show_uintval_si(buf, &i);
937 ok1(strcmp(buf, "1G") == 0);
938 ok1(buf[OPT_SHOW_LEN] == '!');
941 /* opt_show_ulongval_si */
944 char buf[OPT_SHOW_LEN+2] = { 0 };
945 buf[OPT_SHOW_LEN] = '!';
947 opt_show_ulongval_si(buf, &i);
948 ok1(strcmp(buf, "77") == 0);
949 ok1(buf[OPT_SHOW_LEN] == '!');
951 opt_show_ulongval_si(buf, &i);
952 ok1(strcmp(buf, "1k") == 0);
953 ok1(buf[OPT_SHOW_LEN] == '!');
955 opt_show_ulongval_si(buf, &i);
956 ok1(strcmp(buf, "500M") == 0);
957 ok1(buf[OPT_SHOW_LEN] == '!');
959 opt_show_ulongval_si(buf, &i);
960 ok1(strcmp(buf, "1024M") == 0);
961 ok1(buf[OPT_SHOW_LEN] == '!');
963 opt_show_ulongval_si(buf, &i);
964 ok1(strcmp(buf, "0") == 0);
965 ok1(buf[OPT_SHOW_LEN] == '!');
968 /* opt_show_ullongval_si */
971 char buf[OPT_SHOW_LEN+2] = { 0 };
972 buf[OPT_SHOW_LEN] = '!';
974 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
975 ok1(strcmp(buf, "7777") == 0);
976 ok1(buf[OPT_SHOW_LEN] == '!');
978 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
979 ok1(strcmp(buf, "10240M") == 0);
980 ok1(buf[OPT_SHOW_LEN] == '!');
982 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
983 ok1(strcmp(buf, "5P") == 0);
984 ok1(buf[OPT_SHOW_LEN] == '!');
986 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
987 ok1(strcmp(buf, "1E") == 0);
988 ok1(buf[OPT_SHOW_LEN] == '!');
998 opt_register_noarg("-a", opt_inc_intval, &arg, "");
999 ok1(parse_args(&argc, &argv, "-a", NULL));
1001 ok1(parse_args(&argc, &argv, "-a", "-a", NULL));
1003 ok1(parse_args(&argc, &argv, "-aa", NULL));
1007 /* opt_show_version_and_exit. */
1011 opt_register_noarg("-a",
1012 opt_version_and_exit, "1.2.3", "");
1013 /* parse_args allocates argv */
1016 set_args(&argc, &argv, "thisprog", "-a", NULL);
1018 exitval = setjmp(exited);
1020 opt_parse(&argc, argv, save_err_output);
1021 fail("opt_show_version_and_exit returned?");
1023 ok1(exitval - 1 == 0);
1024 /* We should have freed table!. */
1025 ok1(opt_table == NULL);
1027 ok1(strcmp(output, "1.2.3\n") == 0);
1033 /* opt_usage_and_exit. */
1037 opt_register_noarg("-a",
1038 opt_usage_and_exit, "[args]", "");
1040 set_args(&argc, &argv, "thisprog", "-a", NULL);
1042 exitval = setjmp(exited);
1044 opt_parse(&argc, argv, save_err_output);
1045 fail("opt_usage_and_exit returned?");
1047 ok1(exitval - 1 == 0);
1048 /* We should have freed table!. */
1049 ok1(opt_table == NULL);
1051 ok1(strstr(output, "[args]"));
1052 ok1(strstr(output, argv[0]));
1053 ok1(strstr(output, "\n-a"));
1062 char buf[OPT_SHOW_LEN+2] = { 0 };
1063 buf[OPT_SHOW_LEN] = '!';
1066 opt_show_bool(buf, &b);
1067 ok1(strcmp(buf, "true") == 0);
1068 ok1(buf[OPT_SHOW_LEN] == '!');
1071 opt_show_bool(buf, &b);
1072 ok1(strcmp(buf, "false") == 0);
1073 ok1(buf[OPT_SHOW_LEN] == '!');
1076 /* opt_show_invbool */
1079 char buf[OPT_SHOW_LEN+2] = { 0 };
1080 buf[OPT_SHOW_LEN] = '!';
1083 opt_show_invbool(buf, &b);
1084 ok1(strcmp(buf, "false") == 0);
1085 ok1(buf[OPT_SHOW_LEN] == '!');
1088 opt_show_invbool(buf, &b);
1089 ok1(strcmp(buf, "true") == 0);
1090 ok1(buf[OPT_SHOW_LEN] == '!');
1093 /* opt_show_charp */
1095 char str[OPT_SHOW_LEN*2], *p;
1096 char buf[OPT_SHOW_LEN+2] = { 0 };
1097 buf[OPT_SHOW_LEN] = '!';
1102 opt_show_charp(buf, &p);
1103 ok1(strcmp(buf, "\"short\"") == 0);
1104 ok1(buf[OPT_SHOW_LEN] == '!');
1106 /* Truncate test. */
1107 memset(p, 'x', OPT_SHOW_LEN*2);
1108 p[OPT_SHOW_LEN*2-1] = '\0';
1109 opt_show_charp(buf, &p);
1111 ok1(buf[OPT_SHOW_LEN-1] == '"');
1112 ok1(buf[OPT_SHOW_LEN] == '!');
1113 ok1(strspn(buf+1, "x") == OPT_SHOW_LEN-2);
1116 /* opt_show_intval */
1119 char buf[OPT_SHOW_LEN+2] = { 0 };
1120 buf[OPT_SHOW_LEN] = '!';
1123 opt_show_intval(buf, &i);
1124 ok1(strcmp(buf, "-77") == 0);
1125 ok1(buf[OPT_SHOW_LEN] == '!');
1128 opt_show_intval(buf, &i);
1129 ok1(strcmp(buf, "77") == 0);
1130 ok1(buf[OPT_SHOW_LEN] == '!');
1133 /* opt_show_uintval */
1136 char buf[OPT_SHOW_LEN+2] = { 0 };
1137 buf[OPT_SHOW_LEN] = '!';
1140 opt_show_uintval(buf, &ui);
1141 ok1(strcmp(buf, "4294967295") == 0);
1142 ok1(buf[OPT_SHOW_LEN] == '!');
1145 /* opt_show_longval */
1148 char buf[OPT_SHOW_LEN+2] = { 0 };
1149 buf[OPT_SHOW_LEN] = '!';
1152 opt_show_longval(buf, &l);
1153 ok1(strcmp(buf, "1234567890") == 0);
1154 ok1(buf[OPT_SHOW_LEN] == '!');
1157 /* opt_show_ulongval */
1160 char buf[OPT_SHOW_LEN+2] = { 0 };
1161 buf[OPT_SHOW_LEN] = '!';
1164 opt_show_ulongval(buf, &ul);
1165 ok1(strcmp(buf, "4294967295") == 0);
1166 ok1(buf[OPT_SHOW_LEN] == '!');
1169 /* opt_show_floatval */
1172 char buf[OPT_SHOW_LEN+2] = { 0 };
1173 buf[OPT_SHOW_LEN] = '!';
1176 opt_show_floatval(buf, &f);
1177 ok1(strcmp(buf, "-77.500000") == 0);
1178 ok1(buf[OPT_SHOW_LEN] == '!');
1181 opt_show_floatval(buf, &f);
1182 ok1(strcmp(buf, "77.500000") == 0);
1183 ok1(buf[OPT_SHOW_LEN] == '!');
1186 /* opt_show_doubleval */
1189 char buf[OPT_SHOW_LEN+2] = { 0 };
1190 buf[OPT_SHOW_LEN] = '!';
1193 opt_show_doubleval(buf, &d);
1194 ok1(strcmp(buf, "-77.000000") == 0);
1195 ok1(buf[OPT_SHOW_LEN] == '!');
1198 opt_show_doubleval(buf, &d);
1199 ok1(strcmp(buf, "77.000000") == 0);
1200 ok1(buf[OPT_SHOW_LEN] == '!');
1203 /* opt_log_stderr. */
1206 opt_register_noarg("-a",
1207 opt_usage_and_exit, "[args]", "");
1209 set_args(&argc, &argv, "thisprog", "--garbage", NULL);
1210 ok1(!opt_parse(&argc, argv, opt_log_stderr));
1212 "thisprog: --garbage: unrecognized option\n"));
1218 /* opt_log_stderr_exit. */
1222 opt_register_noarg("-a",
1223 opt_usage_and_exit, "[args]", "");
1224 set_args(&argc, &argv, "thisprog", "--garbage", NULL);
1225 exitval = setjmp(exited);
1227 opt_parse(&argc, argv, opt_log_stderr_exit);
1228 fail("opt_log_stderr_exit returned?");
1230 ok1(exitval - 1 == 1);
1234 "thisprog: --garbage: unrecognized option\n"));
1239 //diag("%s\n", err_output);
1240 return exit_status();