3 #include <ccan/tap/tap.h>
10 /* We don't actually want it to exit... */
11 static jmp_buf exited;
12 #define exit(status) longjmp(exited, (status) + 1)
14 #define printf saved_printf
15 static int saved_printf(const char *fmt, ...);
17 #define fprintf saved_fprintf
18 static int saved_fprintf(FILE *ignored, const char *fmt, ...);
20 #define vfprintf(f, fmt, ap) saved_vprintf(fmt, ap)
21 static int saved_vprintf(const char *fmt, va_list ap);
23 #include <ccan/opt/helpers.c>
24 #include <ccan/opt/opt.c>
25 #include <ccan/opt/usage.c>
26 #include <ccan/opt/parse.c>
28 static char *output = NULL;
30 static int saved_vprintf(const char *fmt, va_list ap)
33 int ret = vasprintf(&p, fmt, ap);
36 output = realloc(output, strlen(output) + strlen(p) + 1);
44 static int saved_printf(const char *fmt, ...)
50 ret = saved_vprintf(fmt, ap);
55 static int saved_fprintf(FILE *ignored UNNEEDED, const char *fmt, ...)
61 ret = saved_vprintf(fmt, ap);
66 static void set_args(int *argc, char ***argv, ...)
69 *argv = malloc(sizeof(**argv) * 20);
73 ((*argv)[*argc] = va_arg(ap, char*)) != NULL;
79 int main(int argc, char *argv[])
87 opt_register_noarg("-a", opt_set_bool, &arg, "");
88 ok1(parse_args(&argc, &argv, "-a", NULL));
90 opt_register_arg("-b", opt_set_bool_arg, NULL, &arg, "");
91 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
93 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
95 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
97 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
99 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
101 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
103 /* opt_set_invbool */
107 opt_register_noarg("-a", opt_set_invbool, &arg, "");
108 ok1(parse_args(&argc, &argv, "-a", NULL));
110 opt_register_arg("-b", opt_set_invbool_arg, NULL,
112 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
114 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
116 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
118 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
120 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
122 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
126 char *arg = cast_const(char *, "wrong");
128 opt_register_arg("-a", opt_set_charp, NULL, &arg, "All");
129 ok1(parse_args(&argc, &argv, "-a", "string", NULL));
130 ok1(strcmp(arg, "string") == 0);
136 opt_register_arg("-a", opt_set_intval, NULL, &arg, "All");
137 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
139 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
141 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
143 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
144 if (sizeof(int) == 4)
145 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
147 fail("Handle other int sizes");
149 /* opt_set_uintval */
151 unsigned int arg = 1000;
153 opt_register_arg("-a", opt_set_uintval, NULL, &arg, "All");
154 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
156 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
157 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
159 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
160 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
161 if (ULONG_MAX == UINT_MAX) {
162 pass("Can't test overflow");
163 pass("Can't test error message");
166 sprintf(buf, "%lu", ULONG_MAX);
167 ok1(!parse_args(&argc, &argv, "-a", buf, NULL));
168 ok1(strstr(err_output, ": -a: value '")
169 && strstr(err_output, buf)
170 && strstr(err_output, "' does not fit into an integer"));
173 /* opt_set_longval */
177 opt_register_arg("-a", opt_set_longval, NULL, &arg, "All");
178 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
180 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
182 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
184 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
185 if (sizeof(long) == 4)
186 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
187 else if (sizeof(long)== 8)
188 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
190 fail("FIXME: Handle other long sizes");
192 /* opt_set_ulongval */
194 unsigned long int arg = 1000;
196 opt_register_arg("-a", opt_set_ulongval, NULL, &arg, "All");
197 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
199 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
200 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
202 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
203 if (sizeof(long) == 4)
204 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
205 else if (sizeof(long)== 8)
206 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
208 fail("FIXME: Handle other long sizes");
210 /* opt_set_floatval */
214 opt_register_arg("-a", opt_set_floatval, NULL, &arg, "All");
215 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
217 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
219 ok1(parse_args(&argc, &argv, "-a", "1e33", NULL));
221 /*overflows should fail */
222 ok1(!parse_args(&argc, &argv, "-a", "1e39", NULL));
223 ok1(!parse_args(&argc, &argv, "-a", "-1e40", NULL));
224 /*low numbers lose precision but work */
225 ok1(parse_args(&argc, &argv, "-a", "1e-39", NULL));
227 ok1(parse_args(&argc, &argv, "-a", "-1e-45", NULL));
229 ok1(!parse_args(&argc, &argv, "-a", "1e-99", NULL));
230 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
232 ok1(parse_args(&argc, &argv, "-a", "1.111111111111", NULL));
233 ok1(arg == 1.1111112f);
234 ok1(parse_args(&argc, &argv, "-a", "INF", NULL));
236 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
237 ok1(!parse_args(&argc, &argv, "-a", "1e7crap", NULL));
239 /* opt_set_doubleval */
243 opt_register_arg("-a", opt_set_doubleval, NULL, &arg, "All");
244 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
246 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
248 ok1(parse_args(&argc, &argv, "-a", "1e-299", NULL));
250 ok1(parse_args(&argc, &argv, "-a", "-1e-305", NULL));
252 ok1(!parse_args(&argc, &argv, "-a", "1e-499", NULL));
253 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
255 ok1(parse_args(&argc, &argv, "-a", "1.1111111111111111111", NULL));
256 ok1(arg == 1.1111111111111112);
257 ok1(parse_args(&argc, &argv, "-a", "INF", NULL));
259 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
260 ok1(!parse_args(&argc, &argv, "-a", "1e7crap", NULL));
264 const long long k = 1024;
265 const long long M = k * k;
266 const long long G = k * k * k;
267 const long long T = k * k * k * k;
268 const long long P = k * k * k * k * k;
269 const long long E = k * k * k * k * k * k;
271 /* opt_set_uintval_bi */
273 unsigned int arg = 1000;
275 opt_register_arg("-a", opt_set_uintval_bi, NULL,
277 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
279 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
280 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
283 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
286 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
288 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
289 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
291 ok1(!parse_args(&argc, &argv, "-a", "-1K", NULL));
294 /* opt_set_intval_bi */
298 opt_register_arg("-a", opt_set_intval_bi, NULL,
300 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
302 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
304 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
307 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
310 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
312 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
313 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
315 ok1(parse_args(&argc, &argv, "-a", "-1K", NULL));
320 /* opt_set_ulongval_bi */
322 unsigned long int arg = 1000;
325 opt_register_arg("-a", opt_set_ulongval_bi, NULL,
327 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
329 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
330 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
333 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
335 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
336 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
338 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
340 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
342 /*note, 2999M > max signed 32 bit long, 1 << 31*/
343 ok1(parse_args(&argc, &argv, "-a", "2999m", NULL));
344 ok1(arg == 2999 * M);
345 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
347 ok1(!parse_args(&argc, &argv, "-a", "-1G", NULL));
348 if (sizeof(long) == 4){
349 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
350 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
351 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
353 else if (sizeof(long) == 8){
354 ok1(!parse_args(&argc, &argv, "-a",
355 "18446744073709551616", NULL));
356 ok1(!parse_args(&argc, &argv, "-a", "8E", NULL));
357 ok1(parse_args(&argc, &argv, "-a", "3E", NULL));
360 fail("FIXME: Handle other long sizes");
363 /* opt_set_longval_bi */
368 opt_register_arg("-a", opt_set_longval_bi, NULL,
370 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
372 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
374 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
376 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
377 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
378 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
380 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
381 ok1(arg == -100 * k);
382 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
384 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
386 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
388 ok1(parse_args(&argc, &argv, "-a", "-1G", NULL));
390 if (sizeof(long) == 4){
391 ok1(!parse_args(&argc, &argv, "-a", "2147483648", NULL));
392 ok1(!parse_args(&argc, &argv, "-a", "2G", NULL));
393 ok1(!parse_args(&argc, &argv, "-a", "2048m", NULL));
394 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
395 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
397 else if (sizeof(long) == 8){
398 ok1(!parse_args(&argc, &argv, "-a",
399 "9223372036854775808", NULL));
400 ok1(parse_args(&argc, &argv, "-a", "3E", NULL));
402 ok1(parse_args(&argc, &argv, "-a", "123T", NULL));
406 fail("FIXME: Handle other long sizes");
410 /* opt_set_longlongval_bi */
412 long long int arg = 1000;
414 opt_register_arg("-a", opt_set_longlongval_bi, NULL,
416 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
418 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
420 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
422 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
423 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
424 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
425 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
427 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
428 ok1(arg == -100 * k);
429 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
431 ok1(parse_args(&argc, &argv, "-a", "-333333M", NULL));
432 ok1(arg == -333333 * M);
433 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
435 ok1(parse_args(&argc, &argv, "-a", "1024t", NULL));
436 ok1(arg == 1024 * T);
437 ok1(parse_args(&argc, &argv, "-a", "123P", NULL));
439 ok1(parse_args(&argc, &argv, "-a", "-3E", NULL));
442 if (sizeof(long long) == 8){
443 ok1(!parse_args(&argc, &argv, "-a",
444 "9223372036854775808", NULL));
445 /*8E and 922337.. are both 1 << 63*/
446 ok1(!parse_args(&argc, &argv, "-a", "8E", NULL));
449 fail("FIXME: Handle other long long int"
450 " sizes (specifically %zu bytes)",
453 /* opt_set_ulonglongval_bi */
455 unsigned long long int arg = 1000;
457 opt_register_arg("-a", opt_set_ulonglongval_bi, NULL,
459 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
461 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
462 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
464 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
465 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
466 ok1(parse_args(&argc, &argv, "-a", "100G", NULL));
468 ok1(!parse_args(&argc, &argv, "-a", "-100G", NULL));
469 ok1(parse_args(&argc, &argv, "-a", "8191P", NULL));
470 ok1(arg == 8191 * P);
473 /* opt_show_intval_bi */
476 char buf[OPT_SHOW_LEN+2] = { 0 };
477 buf[OPT_SHOW_LEN] = '!';
479 opt_show_intval_bi(buf, &i);
480 ok1(strcmp(buf, "-77") == 0);
482 opt_show_intval_bi(buf, &i);
483 ok1(strcmp(buf, "0") == 0);
484 ok1(buf[OPT_SHOW_LEN] == '!');
486 opt_show_intval_bi(buf, &i);
487 ok1(strcmp(buf, "77") == 0);
488 ok1(buf[OPT_SHOW_LEN] == '!');
490 opt_show_intval_bi(buf, &i);
491 ok1(strcmp(buf, "-1234k") == 0);
492 ok1(buf[OPT_SHOW_LEN] == '!');
494 opt_show_intval_bi(buf, &i);
495 ok1(strcmp(buf, "500M") == 0);
496 ok1(buf[OPT_SHOW_LEN] == '!');
498 opt_show_intval_bi(buf, &i);
499 ok1(strcmp(buf, "1G") == 0);
500 ok1(buf[OPT_SHOW_LEN] == '!');
503 /* opt_show_longval_bi */
506 char buf[OPT_SHOW_LEN+2] = { 0 };
507 buf[OPT_SHOW_LEN] = '!';
509 opt_show_longval_bi(buf, &i);
510 ok1(strcmp(buf, "-77") == 0);
511 ok1(buf[OPT_SHOW_LEN] == '!');
513 opt_show_longval_bi(buf, &i);
514 ok1(strcmp(buf, "77") == 0);
515 ok1(buf[OPT_SHOW_LEN] == '!');
517 opt_show_longval_bi(buf, &i);
518 ok1(strcmp(buf, "-1k") == 0);
519 ok1(buf[OPT_SHOW_LEN] == '!');
521 opt_show_longval_bi(buf, &i);
522 ok1(strcmp(buf, "500M") == 0);
523 ok1(buf[OPT_SHOW_LEN] == '!');
525 opt_show_longval_bi(buf, &i);
526 ok1(strcmp(buf, "1G") == 0);
527 ok1(buf[OPT_SHOW_LEN] == '!');
529 opt_show_longval_bi(buf, &i);
530 ok1(strcmp(buf, "0") == 0);
531 ok1(buf[OPT_SHOW_LEN] == '!');
534 /* opt_show_llongval_bi */
537 char buf[OPT_SHOW_LEN+2] = { 0 };
538 buf[OPT_SHOW_LEN] = '!';
540 opt_show_longlongval_bi(buf, &i);
541 ok1(strcmp(buf, "-7777") == 0);
542 ok1(buf[OPT_SHOW_LEN] == '!');
544 opt_show_longlongval_bi(buf, &i);
545 ok1(strcmp(buf, "7777") == 0);
546 ok1(buf[OPT_SHOW_LEN] == '!');
548 opt_show_longlongval_bi(buf, &i);
549 ok1(strcmp(buf, "-10000M") == 0);
550 ok1(buf[OPT_SHOW_LEN] == '!');
552 opt_show_longlongval_bi(buf, &i);
553 ok1(strcmp(buf, "5P") == 0);
554 ok1(buf[OPT_SHOW_LEN] == '!');
556 opt_show_longlongval_bi(buf, &i);
557 ok1(strcmp(buf, "1E") == 0);
558 ok1(buf[OPT_SHOW_LEN] == '!');
561 /* opt_show_uintval_bi */
564 char buf[OPT_SHOW_LEN+2] = { 0 };
565 buf[OPT_SHOW_LEN] = '!';
567 opt_show_uintval_bi(buf, &i);
568 ok1(strcmp(buf, "77") == 0);
569 ok1(buf[OPT_SHOW_LEN] == '!');
571 opt_show_uintval_bi(buf, &i);
572 ok1(strcmp(buf, "1234k") == 0);
573 ok1(buf[OPT_SHOW_LEN] == '!');
575 opt_show_uintval_bi(buf, &i);
576 ok1(strcmp(buf, "500M") == 0);
577 ok1(buf[OPT_SHOW_LEN] == '!');
579 opt_show_uintval_bi(buf, &i);
580 ok1(strcmp(buf, "1G") == 0);
581 ok1(buf[OPT_SHOW_LEN] == '!');
584 /* opt_show_ulongval_bi */
587 char buf[OPT_SHOW_LEN+2] = { 0 };
588 buf[OPT_SHOW_LEN] = '!';
590 opt_show_ulongval_bi(buf, &i);
591 ok1(strcmp(buf, "77") == 0);
592 ok1(buf[OPT_SHOW_LEN] == '!');
594 opt_show_ulongval_bi(buf, &i);
595 ok1(strcmp(buf, "1k") == 0);
596 ok1(buf[OPT_SHOW_LEN] == '!');
598 opt_show_ulongval_bi(buf, &i);
599 ok1(strcmp(buf, "500M") == 0);
600 ok1(buf[OPT_SHOW_LEN] == '!');
602 opt_show_ulongval_bi(buf, &i);
603 ok1(strcmp(buf, "1G") == 0);
604 ok1(buf[OPT_SHOW_LEN] == '!');
606 opt_show_ulongval_bi(buf, &i);
607 ok1(strcmp(buf, "0") == 0);
608 ok1(buf[OPT_SHOW_LEN] == '!');
611 /* opt_show_ullongval_bi */
614 char buf[OPT_SHOW_LEN+2] = { 0 };
615 buf[OPT_SHOW_LEN] = '!';
617 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
618 ok1(strcmp(buf, "7777") == 0);
619 ok1(buf[OPT_SHOW_LEN] == '!');
621 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
622 ok1(strcmp(buf, "10000M") == 0);
623 ok1(buf[OPT_SHOW_LEN] == '!');
625 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
626 ok1(strcmp(buf, "5P") == 0);
627 ok1(buf[OPT_SHOW_LEN] == '!');
629 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
630 ok1(strcmp(buf, "1E") == 0);
631 ok1(buf[OPT_SHOW_LEN] == '!');
636 const long long k = 1000;
637 const long long M = k * k;
638 const long long G = k * k * k;
639 const long long T = k * k * k * k;
640 const long long P = k * k * k * k * k;
641 const long long E = k * k * k * k * k * k;
643 /* opt_set_uintval_si */
645 unsigned int arg = 1000;
647 opt_register_arg("-a", opt_set_uintval_si, NULL,
649 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
651 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
652 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
655 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
658 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
660 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
661 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
663 ok1(!parse_args(&argc, &argv, "-a", "-1K", NULL));
664 if (sizeof(unsigned int) < 8)
665 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
667 pass("can't test int truncation when int is so huge");
670 /* opt_set_intval_si */
674 opt_register_arg("-a", opt_set_intval_si, NULL,
676 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
678 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
680 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
683 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
686 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
688 ok1(!parse_args(&argc, &argv, "-a", "", NULL));
689 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
690 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
692 ok1(parse_args(&argc, &argv, "-a", "-1K", NULL));
695 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
697 pass("can't test int truncation when int is so huge");
701 /* opt_set_ulongval_si */
703 unsigned long int arg = 1000;
706 opt_register_arg("-a", opt_set_ulongval_si, NULL,
708 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
710 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
711 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
713 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
714 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
715 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
717 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
719 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
721 /*note, 2999M > max signed 32 bit long, 1 << 31*/
722 ok1(parse_args(&argc, &argv, "-a", "2999m", NULL));
723 ok1(arg == 2999 * M);
724 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
726 ok1(!parse_args(&argc, &argv, "-a", "-1G", NULL));
727 ok1(parse_args(&argc, &argv, "-a", "4G", NULL));
728 ok1(arg == 4000000000U);
729 if (sizeof(long) == 4){
730 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
731 ok1(!parse_args(&argc, &argv, "-a", "4295M", NULL));
732 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
733 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
735 else if (sizeof(long)== 8){
736 ok1(!parse_args(&argc, &argv, "-a",
737 "18446744073709551616", NULL));
738 ok1(parse_args(&argc, &argv, "-a", "9E", NULL));
739 ok1(arg == 9000000000000000000ULL);
740 ok1(!parse_args(&argc, &argv, "-a", "19E", NULL));
743 fail("FIXME: Handle other long sizes");
746 /* opt_set_longval_si */
751 opt_register_arg("-a", opt_set_longval_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", "0P", 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", "100k", NULL));
763 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
764 ok1(arg == -100 * k);
765 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
767 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
769 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
771 ok1(parse_args(&argc, &argv, "-a", "-1G", NULL));
773 if (sizeof(long) == 4){
774 ok1(!parse_args(&argc, &argv, "-a", "2147483648", NULL));
775 ok1(!parse_args(&argc, &argv, "-a", "4G", NULL));
776 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
777 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
778 ok1(parse_args(&argc, &argv, "-a", "1999m", NULL));
779 ok1(arg == 1999 * M);
781 else if (sizeof(long)== 8){
782 ok1(!parse_args(&argc, &argv, "-a",
783 "9223372036854775808", NULL));
784 ok1(!parse_args(&argc, &argv, "-a", "9224P", NULL));
785 ok1(parse_args(&argc, &argv, "-a", "9E", NULL));
787 ok1(parse_args(&argc, &argv, "-a", "123T", NULL));
791 fail("FIXME: Handle other long sizes");
795 /* opt_set_longlongval_si */
797 long long int arg = 1000;
799 opt_register_arg("-a", opt_set_longlongval_si, NULL,
801 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
803 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
805 ok1(parse_args(&argc, &argv, "-a", "0T", NULL));
807 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
808 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
809 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
810 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
812 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
813 ok1(arg == -100 * k);
814 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
816 ok1(parse_args(&argc, &argv, "-a", "-333333M", NULL));
817 ok1(arg == -333333 * M);
818 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
820 ok1(parse_args(&argc, &argv, "-a", "1024t", NULL));
821 ok1(arg == 1024 * T);
822 ok1(parse_args(&argc, &argv, "-a", "123P", NULL));
824 ok1(parse_args(&argc, &argv, "-a", "-3E", NULL));
826 ok1(parse_args(&argc, &argv, "-a", "8E", NULL));
827 if (sizeof(long long) == 8){
828 ok1(!parse_args(&argc, &argv, "-a",
829 "9223372036854775808", NULL));
830 ok1(!parse_args(&argc, &argv, "-a",
834 fail("FIXME: Handle other long long int"
835 " sizes (specifically %zu bytes)",
839 /* opt_set_ulonglongval_si */
841 unsigned long long int arg = 1000;
843 opt_register_arg("-a", opt_set_ulonglongval_si, NULL,
845 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
847 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
848 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
850 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
851 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
852 ok1(parse_args(&argc, &argv, "-a", "100G", NULL));
854 ok1(!parse_args(&argc, &argv, "-a", "-100G", NULL));
855 ok1(parse_args(&argc, &argv, "-a", "8E", NULL));
857 /* opt_show_intval_si */
860 char buf[OPT_SHOW_LEN+2] = { 0 };
861 buf[OPT_SHOW_LEN] = '!';
863 opt_show_intval_si(buf, &i);
864 ok1(strcmp(buf, "-77") == 0);
866 opt_show_intval_si(buf, &i);
867 ok1(strcmp(buf, "0") == 0);
868 ok1(buf[OPT_SHOW_LEN] == '!');
870 opt_show_intval_si(buf, &i);
871 ok1(strcmp(buf, "77") == 0);
872 ok1(buf[OPT_SHOW_LEN] == '!');
874 opt_show_intval_si(buf, &i);
875 ok1(strcmp(buf, "-1234k") == 0);
876 ok1(buf[OPT_SHOW_LEN] == '!');
878 opt_show_intval_si(buf, &i);
879 ok1(strcmp(buf, "500M") == 0);
880 ok1(buf[OPT_SHOW_LEN] == '!');
882 opt_show_intval_si(buf, &i);
883 ok1(strcmp(buf, "1G") == 0);
884 ok1(buf[OPT_SHOW_LEN] == '!');
887 /* opt_show_longval_si */
890 char buf[OPT_SHOW_LEN+2] = { 0 };
891 buf[OPT_SHOW_LEN] = '!';
893 opt_show_longval_si(buf, &i);
894 ok1(strcmp(buf, "-77") == 0);
895 ok1(buf[OPT_SHOW_LEN] == '!');
897 opt_show_longval_si(buf, &i);
898 ok1(strcmp(buf, "77") == 0);
899 ok1(buf[OPT_SHOW_LEN] == '!');
901 opt_show_longval_si(buf, &i);
902 ok1(strcmp(buf, "-1k") == 0);
903 ok1(buf[OPT_SHOW_LEN] == '!');
905 opt_show_longval_si(buf, &i);
906 ok1(strcmp(buf, "500M") == 0);
907 ok1(buf[OPT_SHOW_LEN] == '!');
909 opt_show_longval_si(buf, &i);
910 ok1(strcmp(buf, "1G") == 0);
911 ok1(buf[OPT_SHOW_LEN] == '!');
913 opt_show_longval_si(buf, &i);
914 ok1(strcmp(buf, "0") == 0);
915 ok1(buf[OPT_SHOW_LEN] == '!');
918 /* opt_show_llongval_si */
921 char buf[OPT_SHOW_LEN+2] = { 0 };
922 buf[OPT_SHOW_LEN] = '!';
924 opt_show_longlongval_si(buf, &i);
925 ok1(strcmp(buf, "-7777") == 0);
926 ok1(buf[OPT_SHOW_LEN] == '!');
928 opt_show_longlongval_si(buf, &i);
929 ok1(strcmp(buf, "7777") == 0);
930 ok1(buf[OPT_SHOW_LEN] == '!');
932 opt_show_longlongval_si(buf, &i);
933 ok1(strcmp(buf, "-10240M") == 0);
934 ok1(buf[OPT_SHOW_LEN] == '!');
936 opt_show_longlongval_si(buf, &i);
937 ok1(strcmp(buf, "5P") == 0);
938 ok1(buf[OPT_SHOW_LEN] == '!');
940 opt_show_longlongval_si(buf, &i);
941 ok1(strcmp(buf, "2E") == 0);
942 ok1(buf[OPT_SHOW_LEN] == '!');
945 /* opt_show_uintval_si */
948 char buf[OPT_SHOW_LEN+2] = { 0 };
949 buf[OPT_SHOW_LEN] = '!';
951 opt_show_uintval_si(buf, &i);
952 ok1(strcmp(buf, "77") == 0);
953 ok1(buf[OPT_SHOW_LEN] == '!');
955 opt_show_uintval_si(buf, &i);
956 ok1(strcmp(buf, "1234k") == 0);
957 ok1(buf[OPT_SHOW_LEN] == '!');
959 opt_show_uintval_si(buf, &i);
960 ok1(strcmp(buf, "500M") == 0);
961 ok1(buf[OPT_SHOW_LEN] == '!');
963 opt_show_uintval_si(buf, &i);
964 ok1(strcmp(buf, "1G") == 0);
965 ok1(buf[OPT_SHOW_LEN] == '!');
968 /* opt_show_ulongval_si */
971 char buf[OPT_SHOW_LEN+2] = { 0 };
972 buf[OPT_SHOW_LEN] = '!';
974 opt_show_ulongval_si(buf, &i);
975 ok1(strcmp(buf, "77") == 0);
976 ok1(buf[OPT_SHOW_LEN] == '!');
978 opt_show_ulongval_si(buf, &i);
979 ok1(strcmp(buf, "1k") == 0);
980 ok1(buf[OPT_SHOW_LEN] == '!');
982 opt_show_ulongval_si(buf, &i);
983 ok1(strcmp(buf, "500M") == 0);
984 ok1(buf[OPT_SHOW_LEN] == '!');
986 opt_show_ulongval_si(buf, &i);
987 ok1(strcmp(buf, "1024M") == 0);
988 ok1(buf[OPT_SHOW_LEN] == '!');
990 opt_show_ulongval_si(buf, &i);
991 ok1(strcmp(buf, "0") == 0);
992 ok1(buf[OPT_SHOW_LEN] == '!');
995 /* opt_show_ullongval_si */
998 char buf[OPT_SHOW_LEN+2] = { 0 };
999 buf[OPT_SHOW_LEN] = '!';
1001 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
1002 ok1(strcmp(buf, "7777") == 0);
1003 ok1(buf[OPT_SHOW_LEN] == '!');
1005 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
1006 ok1(strcmp(buf, "10240M") == 0);
1007 ok1(buf[OPT_SHOW_LEN] == '!');
1009 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
1010 ok1(strcmp(buf, "5P") == 0);
1011 ok1(buf[OPT_SHOW_LEN] == '!');
1013 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
1014 ok1(strcmp(buf, "1E") == 0);
1015 ok1(buf[OPT_SHOW_LEN] == '!');
1021 /* opt_inc_intval */
1025 opt_register_noarg("-a", opt_inc_intval, &arg, "");
1026 ok1(parse_args(&argc, &argv, "-a", NULL));
1028 ok1(parse_args(&argc, &argv, "-a", "-a", NULL));
1030 ok1(parse_args(&argc, &argv, "-aa", NULL));
1034 /* opt_show_version_and_exit. */
1038 opt_register_noarg("-a",
1039 opt_version_and_exit, "1.2.3", "");
1040 /* parse_args allocates argv */
1043 set_args(&argc, &argv, "thisprog", "-a", NULL);
1045 exitval = setjmp(exited);
1047 opt_parse(&argc, argv, save_err_output);
1048 fail("opt_show_version_and_exit returned?");
1050 ok1(exitval - 1 == 0);
1051 /* We should have freed table!. */
1052 ok1(opt_table == NULL);
1054 ok1(strcmp(output, "1.2.3\n") == 0);
1060 /* opt_usage_and_exit. */
1064 opt_register_noarg("-a",
1065 opt_usage_and_exit, "[args]", "");
1067 set_args(&argc, &argv, "thisprog", "-a", NULL);
1069 exitval = setjmp(exited);
1071 opt_parse(&argc, argv, save_err_output);
1072 fail("opt_usage_and_exit returned?");
1074 ok1(exitval - 1 == 0);
1075 /* We should have freed table!. */
1076 ok1(opt_table == NULL);
1078 ok1(strstr(output, "[args]"));
1079 ok1(strstr(output, argv[0]));
1080 ok1(strstr(output, "\n-a"));
1089 char buf[OPT_SHOW_LEN+2] = { 0 };
1090 buf[OPT_SHOW_LEN] = '!';
1093 opt_show_bool(buf, &b);
1094 ok1(strcmp(buf, "true") == 0);
1095 ok1(buf[OPT_SHOW_LEN] == '!');
1098 opt_show_bool(buf, &b);
1099 ok1(strcmp(buf, "false") == 0);
1100 ok1(buf[OPT_SHOW_LEN] == '!');
1103 /* opt_show_invbool */
1106 char buf[OPT_SHOW_LEN+2] = { 0 };
1107 buf[OPT_SHOW_LEN] = '!';
1110 opt_show_invbool(buf, &b);
1111 ok1(strcmp(buf, "false") == 0);
1112 ok1(buf[OPT_SHOW_LEN] == '!');
1115 opt_show_invbool(buf, &b);
1116 ok1(strcmp(buf, "true") == 0);
1117 ok1(buf[OPT_SHOW_LEN] == '!');
1120 /* opt_show_charp */
1122 char str[OPT_SHOW_LEN*2], *p;
1123 char buf[OPT_SHOW_LEN+2] = { 0 };
1124 buf[OPT_SHOW_LEN] = '!';
1129 opt_show_charp(buf, &p);
1130 ok1(strcmp(buf, "\"short\"") == 0);
1131 ok1(buf[OPT_SHOW_LEN] == '!');
1133 /* Truncate test. */
1134 memset(p, 'x', OPT_SHOW_LEN*2);
1135 p[OPT_SHOW_LEN*2-1] = '\0';
1136 opt_show_charp(buf, &p);
1138 ok1(buf[OPT_SHOW_LEN-1] == '"');
1139 ok1(buf[OPT_SHOW_LEN] == '!');
1140 ok1(strspn(buf+1, "x") == OPT_SHOW_LEN-2);
1143 /* opt_show_intval */
1146 char buf[OPT_SHOW_LEN+2] = { 0 };
1147 buf[OPT_SHOW_LEN] = '!';
1150 opt_show_intval(buf, &i);
1151 ok1(strcmp(buf, "-77") == 0);
1152 ok1(buf[OPT_SHOW_LEN] == '!');
1155 opt_show_intval(buf, &i);
1156 ok1(strcmp(buf, "77") == 0);
1157 ok1(buf[OPT_SHOW_LEN] == '!');
1160 /* opt_show_uintval */
1163 char buf[OPT_SHOW_LEN+2] = { 0 };
1164 buf[OPT_SHOW_LEN] = '!';
1167 opt_show_uintval(buf, &ui);
1168 ok1(strcmp(buf, "4294967295") == 0);
1169 ok1(buf[OPT_SHOW_LEN] == '!');
1172 /* opt_show_longval */
1175 char buf[OPT_SHOW_LEN+2] = { 0 };
1176 buf[OPT_SHOW_LEN] = '!';
1179 opt_show_longval(buf, &l);
1180 ok1(strcmp(buf, "1234567890") == 0);
1181 ok1(buf[OPT_SHOW_LEN] == '!');
1184 /* opt_show_ulongval */
1187 char buf[OPT_SHOW_LEN+2] = { 0 };
1188 buf[OPT_SHOW_LEN] = '!';
1191 opt_show_ulongval(buf, &ul);
1192 ok1(strcmp(buf, "4294967295") == 0);
1193 ok1(buf[OPT_SHOW_LEN] == '!');
1196 /* opt_show_floatval */
1199 char buf[OPT_SHOW_LEN+2] = { 0 };
1200 buf[OPT_SHOW_LEN] = '!';
1203 opt_show_floatval(buf, &f);
1204 ok1(strcmp(buf, "-77.500000") == 0);
1205 ok1(buf[OPT_SHOW_LEN] == '!');
1208 opt_show_floatval(buf, &f);
1209 ok1(strcmp(buf, "77.500000") == 0);
1210 ok1(buf[OPT_SHOW_LEN] == '!');
1213 /* opt_show_doubleval */
1216 char buf[OPT_SHOW_LEN+2] = { 0 };
1217 buf[OPT_SHOW_LEN] = '!';
1220 opt_show_doubleval(buf, &d);
1221 ok1(strcmp(buf, "-77.000000") == 0);
1222 ok1(buf[OPT_SHOW_LEN] == '!');
1225 opt_show_doubleval(buf, &d);
1226 ok1(strcmp(buf, "77.000000") == 0);
1227 ok1(buf[OPT_SHOW_LEN] == '!');
1230 /* opt_log_stderr. */
1233 opt_register_noarg("-a",
1234 opt_usage_and_exit, "[args]", "");
1236 set_args(&argc, &argv, "thisprog", "--garbage", NULL);
1237 ok1(!opt_parse(&argc, argv, opt_log_stderr));
1239 "thisprog: --garbage: unrecognized option\n"));
1245 /* opt_log_stderr_exit. */
1249 opt_register_noarg("-a",
1250 opt_usage_and_exit, "[args]", "");
1251 set_args(&argc, &argv, "thisprog", "--garbage", NULL);
1252 exitval = setjmp(exited);
1254 opt_parse(&argc, argv, opt_log_stderr_exit);
1255 fail("opt_log_stderr_exit returned?");
1257 ok1(exitval - 1 == 1);
1261 "thisprog: --garbage: unrecognized option\n"));
1266 //diag("%s\n", err_output);
1267 return exit_status();