/* Licensed under GPLv3+ - see LICENSE file for details */
#include <ccan/opt/opt.h>
+#include <ccan/cast/cast.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
/* Set a char *. */
char *opt_set_charp(const char *arg, char **p)
{
- *p = (char *)arg;
+ *p = cast_const(char *, arg);
return NULL;
}
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! */
+ free(usage);
+ opt_free_table();
exit(0);
}
return err;
*l = ll;
- if (*l != ll)
+ /* Beware truncation, but don't generate untestable code. */
+ if (sizeof(*l) != sizeof(ll) && *l != ll)
return arg_bad("value '%s' does not fit into a long", arg);
return NULL;
}
if (ll < 0)
return arg_bad("'%s' is negative but destination is unsigned", arg);
*ul = ll;
- if (*ul != ll)
+ /* Beware truncation, but don't generate untestable code. */
+ if (sizeof(*ul) != sizeof(ll) && *ul != ll)
return arg_bad("value '%s' does not fit into an unsigned long", arg);
return NULL;
}