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);
427 const long long k = 1000;
428 const long long M = k * k;
429 const long long G = k * k * k;
430 const long long T = k * k * k * k;
431 const long long P = k * k * k * k * k;
432 const long long E = k * k * k * k * k * k;
434 /* opt_set_uintval_si */
436 unsigned int arg = 1000;
438 opt_register_arg("-a", opt_set_uintval_si, NULL,
440 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
442 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
443 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
446 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
449 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
451 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
452 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
454 ok1(!parse_args(&argc, &argv, "-a", "-1K", NULL));
455 if (sizeof(unsigned int) < 8)
456 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
458 pass("can't test int truncation when int is so huge");
461 /* opt_set_intval_si */
465 opt_register_arg("-a", opt_set_intval_si, NULL,
467 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
469 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
471 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
474 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
477 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
479 ok1(!parse_args(&argc, &argv, "-a", "", NULL));
480 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
481 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
483 ok1(parse_args(&argc, &argv, "-a", "-1K", NULL));
486 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
488 pass("can't test int truncation when int is so huge");
492 /* opt_set_ulongval_si */
494 unsigned long long int arg = 1000;
497 opt_register_arg("-a", opt_set_ulongval_si, NULL,
499 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
501 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
502 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
504 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
505 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
506 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
508 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
510 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
512 /*note, 2999M > max signed 32 bit long, 1 << 31*/
513 ok1(parse_args(&argc, &argv, "-a", "2999m", NULL));
514 ok1(arg == 2999 * M);
515 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
517 ok1(!parse_args(&argc, &argv, "-a", "-1G", NULL));
518 ok1(parse_args(&argc, &argv, "-a", "4G", NULL));
519 ok1(arg == 4000000000);
520 if (sizeof(long) == 4){
521 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
522 ok1(!parse_args(&argc, &argv, "-a", "4295M", NULL));
523 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
524 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
526 else if (sizeof(long)== 8){
527 ok1(!parse_args(&argc, &argv, "-a",
528 "18446744073709551616", NULL));
529 ok1(parse_args(&argc, &argv, "-a", "9E", NULL));
530 ok1(arg == 9000000000000000000ULL);
531 ok1(!parse_args(&argc, &argv, "-a", "19E", NULL));
534 fail("FIXME: Handle other long sizes");
537 /* opt_set_longval_si */
542 opt_register_arg("-a", opt_set_longval_si, NULL,
544 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
546 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
548 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
550 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
551 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
552 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
554 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
555 ok1(arg == -100 * k);
556 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
558 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
560 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
562 ok1(parse_args(&argc, &argv, "-a", "-1G", NULL));
564 if (sizeof(long) == 4){
565 ok1(!parse_args(&argc, &argv, "-a", "2147483648", NULL));
566 ok1(!parse_args(&argc, &argv, "-a", "4G", NULL));
567 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
568 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
569 ok1(parse_args(&argc, &argv, "-a", "1999m", NULL));
570 ok1(arg == 1999 * M);
572 else if (sizeof(long)== 8){
573 ok1(!parse_args(&argc, &argv, "-a",
574 "9223372036854775808", NULL));
575 ok1(!parse_args(&argc, &argv, "-a", "9224P", NULL));
576 ok1(parse_args(&argc, &argv, "-a", "9E", NULL));
578 ok1(parse_args(&argc, &argv, "-a", "123T", NULL));
582 fail("FIXME: Handle other long sizes");
586 /* opt_set_longlongval_si */
588 long long int arg = 1000;
590 opt_register_arg("-a", opt_set_longlongval_si, NULL,
592 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
594 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
596 ok1(parse_args(&argc, &argv, "-a", "0T", NULL));
598 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
599 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
600 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
601 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
603 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
604 ok1(arg == -100 * k);
605 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
607 ok1(parse_args(&argc, &argv, "-a", "-333333M", NULL));
608 ok1(arg == -333333 * M);
609 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
611 ok1(parse_args(&argc, &argv, "-a", "1024t", NULL));
612 ok1(arg == 1024 * T);
613 ok1(parse_args(&argc, &argv, "-a", "123P", NULL));
615 ok1(parse_args(&argc, &argv, "-a", "-3E", NULL));
617 ok1(parse_args(&argc, &argv, "-a", "8E", NULL));
618 if (sizeof(long long) == 8){
619 ok1(!parse_args(&argc, &argv, "-a",
620 "9223372036854775808", NULL));
621 ok1(!parse_args(&argc, &argv, "-a",
625 fail("FIXME: Handle other long long int"
626 " sizes (specifically %lu bytes)",
630 /* opt_set_ulonglongval_si */
632 unsigned long long int arg = 1000;
634 opt_register_arg("-a", opt_set_ulonglongval_si, NULL,
636 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
638 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
639 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
641 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
642 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
643 ok1(parse_args(&argc, &argv, "-a", "100G", NULL));
645 ok1(!parse_args(&argc, &argv, "-a", "-100G", NULL));
646 ok1(parse_args(&argc, &argv, "-a", "8E", NULL));
655 opt_register_noarg("-a", opt_inc_intval, &arg, "");
656 ok1(parse_args(&argc, &argv, "-a", NULL));
658 ok1(parse_args(&argc, &argv, "-a", "-a", NULL));
660 ok1(parse_args(&argc, &argv, "-aa", NULL));
664 /* opt_show_version_and_exit. */
668 opt_register_noarg("-a",
669 opt_version_and_exit, "1.2.3", "");
670 /* parse_args allocates argv */
674 argv = malloc(sizeof(argv[0]) * 3);
675 argv[0] = "thisprog";
679 exitval = setjmp(exited);
681 opt_parse(&argc, argv, save_err_output);
682 fail("opt_show_version_and_exit returned?");
684 ok1(exitval - 1 == 0);
686 ok1(strcmp(output, "1.2.3\n") == 0);
692 /* opt_usage_and_exit. */
696 opt_register_noarg("-a",
697 opt_usage_and_exit, "[args]", "");
700 argv = malloc(sizeof(argv[0]) * 3);
701 argv[0] = "thisprog";
705 exitval = setjmp(exited);
707 opt_parse(&argc, argv, save_err_output);
708 fail("opt_usage_and_exit returned?");
710 ok1(exitval - 1 == 0);
712 ok1(strstr(output, "[args]"));
713 ok1(strstr(output, argv[0]));
714 ok1(strstr(output, "[-a]"));
717 /* It exits without freeing usage string. */
718 free(last_allocation);
725 char buf[OPT_SHOW_LEN+2] = { 0 };
726 buf[OPT_SHOW_LEN] = '!';
729 opt_show_bool(buf, &b);
730 ok1(strcmp(buf, "true") == 0);
731 ok1(buf[OPT_SHOW_LEN] == '!');
734 opt_show_bool(buf, &b);
735 ok1(strcmp(buf, "false") == 0);
736 ok1(buf[OPT_SHOW_LEN] == '!');
739 /* opt_show_invbool */
742 char buf[OPT_SHOW_LEN+2] = { 0 };
743 buf[OPT_SHOW_LEN] = '!';
746 opt_show_invbool(buf, &b);
747 ok1(strcmp(buf, "false") == 0);
748 ok1(buf[OPT_SHOW_LEN] == '!');
751 opt_show_invbool(buf, &b);
752 ok1(strcmp(buf, "true") == 0);
753 ok1(buf[OPT_SHOW_LEN] == '!');
758 char str[OPT_SHOW_LEN*2], *p;
759 char buf[OPT_SHOW_LEN+2] = { 0 };
760 buf[OPT_SHOW_LEN] = '!';
765 opt_show_charp(buf, &p);
766 ok1(strcmp(buf, "\"short\"") == 0);
767 ok1(buf[OPT_SHOW_LEN] == '!');
770 memset(p, 'x', OPT_SHOW_LEN*2);
771 p[OPT_SHOW_LEN*2-1] = '\0';
772 opt_show_charp(buf, &p);
774 ok1(buf[OPT_SHOW_LEN-1] == '"');
775 ok1(buf[OPT_SHOW_LEN] == '!');
776 ok1(strspn(buf+1, "x") == OPT_SHOW_LEN-2);
779 /* opt_show_intval */
782 char buf[OPT_SHOW_LEN+2] = { 0 };
783 buf[OPT_SHOW_LEN] = '!';
786 opt_show_intval(buf, &i);
787 ok1(strcmp(buf, "-77") == 0);
788 ok1(buf[OPT_SHOW_LEN] == '!');
791 opt_show_intval(buf, &i);
792 ok1(strcmp(buf, "77") == 0);
793 ok1(buf[OPT_SHOW_LEN] == '!');
796 /* opt_show_uintval */
799 char buf[OPT_SHOW_LEN+2] = { 0 };
800 buf[OPT_SHOW_LEN] = '!';
803 opt_show_uintval(buf, &ui);
804 ok1(strcmp(buf, "4294967295") == 0);
805 ok1(buf[OPT_SHOW_LEN] == '!');
808 /* opt_show_longval */
811 char buf[OPT_SHOW_LEN+2] = { 0 };
812 buf[OPT_SHOW_LEN] = '!';
815 opt_show_longval(buf, &l);
816 ok1(strcmp(buf, "1234567890") == 0);
817 ok1(buf[OPT_SHOW_LEN] == '!');
820 /* opt_show_ulongval */
823 char buf[OPT_SHOW_LEN+2] = { 0 };
824 buf[OPT_SHOW_LEN] = '!';
827 opt_show_ulongval(buf, &ul);
828 ok1(strcmp(buf, "4294967295") == 0);
829 ok1(buf[OPT_SHOW_LEN] == '!');
832 /* opt_log_stderr. */
835 opt_register_noarg("-a",
836 opt_usage_and_exit, "[args]", "");
839 argv = malloc(sizeof(argv[0]) * 3);
840 argv[0] = "thisprog";
841 argv[1] = "--garbage";
843 ok1(!opt_parse(&argc, argv, opt_log_stderr));
845 "thisprog: --garbage: unrecognized option\n"));
851 /* opt_log_stderr_exit. */
855 opt_register_noarg("-a",
856 opt_usage_and_exit, "[args]", "");
858 argv = malloc(sizeof(argv[0]) * 3);
859 argv[0] = "thisprog";
860 argv[1] = "--garbage";
862 exitval = setjmp(exited);
864 opt_parse(&argc, argv, opt_log_stderr_exit);
865 fail("opt_log_stderr_exit returned?");
867 ok1(exitval - 1 == 1);
871 "thisprog: --garbage: unrecognized option\n"));
876 //diag("%s\n", err_output);
877 return exit_status();