#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
-#include <err.h>
#include <assert.h>
#include <stdarg.h>
#include <stdint.h>
return p;
}
+/* Avoids dependency on err.h or ccan/err */
+#ifndef failmsg
+#define failmsg(fmt, ...) \
+ do { fprintf(stderr, fmt, __VA_ARGS__); exit(1); } while(0)
+#endif
+
static void check_opt(const struct opt_table *entry)
{
const char *p;
if (entry->type != OPT_HASARG && entry->type != OPT_NOARG
&& entry->type != (OPT_EARLY|OPT_HASARG)
&& entry->type != (OPT_EARLY|OPT_NOARG))
- errx(1, "Option %s: unknown entry type %u",
- entry->names, entry->type);
+ failmsg("Option %s: unknown entry type %u",
+ entry->names, entry->type);
if (!entry->desc)
- errx(1, "Option %s: description cannot be NULL", entry->names);
+ failmsg("Option %s: description cannot be NULL", entry->names);
if (entry->names[0] != '-')
- errx(1, "Option %s: does not begin with '-'", entry->names);
+ failmsg("Option %s: does not begin with '-'", entry->names);
for (p = first_name(entry->names, &len); p; p = next_name(p, &len)) {
if (*p == '-') {
if (len == 1)
- errx(1, "Option %s: invalid long option '--'",
- entry->names);
+ failmsg("Option %s: invalid long option '--'",
+ entry->names);
opt_num_long++;
} else {
if (len != 1)
- errx(1, "Option %s: invalid short option"
- " '%.*s'", entry->names, len+1, p-1);
+ failmsg("Option %s: invalid short option"
+ " '%.*s'", entry->names, len+1, p-1);
opt_num_short++;
if (entry->type == OPT_HASARG)
opt_num_short_arg++;
/* Don't document args unless there are some. */
if (entry->type == OPT_NOARG) {
if (p[len] == ' ' || p[len] == '=')
- errx(1, "Option %s: does not take arguments"
- " '%s'", entry->names, p+len+1);
+ failmsg("Option %s: does not take arguments"
+ " '%s'", entry->names, p+len+1);
}
}
}
/* We don't actually want it to exit... */
static jmp_buf exited;
-#define errx save_and_jump
+#define failmsg save_and_jump
-static void save_and_jump(int ecode, const char *fmt, ...);
+static void save_and_jump(const char *fmt, ...);
#include <ccan/opt/helpers.c>
#include <ccan/opt/opt.c>
return ret;
}
-static void save_and_jump(int ecode, const char *fmt, ...)
+static void save_and_jump(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
saved_vprintf(fmt, ap);
va_end(ap);
- longjmp(exited, ecode + 1);
+ longjmp(exited, 1);
}
static void reset(void)
NULL, NULL, "1.2.3", "");
fail("_opt_register returned?");
} else {
- ok1(exitval - 1 == 1);
+ ok1(exitval == 1);
ok1(strstr(output, "Option -a: unknown entry type"));
}
reset();
opt_register_noarg("-a", test_noarg, "", NULL);
fail("_opt_register returned?");
} else {
- ok1(exitval - 1 == 1);
+ ok1(exitval == 1);
ok1(strstr(output, "Option -a: description cannot be NULL"));
}
reset();
opt_register_noarg("a", test_noarg, "", "");
fail("_opt_register returned?");
} else {
- ok1(exitval - 1 == 1);
+ ok1(exitval == 1);
ok1(strstr(output, "Option a: does not begin with '-'"));
}
opt_register_noarg("--", test_noarg, "", "");
fail("_opt_register returned?");
} else {
- ok1(exitval - 1 == 1);
+ ok1(exitval == 1);
ok1(strstr(output, "Option --: invalid long option '--'"));
}
opt_register_noarg("--a|-aaa", test_noarg, "", "");
fail("_opt_register returned?");
} else {
- ok1(exitval - 1 == 1);
+ ok1(exitval == 1);
ok1(strstr(output,
"Option --a|-aaa: invalid short option '-aaa'"));
}
opt_register_noarg("--a foo", test_noarg, "", "");
fail("_opt_register returned?");
} else {
- ok1(exitval - 1 == 1);
+ ok1(exitval == 1);
ok1(strstr(output,
"Option --a foo: does not take arguments 'foo'"));
}
opt_register_noarg("--a=foo", test_noarg, "", "");
fail("_opt_register returned?");
} else {
- ok1(exitval - 1 == 1);
+ ok1(exitval == 1);
ok1(strstr(output,
"Option --a=foo: does not take arguments 'foo'"));
}