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);
76 int main(int argc, char *argv[])
84 opt_register_noarg("-a", opt_set_bool, &arg, "");
85 ok1(parse_args(&argc, &argv, "-a", NULL));
87 opt_register_arg("-b", opt_set_bool_arg, NULL, &arg, "");
88 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
90 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
92 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
94 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
96 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
98 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
100 /* opt_set_invbool */
104 opt_register_noarg("-a", opt_set_invbool, &arg, "");
105 ok1(parse_args(&argc, &argv, "-a", NULL));
107 opt_register_arg("-b", opt_set_invbool_arg, NULL,
109 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
111 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
113 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
115 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
117 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
119 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
123 char *arg = (char *)"wrong";
125 opt_register_arg("-a", opt_set_charp, NULL, &arg, "All");
126 ok1(parse_args(&argc, &argv, "-a", "string", NULL));
127 ok1(strcmp(arg, "string") == 0);
133 opt_register_arg("-a", opt_set_intval, NULL, &arg, "All");
134 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
136 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
138 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
140 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
141 if (sizeof(int) == 4)
142 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
144 fail("Handle other int sizes");
146 /* opt_set_uintval */
148 unsigned int arg = 1000;
150 opt_register_arg("-a", opt_set_uintval, NULL, &arg, "All");
151 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
153 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
154 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
156 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
157 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
158 if (ULONG_MAX == UINT_MAX) {
159 pass("Can't test overflow");
160 pass("Can't test error message");
163 sprintf(buf, "%lu", ULONG_MAX);
164 ok1(!parse_args(&argc, &argv, "-a", buf, NULL));
165 ok1(strstr(err_output, ": -a: value '")
166 && strstr(err_output, buf)
167 && strstr(err_output, "' does not fit into an integer"));
170 /* opt_set_longval */
174 opt_register_arg("-a", opt_set_longval, NULL, &arg, "All");
175 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
177 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
179 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
181 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
182 if (sizeof(long) == 4)
183 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
184 else if (sizeof(long)== 8)
185 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
187 fail("FIXME: Handle other long sizes");
189 /* opt_set_ulongval */
191 unsigned long int arg = 1000;
193 opt_register_arg("-a", opt_set_ulongval, NULL, &arg, "All");
194 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
196 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
197 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
199 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
200 if (sizeof(long) == 4)
201 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
202 else if (sizeof(long)== 8)
203 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
205 fail("FIXME: Handle other long sizes");
209 const long long k = 1024;
210 const long long M = k * k;
211 const long long G = k * k * k;
212 const long long T = k * k * k * k;
213 const long long P = k * k * k * k * k;
214 const long long E = k * k * k * k * k * k;
216 /* opt_set_uintval_bi */
218 unsigned int arg = 1000;
220 opt_register_arg("-a", opt_set_uintval_bi, NULL,
222 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
224 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
225 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
228 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
231 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
233 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
234 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
236 ok1(!parse_args(&argc, &argv, "-a", "-1K", NULL));
239 /* opt_set_intval_bi */
243 opt_register_arg("-a", opt_set_intval_bi, NULL,
245 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
247 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
249 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
252 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
255 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
257 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
258 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
260 ok1(parse_args(&argc, &argv, "-a", "-1K", NULL));
265 /* opt_set_ulongval_bi */
267 unsigned long int arg = 1000;
270 opt_register_arg("-a", opt_set_ulongval_bi, NULL,
272 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
274 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
275 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
278 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
280 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
281 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
283 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
285 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
287 /*note, 2999M > max signed 32 bit long, 1 << 31*/
288 ok1(parse_args(&argc, &argv, "-a", "2999m", NULL));
289 ok1(arg == 2999 * M);
290 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
292 ok1(!parse_args(&argc, &argv, "-a", "-1G", NULL));
293 if (sizeof(long) == 4){
294 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
295 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
296 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
298 else if (sizeof(long) == 8){
299 ok1(!parse_args(&argc, &argv, "-a",
300 "18446744073709551616", NULL));
301 ok1(!parse_args(&argc, &argv, "-a", "8E", NULL));
302 ok1(parse_args(&argc, &argv, "-a", "3E", NULL));
305 fail("FIXME: Handle other long sizes");
308 /* opt_set_longval_bi */
313 opt_register_arg("-a", opt_set_longval_bi, NULL,
315 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
317 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
319 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
321 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
322 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
323 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
325 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
326 ok1(arg == -100 * k);
327 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
329 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
331 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
333 ok1(parse_args(&argc, &argv, "-a", "-1G", NULL));
335 if (sizeof(long) == 4){
336 ok1(!parse_args(&argc, &argv, "-a", "2147483648", NULL));
337 ok1(!parse_args(&argc, &argv, "-a", "2G", NULL));
338 ok1(!parse_args(&argc, &argv, "-a", "2048m", NULL));
339 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
340 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
342 else if (sizeof(long) == 8){
343 ok1(!parse_args(&argc, &argv, "-a",
344 "9223372036854775808", NULL));
345 ok1(parse_args(&argc, &argv, "-a", "3E", NULL));
347 ok1(parse_args(&argc, &argv, "-a", "123T", NULL));
351 fail("FIXME: Handle other long sizes");
355 /* opt_set_longlongval_bi */
357 long long int arg = 1000;
359 opt_register_arg("-a", opt_set_longlongval_bi, NULL,
361 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
363 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
365 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
367 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
368 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
369 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
370 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
372 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
373 ok1(arg == -100 * k);
374 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
376 ok1(parse_args(&argc, &argv, "-a", "-333333M", NULL));
377 ok1(arg == -333333 * M);
378 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
380 ok1(parse_args(&argc, &argv, "-a", "1024t", NULL));
381 ok1(arg == 1024 * T);
382 ok1(parse_args(&argc, &argv, "-a", "123P", NULL));
384 ok1(parse_args(&argc, &argv, "-a", "-3E", NULL));
387 if (sizeof(long long) == 8){
388 ok1(!parse_args(&argc, &argv, "-a",
389 "9223372036854775808", NULL));
390 /*8E and 922337.. are both 1 << 63*/
391 ok1(!parse_args(&argc, &argv, "-a", "8E", NULL));
394 fail("FIXME: Handle other long long int"
395 " sizes (specifically %zu bytes)",
398 /* opt_set_ulonglongval_bi */
400 unsigned long long int arg = 1000;
402 opt_register_arg("-a", opt_set_ulonglongval_bi, NULL,
404 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
406 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
407 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
409 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
410 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
411 ok1(parse_args(&argc, &argv, "-a", "100G", NULL));
413 ok1(!parse_args(&argc, &argv, "-a", "-100G", NULL));
414 ok1(parse_args(&argc, &argv, "-a", "8191P", NULL));
415 ok1(arg == 8191 * P);
418 /* opt_show_intval_bi */
421 char buf[OPT_SHOW_LEN+2] = { 0 };
422 buf[OPT_SHOW_LEN] = '!';
424 opt_show_intval_bi(buf, &i);
425 ok1(strcmp(buf, "-77") == 0);
427 opt_show_intval_bi(buf, &i);
428 ok1(strcmp(buf, "0") == 0);
429 ok1(buf[OPT_SHOW_LEN] == '!');
431 opt_show_intval_bi(buf, &i);
432 ok1(strcmp(buf, "77") == 0);
433 ok1(buf[OPT_SHOW_LEN] == '!');
435 opt_show_intval_bi(buf, &i);
436 ok1(strcmp(buf, "-1234k") == 0);
437 ok1(buf[OPT_SHOW_LEN] == '!');
439 opt_show_intval_bi(buf, &i);
440 ok1(strcmp(buf, "500M") == 0);
441 ok1(buf[OPT_SHOW_LEN] == '!');
443 opt_show_intval_bi(buf, &i);
444 ok1(strcmp(buf, "1G") == 0);
445 ok1(buf[OPT_SHOW_LEN] == '!');
448 /* opt_show_longval_bi */
451 char buf[OPT_SHOW_LEN+2] = { 0 };
452 buf[OPT_SHOW_LEN] = '!';
454 opt_show_longval_bi(buf, &i);
455 ok1(strcmp(buf, "-77") == 0);
456 ok1(buf[OPT_SHOW_LEN] == '!');
458 opt_show_longval_bi(buf, &i);
459 ok1(strcmp(buf, "77") == 0);
460 ok1(buf[OPT_SHOW_LEN] == '!');
462 opt_show_longval_bi(buf, &i);
463 ok1(strcmp(buf, "-1k") == 0);
464 ok1(buf[OPT_SHOW_LEN] == '!');
466 opt_show_longval_bi(buf, &i);
467 ok1(strcmp(buf, "500M") == 0);
468 ok1(buf[OPT_SHOW_LEN] == '!');
470 opt_show_longval_bi(buf, &i);
471 ok1(strcmp(buf, "1G") == 0);
472 ok1(buf[OPT_SHOW_LEN] == '!');
474 opt_show_longval_bi(buf, &i);
475 ok1(strcmp(buf, "0") == 0);
476 ok1(buf[OPT_SHOW_LEN] == '!');
479 /* opt_show_llongval_bi */
482 char buf[OPT_SHOW_LEN+2] = { 0 };
483 buf[OPT_SHOW_LEN] = '!';
485 opt_show_longlongval_bi(buf, &i);
486 ok1(strcmp(buf, "-7777") == 0);
487 ok1(buf[OPT_SHOW_LEN] == '!');
489 opt_show_longlongval_bi(buf, &i);
490 ok1(strcmp(buf, "7777") == 0);
491 ok1(buf[OPT_SHOW_LEN] == '!');
493 opt_show_longlongval_bi(buf, &i);
494 ok1(strcmp(buf, "-10000M") == 0);
495 ok1(buf[OPT_SHOW_LEN] == '!');
497 opt_show_longlongval_bi(buf, &i);
498 ok1(strcmp(buf, "5P") == 0);
499 ok1(buf[OPT_SHOW_LEN] == '!');
501 opt_show_longlongval_bi(buf, &i);
502 ok1(strcmp(buf, "1E") == 0);
503 ok1(buf[OPT_SHOW_LEN] == '!');
506 /* opt_show_uintval_bi */
509 char buf[OPT_SHOW_LEN+2] = { 0 };
510 buf[OPT_SHOW_LEN] = '!';
512 opt_show_uintval_bi(buf, &i);
513 ok1(strcmp(buf, "77") == 0);
514 ok1(buf[OPT_SHOW_LEN] == '!');
516 opt_show_uintval_bi(buf, &i);
517 ok1(strcmp(buf, "1234k") == 0);
518 ok1(buf[OPT_SHOW_LEN] == '!');
520 opt_show_uintval_bi(buf, &i);
521 ok1(strcmp(buf, "500M") == 0);
522 ok1(buf[OPT_SHOW_LEN] == '!');
524 opt_show_uintval_bi(buf, &i);
525 ok1(strcmp(buf, "1G") == 0);
526 ok1(buf[OPT_SHOW_LEN] == '!');
529 /* opt_show_ulongval_bi */
532 char buf[OPT_SHOW_LEN+2] = { 0 };
533 buf[OPT_SHOW_LEN] = '!';
535 opt_show_ulongval_bi(buf, &i);
536 ok1(strcmp(buf, "77") == 0);
537 ok1(buf[OPT_SHOW_LEN] == '!');
539 opt_show_ulongval_bi(buf, &i);
540 ok1(strcmp(buf, "1k") == 0);
541 ok1(buf[OPT_SHOW_LEN] == '!');
543 opt_show_ulongval_bi(buf, &i);
544 ok1(strcmp(buf, "500M") == 0);
545 ok1(buf[OPT_SHOW_LEN] == '!');
547 opt_show_ulongval_bi(buf, &i);
548 ok1(strcmp(buf, "1G") == 0);
549 ok1(buf[OPT_SHOW_LEN] == '!');
551 opt_show_ulongval_bi(buf, &i);
552 ok1(strcmp(buf, "0") == 0);
553 ok1(buf[OPT_SHOW_LEN] == '!');
556 /* opt_show_ullongval_bi */
559 char buf[OPT_SHOW_LEN+2] = { 0 };
560 buf[OPT_SHOW_LEN] = '!';
562 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
563 ok1(strcmp(buf, "7777") == 0);
564 ok1(buf[OPT_SHOW_LEN] == '!');
566 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
567 ok1(strcmp(buf, "10000M") == 0);
568 ok1(buf[OPT_SHOW_LEN] == '!');
570 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
571 ok1(strcmp(buf, "5P") == 0);
572 ok1(buf[OPT_SHOW_LEN] == '!');
574 opt_show_ulonglongval_bi(buf, (unsigned long long *)&i);
575 ok1(strcmp(buf, "1E") == 0);
576 ok1(buf[OPT_SHOW_LEN] == '!');
581 const long long k = 1000;
582 const long long M = k * k;
583 const long long G = k * k * k;
584 const long long T = k * k * k * k;
585 const long long P = k * k * k * k * k;
586 const long long E = k * k * k * k * k * k;
588 /* opt_set_uintval_si */
590 unsigned int arg = 1000;
592 opt_register_arg("-a", opt_set_uintval_si, NULL,
594 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
596 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
597 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
600 ok1(parse_args(&argc, &argv, "-a", "0k", NULL));
603 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
605 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
606 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
608 ok1(!parse_args(&argc, &argv, "-a", "-1K", NULL));
609 if (sizeof(unsigned int) < 8)
610 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
612 pass("can't test int truncation when int is so huge");
615 /* opt_set_intval_si */
619 opt_register_arg("-a", opt_set_intval_si, NULL,
621 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
623 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", "", NULL));
634 ok1(!parse_args(&argc, &argv, "-a", "3Q", NULL));
635 ok1(parse_args(&argc, &argv, "-a", "30k", NULL));
637 ok1(parse_args(&argc, &argv, "-a", "-1K", NULL));
640 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
642 pass("can't test int truncation when int is so huge");
646 /* opt_set_ulongval_si */
648 unsigned long int arg = 1000;
651 opt_register_arg("-a", opt_set_ulongval_si, NULL,
653 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
655 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
656 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
658 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
659 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
660 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
662 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
664 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
666 /*note, 2999M > max signed 32 bit long, 1 << 31*/
667 ok1(parse_args(&argc, &argv, "-a", "2999m", NULL));
668 ok1(arg == 2999 * M);
669 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
671 ok1(!parse_args(&argc, &argv, "-a", "-1G", NULL));
672 ok1(parse_args(&argc, &argv, "-a", "4G", NULL));
673 ok1(arg == 4000000000U);
674 if (sizeof(long) == 4){
675 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
676 ok1(!parse_args(&argc, &argv, "-a", "4295M", NULL));
677 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
678 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
680 else if (sizeof(long)== 8){
681 ok1(!parse_args(&argc, &argv, "-a",
682 "18446744073709551616", NULL));
683 ok1(parse_args(&argc, &argv, "-a", "9E", NULL));
684 ok1(arg == 9000000000000000000ULL);
685 ok1(!parse_args(&argc, &argv, "-a", "19E", NULL));
688 fail("FIXME: Handle other long sizes");
691 /* opt_set_longval_si */
696 opt_register_arg("-a", opt_set_longval_si, NULL,
698 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
700 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
702 ok1(parse_args(&argc, &argv, "-a", "0P", NULL));
704 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
705 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
706 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
708 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
709 ok1(arg == -100 * k);
710 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
712 ok1(parse_args(&argc, &argv, "-a", "99M", NULL));
714 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
716 ok1(parse_args(&argc, &argv, "-a", "-1G", NULL));
718 if (sizeof(long) == 4){
719 ok1(!parse_args(&argc, &argv, "-a", "2147483648", NULL));
720 ok1(!parse_args(&argc, &argv, "-a", "4G", NULL));
721 ok1(!parse_args(&argc, &argv, "-a", "1T", NULL));
722 ok1(!parse_args(&argc, &argv, "-a", "1E", NULL));
723 ok1(parse_args(&argc, &argv, "-a", "1999m", NULL));
724 ok1(arg == 1999 * M);
726 else if (sizeof(long)== 8){
727 ok1(!parse_args(&argc, &argv, "-a",
728 "9223372036854775808", NULL));
729 ok1(!parse_args(&argc, &argv, "-a", "9224P", NULL));
730 ok1(parse_args(&argc, &argv, "-a", "9E", NULL));
732 ok1(parse_args(&argc, &argv, "-a", "123T", NULL));
736 fail("FIXME: Handle other long sizes");
740 /* opt_set_longlongval_si */
742 long long int arg = 1000;
744 opt_register_arg("-a", opt_set_longlongval_si, NULL,
746 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
748 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
750 ok1(parse_args(&argc, &argv, "-a", "0T", NULL));
752 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
753 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
754 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
755 ok1(parse_args(&argc, &argv, "-a", "100k", NULL));
757 ok1(parse_args(&argc, &argv, "-a", "-100k", NULL));
758 ok1(arg == -100 * k);
759 ok1(parse_args(&argc, &argv, "-a", "1K", NULL));
761 ok1(parse_args(&argc, &argv, "-a", "-333333M", NULL));
762 ok1(arg == -333333 * M);
763 ok1(parse_args(&argc, &argv, "-a", "1G", NULL));
765 ok1(parse_args(&argc, &argv, "-a", "1024t", NULL));
766 ok1(arg == 1024 * T);
767 ok1(parse_args(&argc, &argv, "-a", "123P", NULL));
769 ok1(parse_args(&argc, &argv, "-a", "-3E", NULL));
771 ok1(parse_args(&argc, &argv, "-a", "8E", NULL));
772 if (sizeof(long long) == 8){
773 ok1(!parse_args(&argc, &argv, "-a",
774 "9223372036854775808", NULL));
775 ok1(!parse_args(&argc, &argv, "-a",
779 fail("FIXME: Handle other long long int"
780 " sizes (specifically %zu bytes)",
784 /* opt_set_ulonglongval_si */
786 unsigned long long int arg = 1000;
788 opt_register_arg("-a", opt_set_ulonglongval_si, NULL,
790 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
792 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
793 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
795 ok1(!parse_args(&argc, &argv, "-a", "1Q", NULL));
796 ok1(!parse_args(&argc, &argv, "-a", "1kk", NULL));
797 ok1(parse_args(&argc, &argv, "-a", "100G", NULL));
799 ok1(!parse_args(&argc, &argv, "-a", "-100G", NULL));
800 ok1(parse_args(&argc, &argv, "-a", "8E", NULL));
802 /* opt_show_intval_si */
805 char buf[OPT_SHOW_LEN+2] = { 0 };
806 buf[OPT_SHOW_LEN] = '!';
808 opt_show_intval_si(buf, &i);
809 ok1(strcmp(buf, "-77") == 0);
811 opt_show_intval_si(buf, &i);
812 ok1(strcmp(buf, "0") == 0);
813 ok1(buf[OPT_SHOW_LEN] == '!');
815 opt_show_intval_si(buf, &i);
816 ok1(strcmp(buf, "77") == 0);
817 ok1(buf[OPT_SHOW_LEN] == '!');
819 opt_show_intval_si(buf, &i);
820 ok1(strcmp(buf, "-1234k") == 0);
821 ok1(buf[OPT_SHOW_LEN] == '!');
823 opt_show_intval_si(buf, &i);
824 ok1(strcmp(buf, "500M") == 0);
825 ok1(buf[OPT_SHOW_LEN] == '!');
827 opt_show_intval_si(buf, &i);
828 ok1(strcmp(buf, "1G") == 0);
829 ok1(buf[OPT_SHOW_LEN] == '!');
832 /* opt_show_longval_si */
835 char buf[OPT_SHOW_LEN+2] = { 0 };
836 buf[OPT_SHOW_LEN] = '!';
838 opt_show_longval_si(buf, &i);
839 ok1(strcmp(buf, "-77") == 0);
840 ok1(buf[OPT_SHOW_LEN] == '!');
842 opt_show_longval_si(buf, &i);
843 ok1(strcmp(buf, "77") == 0);
844 ok1(buf[OPT_SHOW_LEN] == '!');
846 opt_show_longval_si(buf, &i);
847 ok1(strcmp(buf, "-1k") == 0);
848 ok1(buf[OPT_SHOW_LEN] == '!');
850 opt_show_longval_si(buf, &i);
851 ok1(strcmp(buf, "500M") == 0);
852 ok1(buf[OPT_SHOW_LEN] == '!');
854 opt_show_longval_si(buf, &i);
855 ok1(strcmp(buf, "1G") == 0);
856 ok1(buf[OPT_SHOW_LEN] == '!');
858 opt_show_longval_si(buf, &i);
859 ok1(strcmp(buf, "0") == 0);
860 ok1(buf[OPT_SHOW_LEN] == '!');
863 /* opt_show_llongval_si */
866 char buf[OPT_SHOW_LEN+2] = { 0 };
867 buf[OPT_SHOW_LEN] = '!';
869 opt_show_longlongval_si(buf, &i);
870 ok1(strcmp(buf, "-7777") == 0);
871 ok1(buf[OPT_SHOW_LEN] == '!');
873 opt_show_longlongval_si(buf, &i);
874 ok1(strcmp(buf, "7777") == 0);
875 ok1(buf[OPT_SHOW_LEN] == '!');
877 opt_show_longlongval_si(buf, &i);
878 ok1(strcmp(buf, "-10240M") == 0);
879 ok1(buf[OPT_SHOW_LEN] == '!');
881 opt_show_longlongval_si(buf, &i);
882 ok1(strcmp(buf, "5P") == 0);
883 ok1(buf[OPT_SHOW_LEN] == '!');
885 opt_show_longlongval_si(buf, &i);
886 ok1(strcmp(buf, "2E") == 0);
887 ok1(buf[OPT_SHOW_LEN] == '!');
890 /* opt_show_uintval_si */
893 char buf[OPT_SHOW_LEN+2] = { 0 };
894 buf[OPT_SHOW_LEN] = '!';
896 opt_show_uintval_si(buf, &i);
897 ok1(strcmp(buf, "77") == 0);
898 ok1(buf[OPT_SHOW_LEN] == '!');
900 opt_show_uintval_si(buf, &i);
901 ok1(strcmp(buf, "1234k") == 0);
902 ok1(buf[OPT_SHOW_LEN] == '!');
904 opt_show_uintval_si(buf, &i);
905 ok1(strcmp(buf, "500M") == 0);
906 ok1(buf[OPT_SHOW_LEN] == '!');
908 opt_show_uintval_si(buf, &i);
909 ok1(strcmp(buf, "1G") == 0);
910 ok1(buf[OPT_SHOW_LEN] == '!');
913 /* opt_show_ulongval_si */
916 char buf[OPT_SHOW_LEN+2] = { 0 };
917 buf[OPT_SHOW_LEN] = '!';
919 opt_show_ulongval_si(buf, &i);
920 ok1(strcmp(buf, "77") == 0);
921 ok1(buf[OPT_SHOW_LEN] == '!');
923 opt_show_ulongval_si(buf, &i);
924 ok1(strcmp(buf, "1k") == 0);
925 ok1(buf[OPT_SHOW_LEN] == '!');
927 opt_show_ulongval_si(buf, &i);
928 ok1(strcmp(buf, "500M") == 0);
929 ok1(buf[OPT_SHOW_LEN] == '!');
931 opt_show_ulongval_si(buf, &i);
932 ok1(strcmp(buf, "1024M") == 0);
933 ok1(buf[OPT_SHOW_LEN] == '!');
935 opt_show_ulongval_si(buf, &i);
936 ok1(strcmp(buf, "0") == 0);
937 ok1(buf[OPT_SHOW_LEN] == '!');
940 /* opt_show_ullongval_si */
943 char buf[OPT_SHOW_LEN+2] = { 0 };
944 buf[OPT_SHOW_LEN] = '!';
946 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
947 ok1(strcmp(buf, "7777") == 0);
948 ok1(buf[OPT_SHOW_LEN] == '!');
950 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
951 ok1(strcmp(buf, "10240M") == 0);
952 ok1(buf[OPT_SHOW_LEN] == '!');
954 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
955 ok1(strcmp(buf, "5P") == 0);
956 ok1(buf[OPT_SHOW_LEN] == '!');
958 opt_show_ulonglongval_si(buf, (unsigned long long *)&i);
959 ok1(strcmp(buf, "1E") == 0);
960 ok1(buf[OPT_SHOW_LEN] == '!');
970 opt_register_noarg("-a", opt_inc_intval, &arg, "");
971 ok1(parse_args(&argc, &argv, "-a", NULL));
973 ok1(parse_args(&argc, &argv, "-a", "-a", NULL));
975 ok1(parse_args(&argc, &argv, "-aa", NULL));
979 /* opt_show_version_and_exit. */
983 opt_register_noarg("-a",
984 opt_version_and_exit, "1.2.3", "");
985 /* parse_args allocates argv */
989 argv = malloc(sizeof(argv[0]) * 3);
990 argv[0] = (char *)"thisprog";
991 argv[1] = (char *)"-a";
994 exitval = setjmp(exited);
996 opt_parse(&argc, argv, save_err_output);
997 fail("opt_show_version_and_exit returned?");
999 ok1(exitval - 1 == 0);
1001 ok1(strcmp(output, "1.2.3\n") == 0);
1007 /* opt_usage_and_exit. */
1011 opt_register_noarg("-a",
1012 opt_usage_and_exit, "[args]", "");
1015 argv = malloc(sizeof(argv[0]) * 3);
1016 argv[0] = (char *)"thisprog";
1017 argv[1] = (char *)"-a";
1020 exitval = setjmp(exited);
1022 opt_parse(&argc, argv, save_err_output);
1023 fail("opt_usage_and_exit returned?");
1025 ok1(exitval - 1 == 0);
1027 ok1(strstr(output, "[args]"));
1028 ok1(strstr(output, argv[0]));
1029 ok1(strstr(output, "[-a]"));
1032 /* It exits without freeing usage string. */
1033 free(last_allocation);
1040 char buf[OPT_SHOW_LEN+2] = { 0 };
1041 buf[OPT_SHOW_LEN] = '!';
1044 opt_show_bool(buf, &b);
1045 ok1(strcmp(buf, "true") == 0);
1046 ok1(buf[OPT_SHOW_LEN] == '!');
1049 opt_show_bool(buf, &b);
1050 ok1(strcmp(buf, "false") == 0);
1051 ok1(buf[OPT_SHOW_LEN] == '!');
1054 /* opt_show_invbool */
1057 char buf[OPT_SHOW_LEN+2] = { 0 };
1058 buf[OPT_SHOW_LEN] = '!';
1061 opt_show_invbool(buf, &b);
1062 ok1(strcmp(buf, "false") == 0);
1063 ok1(buf[OPT_SHOW_LEN] == '!');
1066 opt_show_invbool(buf, &b);
1067 ok1(strcmp(buf, "true") == 0);
1068 ok1(buf[OPT_SHOW_LEN] == '!');
1071 /* opt_show_charp */
1073 char str[OPT_SHOW_LEN*2], *p;
1074 char buf[OPT_SHOW_LEN+2] = { 0 };
1075 buf[OPT_SHOW_LEN] = '!';
1080 opt_show_charp(buf, &p);
1081 ok1(strcmp(buf, "\"short\"") == 0);
1082 ok1(buf[OPT_SHOW_LEN] == '!');
1084 /* Truncate test. */
1085 memset(p, 'x', OPT_SHOW_LEN*2);
1086 p[OPT_SHOW_LEN*2-1] = '\0';
1087 opt_show_charp(buf, &p);
1089 ok1(buf[OPT_SHOW_LEN-1] == '"');
1090 ok1(buf[OPT_SHOW_LEN] == '!');
1091 ok1(strspn(buf+1, "x") == OPT_SHOW_LEN-2);
1094 /* opt_show_intval */
1097 char buf[OPT_SHOW_LEN+2] = { 0 };
1098 buf[OPT_SHOW_LEN] = '!';
1101 opt_show_intval(buf, &i);
1102 ok1(strcmp(buf, "-77") == 0);
1103 ok1(buf[OPT_SHOW_LEN] == '!');
1106 opt_show_intval(buf, &i);
1107 ok1(strcmp(buf, "77") == 0);
1108 ok1(buf[OPT_SHOW_LEN] == '!');
1111 /* opt_show_uintval */
1114 char buf[OPT_SHOW_LEN+2] = { 0 };
1115 buf[OPT_SHOW_LEN] = '!';
1118 opt_show_uintval(buf, &ui);
1119 ok1(strcmp(buf, "4294967295") == 0);
1120 ok1(buf[OPT_SHOW_LEN] == '!');
1123 /* opt_show_longval */
1126 char buf[OPT_SHOW_LEN+2] = { 0 };
1127 buf[OPT_SHOW_LEN] = '!';
1130 opt_show_longval(buf, &l);
1131 ok1(strcmp(buf, "1234567890") == 0);
1132 ok1(buf[OPT_SHOW_LEN] == '!');
1135 /* opt_show_ulongval */
1138 char buf[OPT_SHOW_LEN+2] = { 0 };
1139 buf[OPT_SHOW_LEN] = '!';
1142 opt_show_ulongval(buf, &ul);
1143 ok1(strcmp(buf, "4294967295") == 0);
1144 ok1(buf[OPT_SHOW_LEN] == '!');
1147 /* opt_log_stderr. */
1150 opt_register_noarg("-a",
1151 opt_usage_and_exit, "[args]", "");
1154 argv = malloc(sizeof(argv[0]) * 3);
1155 argv[0] = (char *)"thisprog";
1156 argv[1] = (char *)"--garbage";
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]", "");
1173 argv = malloc(sizeof(argv[0]) * 3);
1174 argv[0] = (char *)"thisprog";
1175 argv[1] = (char *)"--garbage";
1177 exitval = setjmp(exited);
1179 opt_parse(&argc, argv, opt_log_stderr_exit);
1180 fail("opt_log_stderr_exit returned?");
1182 ok1(exitval - 1 == 1);
1186 "thisprog: --garbage: unrecognized option\n"));
1191 //diag("%s\n", err_output);
1192 return exit_status();