-/* Licensed under GPLv3+ - see LICENSE file for details */
+/* Licensed under GPLv2+ - see LICENSE file for details */
#include <ccan/opt/opt.h>
+#include <ccan/cast/cast.h>
+#include <inttypes.h>
#include <string.h>
+#include <stdint.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
/* Set a char *. */
char *opt_set_charp(const char *arg, char **p)
{
- *p = (char *)arg;
+ *p = cast_const(char *, arg);
return NULL;
}
return NULL;
}
+char *opt_set_floatval(const char *arg, float *f)
+{
+ double d;
+ char *err;
+
+ err = opt_set_doubleval(arg, &d);
+ if (err)
+ return err;
+
+ *f = d;
+ if (*f != d)
+ return arg_bad("'%s' is out of range", arg);
+
+ return NULL;
+}
+
+void opt_show_floatval(char buf[OPT_SHOW_LEN], const float *f)
+{
+ double d = *f;
+ opt_show_doubleval(buf, &d);
+}
+
+char *opt_set_doubleval(const char *arg, double *d)
+{
+ char *endp;
+
+ /* This is how the manpage says to do it. Yech. */
+ errno = 0;
+ /* Don't assume strtof */
+ *d = strtod(arg, &endp);
+ if (*endp || !arg[0])
+ return arg_bad("'%s' is not a number", arg);
+ if (errno)
+ return arg_bad("'%s' is out of range", arg);
+
+ return NULL;
+}
+
+void opt_show_doubleval(char buf[OPT_SHOW_LEN], const double *d)
+{
+ snprintf(buf, OPT_SHOW_LEN, "%f", *d);
+}
+
char *opt_inc_intval(int *i)
{
(*i)++;
char *opt_version_and_exit(const char *version)
{
printf("%s\n", version);
+ /* Don't have valgrind complain! */
+ opt_free_table();
exit(0);
}
char *opt_usage_and_exit(const char *extra)
{
- printf("%s", opt_usage(opt_argv0, extra));
+ char *usage = opt_usage(opt_argv0, extra);
+ printf("%s", usage);
+ /* Don't have valgrind complain! */
+ opt_alloc.free(usage);
+ opt_free_table();
exit(0);
}
ll = tmp;
}
if (i == 0)
- snprintf(buf, OPT_SHOW_LEN, "%lld", ll);
+ snprintf(buf, OPT_SHOW_LEN, "%"PRId64, (int64_t)ll);
else
- snprintf(buf, OPT_SHOW_LEN, "%lld%c", ll, suffixes[i - 1]);
+ snprintf(buf, OPT_SHOW_LEN, "%"PRId64"%c", (int64_t)ll, suffixes[i - 1]);
}
static void show_ullong_with_suffix(char buf[OPT_SHOW_LEN], unsigned long long ull,
ull = tmp;
}
if (i == 0)
- snprintf(buf, OPT_SHOW_LEN, "%llu", ull);
+ snprintf(buf, OPT_SHOW_LEN, "%"PRIu64, (uint64_t)ull);
else
- snprintf(buf, OPT_SHOW_LEN, "%llu%c", ull, suffixes[i - 1]);
+ snprintf(buf, OPT_SHOW_LEN, "%"PRIu64"%c", (uint64_t)ull, suffixes[i - 1]);
}
/* _bi, signed */