+#define PRF_HYPHEN 1u
+static int parse_range(const char *p, unsigned f,
+ secaddr *start_out, secaddr *end_out)
+{
+ char *q;
+ int err, rc;
+ unsigned long start, end;
+
+ err = errno;
+
+ if (ISDIGIT(*p)) {
+ start = strtoul(p, &q, 0);
+ if (errno || start >= SECLIMIT) { rc = -1; goto end; }
+ *start_out = start; p = q;
+ } else if (!(f&PRF_HYPHEN))
+ { rc = -1; goto end; }
+ else
+ start = 0;
+
+ if (f&PRF_HYPHEN) {
+ if (*p != '-') { rc = -1; goto end; }
+ p++;
+ } else {
+ if (!ISSPACE(*p)) { rc = -1; goto end; }
+ do p++; while (ISSPACE(*p));
+ }
+
+ if (ISDIGIT(*p)) {
+ end = strtoul(p, &q, 0);
+ if (errno || end > SECLIMIT || end < start) { rc = -1; goto end; }
+ *end_out = end; p = q;
+ } else if (!(f&PRF_HYPHEN))
+ { rc = -1; goto end; }
+
+ if (!(f&PRF_HYPHEN)) while (ISSPACE(*p)) p++;
+ if (*p) { rc = -1; goto end; }
+
+ rc = 0;
+end:
+ errno = err;
+ return (rc);
+}
+