1 #include <ccan/opt/opt.h>
8 /* FIXME: asprintf module? */
9 static char *arg_bad(const char *fmt, const char *arg)
11 char *str = malloc(strlen(fmt) + strlen(arg));
12 sprintf(str, fmt, arg);
16 char *opt_set_bool(bool *b)
22 char *opt_set_invbool(bool *b)
28 char *opt_set_bool_arg(const char *arg, bool *b)
30 if (!strcasecmp(arg, "yes") || !strcasecmp(arg, "true"))
31 return opt_set_bool(b);
32 if (!strcasecmp(arg, "no") || !strcasecmp(arg, "false"))
33 return opt_set_invbool(b);
35 return opt_invalid_argument(arg);
38 char *opt_set_invbool_arg(const char *arg, bool *b)
40 char *err = opt_set_bool_arg(arg, b);
48 char *opt_set_charp(const char *arg, char **p)
54 /* Set an integer value, various forms. Sets to 1 on arg == NULL. */
55 char *opt_set_intval(const char *arg, int *i)
58 char *err = opt_set_longval(arg, &l);
63 /* Beware truncation... */
65 return arg_bad("value '%s' does not fit into an integer", arg);
69 char *opt_set_uintval(const char *arg, unsigned int *ui)
72 char *err = opt_set_intval(arg, &i);
77 return arg_bad("'%s' is negative", arg);
82 char *opt_set_longval(const char *arg, long *l)
86 /* This is how the manpage says to do it. Yech. */
88 *l = strtol(arg, &endp, 0);
90 return arg_bad("'%s' is not a number", arg);
92 return arg_bad("'%s' is out of range", arg);
94 return opt_invalid_argument(arg);
98 char *opt_set_ulongval(const char *arg, unsigned long *ul)
103 err = opt_set_longval(arg, &l);
108 return arg_bad("'%s' is negative", arg);
112 char *opt_inc_intval(int *i)
118 /* Display version string. */
119 char *opt_show_version_and_exit(const char *version)
121 printf("%s\n", version);
125 char *opt_usage_and_exit(const char *extra)
127 printf("%s", opt_usage(opt_argv0, extra));