+/*----- Option parsing ----------------------------------------------------*/
+
+#define OPTIONS(argc, argv, guts) do { \
+ char **o_av = argv; \
+ for (;; o_av++) { \
+ if (!*o_av) \
+ break; \
+ if (mystrieq(*o_av, "--")) { \
+ o_av++; \
+ break; \
+ } \
+ guts \
+ if (**o_av == '-') \
+ goto bad_syntax; \
+ break; \
+ } \
+ argc -= o_av - argv; \
+ argv = o_av; \
+} while (0)
+
+#define OPT(name, guts) if (mystrieq(*o_av, name)) { guts continue; }
+
+#define OPTARG(name, arg, guts) OPT(name, { \
+ const char *arg; \
+ arg = *++o_av; \
+ if (!arg) goto bad_syntax; \
+ guts \
+})
+
+#define OPTTIME(name, arg, guts) OPTARG(name, o_arg, { \
+ long arg; \
+ if ((arg = a_parsetime(o_arg)) < 0) { \
+ a_fail(a, "bad-time-spec", "%s", o_arg, A_END); \
+ goto fail; \
+ } \
+ guts \
+})
+