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 char *output = NULL;
32 static int saved_vprintf(const char *fmt, va_list ap)
35 int ret = vasprintf(&p, fmt, ap);
38 output = realloc(output, strlen(output) + strlen(p) + 1);
46 static int saved_printf(const char *fmt, ...)
52 ret = saved_vprintf(fmt, ap);
57 static int saved_fprintf(FILE *ignored, const char *fmt, ...)
63 ret = saved_vprintf(fmt, ap);
69 static void *last_allocation;
70 static void *saved_malloc(size_t size)
72 return last_allocation = malloc(size);
75 static void set_args(int *argc, char ***argv, ...)
78 *argv = malloc(sizeof(**argv) * 20);
82 ((*argv)[*argc] = va_arg(ap, char*)) != NULL;
88 int main(int argc, char *argv[])
96 opt_register_noarg("-a", opt_set_bool, &arg, "");
97 ok1(parse_args(&argc, &argv, "-a", NULL));
99 opt_register_arg("-b", opt_set_bool_arg, NULL, &arg, "");
100 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
102 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
104 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
106 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
108 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
110 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
112 /* opt_set_invbool */
116 opt_register_noarg("-a", opt_set_invbool, &arg, "");
117 ok1(parse_args(&argc, &argv, "-a", NULL));
119 opt_register_arg("-b", opt_set_invbool_arg, NULL,
121 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
123 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
125 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
127 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
129 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
131 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
135 char *arg = (char *)"wrong";
137 opt_register_arg("-a", opt_set_charp, NULL, &arg, "All");
138 ok1(parse_args(&argc, &argv, "-a", "string", NULL));
139 ok1(strcmp(arg, "string") == 0);
145 opt_register_arg("-a", opt_set_intval, NULL, &arg, "All");
146 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
148 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
150 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
152 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
153 if (sizeof(int) == 4)
154 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
156 fail("Handle other int sizes");
158 /* opt_set_uintval */
160 unsigned int arg = 1000;
162 opt_register_arg("-a", opt_set_uintval, NULL, &arg, "All");
163 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
165 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
166 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
168 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
169 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
170 if (ULONG_MAX == UINT_MAX) {
171 pass("Can't test overflow");
172 pass("Can't test error message");
175 sprintf(buf, "%lu", ULONG_MAX);
176 ok1(!parse_args(&argc, &argv, "-a", buf, NULL));
177 ok1(strstr(err_output, ": -a: value '")
178 && strstr(err_output, buf)
179 && strstr(err_output, "' does not fit into an integer"));
182 /* opt_set_longval */
186 opt_register_arg("-a", opt_set_longval, NULL, &arg, "All");
187 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
189 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
191 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
193 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
194 if (sizeof(long) == 4)
195 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
196 else if (sizeof(long)== 8)
197 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
199 fail("FIXME: Handle other long sizes");
201 /* opt_set_ulongval */
203 unsigned long int arg = 1000;
205 opt_register_arg("-a", opt_set_ulongval, NULL, &arg, "All");
206 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
208 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
209 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
211 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
212 if (sizeof(long) == 4)
213 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
214 else if (sizeof(long)== 8)
215 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
217 fail("FIXME: Handle other long sizes");
221 const long long k = 1024;
222 const long long M = k * k;
223 const long long G = k * k * k;
224 const long long T = k * k * k * k;
225 const long long P = k * k * k * k * k;
226 const long long E = k * k * k * k * k * k;
228 /* opt_set_uintval_bi */
230 unsigned int arg = 1000;
232 opt_register_arg("-a", opt_set_uintval_bi, NULL,
234 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
236 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
237 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
240 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
243 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
245 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
246 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
248 ok1(!parse_args(&argc, &argv, "-a", "-1K", NULL));
251 /* opt_set_intval_bi */
255 opt_register_arg("-a", opt_set_intval_bi, NULL,
257 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
259 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
261 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
264 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
267 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
269 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
270 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
272 ok1(parse_args(&argc, &argv, "-a", "-1K", NULL));
277 /* opt_set_ulongval_bi */
279 unsigned long int arg = 1000;
282 opt_register_arg("-a", opt_set_ulongval_bi, NULL,
284 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
286 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
287 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
290 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
292 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
293 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
295 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
297 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
299 /*note, 2999M > max signed 32 bit long, 1 << 31*/
300 ok1(parse_args(&argc, &argv, "-a", "2999m", NULL));
301 ok1(arg == 2999 * M);
302 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
304 ok1(!parse_args(&argc, &argv, "-a", "-1G", NULL));
305 if (sizeof(long) == 4){
306 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
307 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
308 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
310 else if (sizeof(long) == 8){
311 ok1(!parse_args(&argc, &argv, "-a",
312 "18446744073709551616", NULL));
313 ok1(!parse_args(&argc, &argv, "-a", "8E", NULL));
314 ok1(parse_args(&argc, &argv, "-a", "3E", NULL));
317 fail("FIXME: Handle other long sizes");
320 /* opt_set_longval_bi */
325 opt_register_arg("-a", opt_set_longval_bi, NULL,
327 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
329 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
331 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
333 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
334 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
335 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
337 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
338 ok1(arg == -100 * k);
339 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
341 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
343 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
345 ok1(parse_args(&argc, &argv, "-a", "-1G", NULL));
347 if (sizeof(long) == 4){
348 ok1(!parse_args(&argc, &argv, "-a", "2147483648", NULL));
349 ok1(!parse_args(&argc, &argv, "-a", "2G", NULL));
350 ok1(!parse_args(&argc, &argv, "-a", "2048m", NULL));
351 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
352 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
354 else if (sizeof(long) == 8){
355 ok1(!parse_args(&argc, &argv, "-a",
356 "9223372036854775808", NULL));
357 ok1(parse_args(&argc, &argv, "-a", "3E", NULL));
359 ok1(parse_args(&argc, &argv, "-a", "123T", NULL));
363 fail("FIXME: Handle other long sizes");
367 /* opt_set_longlongval_bi */
369 long long int arg = 1000;
371 opt_register_arg("-a", opt_set_longlongval_bi, NULL,
373 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
375 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
377 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
379 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
380 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
381 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
382 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
384 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
385 ok1(arg == -100 * k);
386 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
388 ok1(parse_args(&argc, &argv, "-a", "-333333M", NULL));
389 ok1(arg == -333333 * M);
390 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
392 ok1(parse_args(&argc, &argv, "-a", "1024t", NULL));
393 ok1(arg == 1024 * T);
394 ok1(parse_args(&argc, &argv, "-a", "123P", NULL));
396 ok1(parse_args(&argc, &argv, "-a", "-3E", NULL));
399 if (sizeof(long long) == 8){
400 ok1(!parse_args(&argc, &argv, "-a",
401 "9223372036854775808", NULL));
402 /*8E and 922337.. are both 1 << 63*/
403 ok1(!parse_args(&argc, &argv, "-a", "8E", NULL));
406 fail("FIXME: Handle other long long int"
407 " sizes (specifically %zu bytes)",
410 /* opt_set_ulonglongval_bi */
412 unsigned long long int arg = 1000;
414 opt_register_arg("-a", opt_set_ulonglongval_bi, NULL,
416 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
418 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
419 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
421 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
422 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
423 ok1(parse_args(&argc, &argv, "-a", "100G", NULL));
425 ok1(!parse_args(&argc, &argv, "-a", "-100G", NULL));
426 ok1(parse_args(&argc, &argv, "-a", "8191P", NULL));
427 ok1(arg == 8191 * P);
430 /* opt_show_intval_bi */
433 char buf[OPT_SHOW_LEN+2] = { 0 };
434 buf[OPT_SHOW_LEN] = '!';
436 opt_show_intval_bi(buf, &i);
437 ok1(strcmp(buf, "-77") == 0);
439 opt_show_intval_bi(buf, &i);
440 ok1(strcmp(buf, "0") == 0);
441 ok1(buf[OPT_SHOW_LEN] == '!');
443 opt_show_intval_bi(buf, &i);
444 ok1(strcmp(buf, "77") == 0);
445 ok1(buf[OPT_SHOW_LEN] == '!');
447 opt_show_intval_bi(buf, &i);
448 ok1(strcmp(buf, "-1234k") == 0);
449 ok1(buf[OPT_SHOW_LEN] == '!');
451 opt_show_intval_bi(buf, &i);
452 ok1(strcmp(buf, "500M") == 0);
453 ok1(buf[OPT_SHOW_LEN] == '!');
455 opt_show_intval_bi(buf, &i);
456 ok1(strcmp(buf, "1G") == 0);
457 ok1(buf[OPT_SHOW_LEN] == '!');
460 /* opt_show_longval_bi */
463 char buf[OPT_SHOW_LEN+2] = { 0 };
464 buf[OPT_SHOW_LEN] = '!';
466 opt_show_longval_bi(buf, &i);
467 ok1(strcmp(buf, "-77") == 0);
468 ok1(buf[OPT_SHOW_LEN] == '!');
470 opt_show_longval_bi(buf, &i);
471 ok1(strcmp(buf, "77") == 0);
472 ok1(buf[OPT_SHOW_LEN] == '!');
474 opt_show_longval_bi(buf, &i);
475 ok1(strcmp(buf, "-1k") == 0);
476 ok1(buf[OPT_SHOW_LEN] == '!');
478 opt_show_longval_bi(buf, &i);
479 ok1(strcmp(buf, "500M") == 0);
480 ok1(buf[OPT_SHOW_LEN] == '!');
482 opt_show_longval_bi(buf, &i);
483 ok1(strcmp(buf, "1G") == 0);
484 ok1(buf[OPT_SHOW_LEN] == '!');
486 opt_show_longval_bi(buf, &i);
487 ok1(strcmp(buf, "0") == 0);
488 ok1(buf[OPT_SHOW_LEN] == '!');
491 /* opt_show_llongval_bi */
494 char buf[OPT_SHOW_LEN+2] = { 0 };
495 buf[OPT_SHOW_LEN] = '!';
497 opt_show_longlongval_bi(buf, &i);
498 ok1(strcmp(buf, "-7777") == 0);
499 ok1(buf[OPT_SHOW_LEN] == '!');
501 opt_show_longlongval_bi(buf, &i);
502 ok1(strcmp(buf, "7777") == 0);
503 ok1(buf[OPT_SHOW_LEN] == '!');
505 opt_show_longlongval_bi(buf, &i);
506 ok1(strcmp(buf, "-10000M") == 0);
507 ok1(buf[OPT_SHOW_LEN] == '!');
509 opt_show_longlongval_bi(buf, &i);
510 ok1(strcmp(buf, "5P") == 0);
511 ok1(buf[OPT_SHOW_LEN] == '!');
513 opt_show_longlongval_bi(buf, &i);
514 ok1(strcmp(buf, "1E") == 0);
515 ok1(buf[OPT_SHOW_LEN] == '!');
518 /* opt_show_uintval_bi */
521 char buf[OPT_SHOW_LEN+2] = { 0 };
522 buf[OPT_SHOW_LEN] = '!';
524 opt_show_uintval_bi(buf, &i);
525 ok1(strcmp(buf, "77") == 0);
526 ok1(buf[OPT_SHOW_LEN] == '!');
528 opt_show_uintval_bi(buf, &i);
529 ok1(strcmp(buf, "1234k") == 0);
530 ok1(buf[OPT_SHOW_LEN] == '!');
532 opt_show_uintval_bi(buf, &i);
533 ok1(strcmp(buf, "500M") == 0);
534 ok1(buf[OPT_SHOW_LEN] == '!');
536 opt_show_uintval_bi(buf, &i);
537 ok1(strcmp(buf, "1G") == 0);
538 ok1(buf[OPT_SHOW_LEN] == '!');
541 /* opt_show_ulongval_bi */
544 char buf[OPT_SHOW_LEN+2] = { 0 };
545 buf[OPT_SHOW_LEN] = '!';
547 opt_show_ulongval_bi(buf, &i);
548 ok1(strcmp(buf, "77") == 0);
549 ok1(buf[OPT_SHOW_LEN] == '!');
551 opt_show_ulongval_bi(buf, &i);
552 ok1(strcmp(buf, "1k") == 0);
553 ok1(buf[OPT_SHOW_LEN] == '!');
555 opt_show_ulongval_bi(buf, &i);
556 ok1(strcmp(buf, "500M") == 0);
557 ok1(buf[OPT_SHOW_LEN] == '!');
559 opt_show_ulongval_bi(buf, &i);
560 ok1(strcmp(buf, "1G") == 0);
561 ok1(buf[OPT_SHOW_LEN] == '!');
563 opt_show_ulongval_bi(buf, &i);
564 ok1(strcmp(buf, "0") == 0);
565 ok1(buf[OPT_SHOW_LEN] == '!');
568 /* opt_show_ullongval_bi */
571 char buf[OPT_SHOW_LEN+2] = { 0 };
572 buf[OPT_SHOW_LEN] = '!';
574 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
575 ok1(strcmp(buf, "7777") == 0);
576 ok1(buf[OPT_SHOW_LEN] == '!');
578 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
579 ok1(strcmp(buf, "10000M") == 0);
580 ok1(buf[OPT_SHOW_LEN] == '!');
582 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
583 ok1(strcmp(buf, "5P") == 0);
584 ok1(buf[OPT_SHOW_LEN] == '!');
586 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
587 ok1(strcmp(buf, "1E") == 0);
588 ok1(buf[OPT_SHOW_LEN] == '!');
593 const long long k = 1000;
594 const long long M = k * k;
595 const long long G = k * k * k;
596 const long long T = k * k * k * k;
597 const long long P = k * k * k * k * k;
598 const long long E = k * k * k * k * k * k;
600 /* opt_set_uintval_si */
602 unsigned int arg = 1000;
604 opt_register_arg("-a", opt_set_uintval_si, NULL,
606 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
608 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
609 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
612 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
615 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
617 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
618 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
620 ok1(!parse_args(&argc, &argv, "-a", "-1K", NULL));
621 if (sizeof(unsigned int) < 8)
622 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
624 pass("can't test int truncation when int is so huge");
627 /* opt_set_intval_si */
631 opt_register_arg("-a", opt_set_intval_si, NULL,
633 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
635 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
637 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
640 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
643 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
645 ok1(!parse_args(&argc, &argv, "-a", "", NULL));
646 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
647 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
649 ok1(parse_args(&argc, &argv, "-a", "-1K", NULL));
652 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
654 pass("can't test int truncation when int is so huge");
658 /* opt_set_ulongval_si */
660 unsigned long int arg = 1000;
663 opt_register_arg("-a", opt_set_ulongval_si, NULL,
665 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
667 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
668 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
670 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
671 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
672 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
674 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
676 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
678 /*note, 2999M > max signed 32 bit long, 1 << 31*/
679 ok1(parse_args(&argc, &argv, "-a", "2999m", NULL));
680 ok1(arg == 2999 * M);
681 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
683 ok1(!parse_args(&argc, &argv, "-a", "-1G", NULL));
684 ok1(parse_args(&argc, &argv, "-a", "4G", NULL));
685 ok1(arg == 4000000000U);
686 if (sizeof(long) == 4){
687 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
688 ok1(!parse_args(&argc, &argv, "-a", "4295M", NULL));
689 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
690 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
692 else if (sizeof(long)== 8){
693 ok1(!parse_args(&argc, &argv, "-a",
694 "18446744073709551616", NULL));
695 ok1(parse_args(&argc, &argv, "-a", "9E", NULL));
696 ok1(arg == 9000000000000000000ULL);
697 ok1(!parse_args(&argc, &argv, "-a", "19E", NULL));
700 fail("FIXME: Handle other long sizes");
703 /* opt_set_longval_si */
708 opt_register_arg("-a", opt_set_longval_si, NULL,
710 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
712 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
714 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
716 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
717 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
718 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
720 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
721 ok1(arg == -100 * k);
722 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
724 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
726 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
728 ok1(parse_args(&argc, &argv, "-a", "-1G", NULL));
730 if (sizeof(long) == 4){
731 ok1(!parse_args(&argc, &argv, "-a", "2147483648", NULL));
732 ok1(!parse_args(&argc, &argv, "-a", "4G", NULL));
733 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
734 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
735 ok1(parse_args(&argc, &argv, "-a", "1999m", NULL));
736 ok1(arg == 1999 * M);
738 else if (sizeof(long)== 8){
739 ok1(!parse_args(&argc, &argv, "-a",
740 "9223372036854775808", NULL));
741 ok1(!parse_args(&argc, &argv, "-a", "9224P", NULL));
742 ok1(parse_args(&argc, &argv, "-a", "9E", NULL));
744 ok1(parse_args(&argc, &argv, "-a", "123T", NULL));
748 fail("FIXME: Handle other long sizes");
752 /* opt_set_longlongval_si */
754 long long int arg = 1000;
756 opt_register_arg("-a", opt_set_longlongval_si, NULL,
758 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
760 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
762 ok1(parse_args(&argc, &argv, "-a", "0T", NULL));
764 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
765 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
766 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
767 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
769 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
770 ok1(arg == -100 * k);
771 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
773 ok1(parse_args(&argc, &argv, "-a", "-333333M", NULL));
774 ok1(arg == -333333 * M);
775 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
777 ok1(parse_args(&argc, &argv, "-a", "1024t", NULL));
778 ok1(arg == 1024 * T);
779 ok1(parse_args(&argc, &argv, "-a", "123P", NULL));
781 ok1(parse_args(&argc, &argv, "-a", "-3E", NULL));
783 ok1(parse_args(&argc, &argv, "-a", "8E", NULL));
784 if (sizeof(long long) == 8){
785 ok1(!parse_args(&argc, &argv, "-a",
786 "9223372036854775808", NULL));
787 ok1(!parse_args(&argc, &argv, "-a",
791 fail("FIXME: Handle other long long int"
792 " sizes (specifically %zu bytes)",
796 /* opt_set_ulonglongval_si */
798 unsigned long long int arg = 1000;
800 opt_register_arg("-a", opt_set_ulonglongval_si, NULL,
802 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
804 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
805 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
807 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
808 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
809 ok1(parse_args(&argc, &argv, "-a", "100G", NULL));
811 ok1(!parse_args(&argc, &argv, "-a", "-100G", NULL));
812 ok1(parse_args(&argc, &argv, "-a", "8E", NULL));
814 /* opt_show_intval_si */
817 char buf[OPT_SHOW_LEN+2] = { 0 };
818 buf[OPT_SHOW_LEN] = '!';
820 opt_show_intval_si(buf, &i);
821 ok1(strcmp(buf, "-77") == 0);
823 opt_show_intval_si(buf, &i);
824 ok1(strcmp(buf, "0") == 0);
825 ok1(buf[OPT_SHOW_LEN] == '!');
827 opt_show_intval_si(buf, &i);
828 ok1(strcmp(buf, "77") == 0);
829 ok1(buf[OPT_SHOW_LEN] == '!');
831 opt_show_intval_si(buf, &i);
832 ok1(strcmp(buf, "-1234k") == 0);
833 ok1(buf[OPT_SHOW_LEN] == '!');
835 opt_show_intval_si(buf, &i);
836 ok1(strcmp(buf, "500M") == 0);
837 ok1(buf[OPT_SHOW_LEN] == '!');
839 opt_show_intval_si(buf, &i);
840 ok1(strcmp(buf, "1G") == 0);
841 ok1(buf[OPT_SHOW_LEN] == '!');
844 /* opt_show_longval_si */
847 char buf[OPT_SHOW_LEN+2] = { 0 };
848 buf[OPT_SHOW_LEN] = '!';
850 opt_show_longval_si(buf, &i);
851 ok1(strcmp(buf, "-77") == 0);
852 ok1(buf[OPT_SHOW_LEN] == '!');
854 opt_show_longval_si(buf, &i);
855 ok1(strcmp(buf, "77") == 0);
856 ok1(buf[OPT_SHOW_LEN] == '!');
858 opt_show_longval_si(buf, &i);
859 ok1(strcmp(buf, "-1k") == 0);
860 ok1(buf[OPT_SHOW_LEN] == '!');
862 opt_show_longval_si(buf, &i);
863 ok1(strcmp(buf, "500M") == 0);
864 ok1(buf[OPT_SHOW_LEN] == '!');
866 opt_show_longval_si(buf, &i);
867 ok1(strcmp(buf, "1G") == 0);
868 ok1(buf[OPT_SHOW_LEN] == '!');
870 opt_show_longval_si(buf, &i);
871 ok1(strcmp(buf, "0") == 0);
872 ok1(buf[OPT_SHOW_LEN] == '!');
875 /* opt_show_llongval_si */
878 char buf[OPT_SHOW_LEN+2] = { 0 };
879 buf[OPT_SHOW_LEN] = '!';
881 opt_show_longlongval_si(buf, &i);
882 ok1(strcmp(buf, "-7777") == 0);
883 ok1(buf[OPT_SHOW_LEN] == '!');
885 opt_show_longlongval_si(buf, &i);
886 ok1(strcmp(buf, "7777") == 0);
887 ok1(buf[OPT_SHOW_LEN] == '!');
889 opt_show_longlongval_si(buf, &i);
890 ok1(strcmp(buf, "-10240M") == 0);
891 ok1(buf[OPT_SHOW_LEN] == '!');
893 opt_show_longlongval_si(buf, &i);
894 ok1(strcmp(buf, "5P") == 0);
895 ok1(buf[OPT_SHOW_LEN] == '!');
897 opt_show_longlongval_si(buf, &i);
898 ok1(strcmp(buf, "2E") == 0);
899 ok1(buf[OPT_SHOW_LEN] == '!');
902 /* opt_show_uintval_si */
905 char buf[OPT_SHOW_LEN+2] = { 0 };
906 buf[OPT_SHOW_LEN] = '!';
908 opt_show_uintval_si(buf, &i);
909 ok1(strcmp(buf, "77") == 0);
910 ok1(buf[OPT_SHOW_LEN] == '!');
912 opt_show_uintval_si(buf, &i);
913 ok1(strcmp(buf, "1234k") == 0);
914 ok1(buf[OPT_SHOW_LEN] == '!');
916 opt_show_uintval_si(buf, &i);
917 ok1(strcmp(buf, "500M") == 0);
918 ok1(buf[OPT_SHOW_LEN] == '!');
920 opt_show_uintval_si(buf, &i);
921 ok1(strcmp(buf, "1G") == 0);
922 ok1(buf[OPT_SHOW_LEN] == '!');
925 /* opt_show_ulongval_si */
928 char buf[OPT_SHOW_LEN+2] = { 0 };
929 buf[OPT_SHOW_LEN] = '!';
931 opt_show_ulongval_si(buf, &i);
932 ok1(strcmp(buf, "77") == 0);
933 ok1(buf[OPT_SHOW_LEN] == '!');
935 opt_show_ulongval_si(buf, &i);
936 ok1(strcmp(buf, "1k") == 0);
937 ok1(buf[OPT_SHOW_LEN] == '!');
939 opt_show_ulongval_si(buf, &i);
940 ok1(strcmp(buf, "500M") == 0);
941 ok1(buf[OPT_SHOW_LEN] == '!');
943 opt_show_ulongval_si(buf, &i);
944 ok1(strcmp(buf, "1024M") == 0);
945 ok1(buf[OPT_SHOW_LEN] == '!');
947 opt_show_ulongval_si(buf, &i);
948 ok1(strcmp(buf, "0") == 0);
949 ok1(buf[OPT_SHOW_LEN] == '!');
952 /* opt_show_ullongval_si */
955 char buf[OPT_SHOW_LEN+2] = { 0 };
956 buf[OPT_SHOW_LEN] = '!';
958 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
959 ok1(strcmp(buf, "7777") == 0);
960 ok1(buf[OPT_SHOW_LEN] == '!');
962 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
963 ok1(strcmp(buf, "10240M") == 0);
964 ok1(buf[OPT_SHOW_LEN] == '!');
966 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
967 ok1(strcmp(buf, "5P") == 0);
968 ok1(buf[OPT_SHOW_LEN] == '!');
970 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
971 ok1(strcmp(buf, "1E") == 0);
972 ok1(buf[OPT_SHOW_LEN] == '!');
982 opt_register_noarg("-a", opt_inc_intval, &arg, "");
983 ok1(parse_args(&argc, &argv, "-a", NULL));
985 ok1(parse_args(&argc, &argv, "-a", "-a", NULL));
987 ok1(parse_args(&argc, &argv, "-aa", NULL));
991 /* opt_show_version_and_exit. */
995 opt_register_noarg("-a",
996 opt_version_and_exit, "1.2.3", "");
997 /* parse_args allocates argv */
1000 set_args(&argc, &argv, "thisprog", "-a", NULL);
1002 exitval = setjmp(exited);
1004 opt_parse(&argc, argv, save_err_output);
1005 fail("opt_show_version_and_exit returned?");
1007 ok1(exitval - 1 == 0);
1009 ok1(strcmp(output, "1.2.3\n") == 0);
1015 /* opt_usage_and_exit. */
1019 opt_register_noarg("-a",
1020 opt_usage_and_exit, "[args]", "");
1022 set_args(&argc, &argv, "thisprog", "-a", NULL);
1024 exitval = setjmp(exited);
1026 opt_parse(&argc, argv, save_err_output);
1027 fail("opt_usage_and_exit returned?");
1029 ok1(exitval - 1 == 0);
1031 ok1(strstr(output, "[args]"));
1032 ok1(strstr(output, argv[0]));
1033 ok1(strstr(output, "[-a]"));
1036 /* It exits without freeing usage string. */
1037 free(last_allocation);
1044 char buf[OPT_SHOW_LEN+2] = { 0 };
1045 buf[OPT_SHOW_LEN] = '!';
1048 opt_show_bool(buf, &b);
1049 ok1(strcmp(buf, "true") == 0);
1050 ok1(buf[OPT_SHOW_LEN] == '!');
1053 opt_show_bool(buf, &b);
1054 ok1(strcmp(buf, "false") == 0);
1055 ok1(buf[OPT_SHOW_LEN] == '!');
1058 /* opt_show_invbool */
1061 char buf[OPT_SHOW_LEN+2] = { 0 };
1062 buf[OPT_SHOW_LEN] = '!';
1065 opt_show_invbool(buf, &b);
1066 ok1(strcmp(buf, "false") == 0);
1067 ok1(buf[OPT_SHOW_LEN] == '!');
1070 opt_show_invbool(buf, &b);
1071 ok1(strcmp(buf, "true") == 0);
1072 ok1(buf[OPT_SHOW_LEN] == '!');
1075 /* opt_show_charp */
1077 char str[OPT_SHOW_LEN*2], *p;
1078 char buf[OPT_SHOW_LEN+2] = { 0 };
1079 buf[OPT_SHOW_LEN] = '!';
1084 opt_show_charp(buf, &p);
1085 ok1(strcmp(buf, "\"short\"") == 0);
1086 ok1(buf[OPT_SHOW_LEN] == '!');
1088 /* Truncate test. */
1089 memset(p, 'x', OPT_SHOW_LEN*2);
1090 p[OPT_SHOW_LEN*2-1] = '\0';
1091 opt_show_charp(buf, &p);
1093 ok1(buf[OPT_SHOW_LEN-1] == '"');
1094 ok1(buf[OPT_SHOW_LEN] == '!');
1095 ok1(strspn(buf+1, "x") == OPT_SHOW_LEN-2);
1098 /* opt_show_intval */
1101 char buf[OPT_SHOW_LEN+2] = { 0 };
1102 buf[OPT_SHOW_LEN] = '!';
1105 opt_show_intval(buf, &i);
1106 ok1(strcmp(buf, "-77") == 0);
1107 ok1(buf[OPT_SHOW_LEN] == '!');
1110 opt_show_intval(buf, &i);
1111 ok1(strcmp(buf, "77") == 0);
1112 ok1(buf[OPT_SHOW_LEN] == '!');
1115 /* opt_show_uintval */
1118 char buf[OPT_SHOW_LEN+2] = { 0 };
1119 buf[OPT_SHOW_LEN] = '!';
1122 opt_show_uintval(buf, &ui);
1123 ok1(strcmp(buf, "4294967295") == 0);
1124 ok1(buf[OPT_SHOW_LEN] == '!');
1127 /* opt_show_longval */
1130 char buf[OPT_SHOW_LEN+2] = { 0 };
1131 buf[OPT_SHOW_LEN] = '!';
1134 opt_show_longval(buf, &l);
1135 ok1(strcmp(buf, "1234567890") == 0);
1136 ok1(buf[OPT_SHOW_LEN] == '!');
1139 /* opt_show_ulongval */
1142 char buf[OPT_SHOW_LEN+2] = { 0 };
1143 buf[OPT_SHOW_LEN] = '!';
1146 opt_show_ulongval(buf, &ul);
1147 ok1(strcmp(buf, "4294967295") == 0);
1148 ok1(buf[OPT_SHOW_LEN] == '!');
1151 /* opt_log_stderr. */
1154 opt_register_noarg("-a",
1155 opt_usage_and_exit, "[args]", "");
1157 set_args(&argc, &argv, "thisprog", "--garbage", NULL);
1158 ok1(!opt_parse(&argc, argv, opt_log_stderr));
1160 "thisprog: --garbage: unrecognized option\n"));
1166 /* opt_log_stderr_exit. */
1170 opt_register_noarg("-a",
1171 opt_usage_and_exit, "[args]", "");
1172 set_args(&argc, &argv, "thisprog", "--garbage", NULL);
1173 exitval = setjmp(exited);
1175 opt_parse(&argc, argv, opt_log_stderr_exit);
1176 fail("opt_log_stderr_exit returned?");
1178 ok1(exitval - 1 == 1);
1182 "thisprog: --garbage: unrecognized option\n"));
1187 //diag("%s\n", err_output);
1188 return exit_status();