3 #include <ccan/tap/tap.h>
8 /* We don't actually want it to exit... */
10 #define exit(status) longjmp(exited, (status) + 1)
12 #define printf saved_printf
13 static int saved_printf(const char *fmt, ...);
15 #include <ccan/opt/helpers.c>
16 #include <ccan/opt/opt.c>
17 #include <ccan/opt/usage.c>
19 static void reset_options(void)
23 opt_count = opt_num_short = opt_num_short_arg = opt_num_long = 0;
26 static char *output = NULL;
28 static int saved_printf(const char *fmt, ...)
35 ret = vasprintf(&p, fmt, ap);
39 output = realloc(output, strlen(output) + strlen(p) + 1);
49 int main(int argc, char *argv[])
57 opt_register_noarg("-a", opt_set_bool, &arg, NULL);
58 ok1(parse_args(&argc, &argv, "-a", NULL));
60 opt_register_arg("-b", opt_set_bool_arg, NULL, &arg, NULL);
61 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
63 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
65 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
67 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
74 opt_register_noarg("-a", opt_set_invbool, &arg, NULL);
75 ok1(parse_args(&argc, &argv, "-a", NULL));
77 opt_register_arg("-b", opt_set_invbool_arg, NULL,
79 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
81 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
83 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
85 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
90 char *arg = (char *)"wrong";
92 opt_register_arg("-a", opt_set_charp, NULL, &arg, NULL);
93 ok1(parse_args(&argc, &argv, "-a", "string", NULL));
94 ok1(strcmp(arg, "string") == 0);
100 opt_register_arg("-a", opt_set_intval, NULL, &arg, NULL);
101 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
103 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
105 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
107 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
108 if (sizeof(int) == 4)
109 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
111 fail("Handle other int sizes");
113 /* opt_set_uintval */
115 unsigned int arg = 1000;
117 opt_register_arg("-a", opt_set_uintval, NULL, &arg, NULL);
118 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
120 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
121 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
123 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
124 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
126 /* opt_set_longval */
130 opt_register_arg("-a", opt_set_longval, NULL, &arg, NULL);
131 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
133 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
135 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
137 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
138 if (sizeof(long) == 4)
139 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
140 else if (sizeof(long)== 8)
141 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
143 fail("FIXME: Handle other long sizes");
145 /* opt_set_ulongval */
147 unsigned long int arg = 1000;
149 opt_register_arg("-a", opt_set_ulongval, NULL, &arg, NULL);
150 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
152 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
153 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
155 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
156 if (sizeof(long) == 4)
157 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
158 else if (sizeof(long)== 8)
159 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
161 fail("FIXME: Handle other long sizes");
167 opt_register_noarg("-a", opt_inc_intval, &arg, NULL);
168 ok1(parse_args(&argc, &argv, "-a", NULL));
170 ok1(parse_args(&argc, &argv, "-a", "-a", NULL));
172 ok1(parse_args(&argc, &argv, "-aa", NULL));
176 /* opt_show_version_and_exit. */
180 opt_register_noarg("-a",
181 opt_version_and_exit, "1.2.3", NULL);
182 exitval = setjmp(exited);
184 parse_args(&argc, &argv, "-a", NULL);
185 fail("opt_show_version_and_exit returned?");
187 ok1(exitval - 1 == 0);
189 ok1(strcmp(output, "1.2.3\n") == 0);
194 /* opt_usage_and_exit. */
198 opt_register_noarg("-a",
199 opt_usage_and_exit, "[args]", NULL);
200 exitval = setjmp(exited);
202 parse_args(&argc, &argv, "-a", NULL);
203 fail("opt_usage_and_exit returned?");
205 ok1(exitval - 1 == 0);
207 ok1(strstr(output, "[args]"));
208 ok1(strstr(output, argv[0]));
209 ok1(strstr(output, "[-a]"));
217 char buf[OPT_SHOW_LEN+2] = { 0 };
218 buf[OPT_SHOW_LEN] = '!';
221 opt_show_bool(buf, &b);
222 ok1(strcmp(buf, "true") == 0);
223 ok1(buf[OPT_SHOW_LEN] == '!');
226 opt_show_bool(buf, &b);
227 ok1(strcmp(buf, "false") == 0);
228 ok1(buf[OPT_SHOW_LEN] == '!');
231 /* opt_show_invbool */
234 char buf[OPT_SHOW_LEN+2] = { 0 };
235 buf[OPT_SHOW_LEN] = '!';
238 opt_show_invbool(buf, &b);
239 ok1(strcmp(buf, "false") == 0);
240 ok1(buf[OPT_SHOW_LEN] == '!');
243 opt_show_invbool(buf, &b);
244 ok1(strcmp(buf, "true") == 0);
245 ok1(buf[OPT_SHOW_LEN] == '!');
250 char str[OPT_SHOW_LEN*2], *p;
251 char buf[OPT_SHOW_LEN+2] = { 0 };
252 buf[OPT_SHOW_LEN] = '!';
257 opt_show_charp(buf, &p);
258 ok1(strcmp(buf, "\"short\"") == 0);
259 ok1(buf[OPT_SHOW_LEN] == '!');
262 memset(p, 'x', OPT_SHOW_LEN*2);
263 p[OPT_SHOW_LEN*2-1] = '\0';
264 opt_show_charp(buf, &p);
266 ok1(buf[OPT_SHOW_LEN-1] == '"');
267 ok1(buf[OPT_SHOW_LEN] == '!');
268 ok1(strspn(buf+1, "x") == OPT_SHOW_LEN-2);
271 /* opt_show_intval */
274 char buf[OPT_SHOW_LEN+2] = { 0 };
275 buf[OPT_SHOW_LEN] = '!';
278 opt_show_intval(buf, &i);
279 ok1(strcmp(buf, "-77") == 0);
280 ok1(buf[OPT_SHOW_LEN] == '!');
283 opt_show_intval(buf, &i);
284 ok1(strcmp(buf, "77") == 0);
285 ok1(buf[OPT_SHOW_LEN] == '!');
288 /* opt_show_uintval */
291 char buf[OPT_SHOW_LEN+2] = { 0 };
292 buf[OPT_SHOW_LEN] = '!';
295 opt_show_uintval(buf, &ui);
296 ok1(strcmp(buf, "4294967295") == 0);
297 ok1(buf[OPT_SHOW_LEN] == '!');
300 /* opt_show_longval */
303 char buf[OPT_SHOW_LEN+2] = { 0 };
304 buf[OPT_SHOW_LEN] = '!';
307 opt_show_longval(buf, &l);
308 ok1(strcmp(buf, "1234567890") == 0);
309 ok1(buf[OPT_SHOW_LEN] == '!');
312 /* opt_show_ulongval */
315 char buf[OPT_SHOW_LEN+2] = { 0 };
316 buf[OPT_SHOW_LEN] = '!';
319 opt_show_ulongval(buf, &ul);
320 ok1(strcmp(buf, "4294967295") == 0);
321 ok1(buf[OPT_SHOW_LEN] == '!');
324 return exit_status();