-struct buf {
- char *p;
- size_t n, sz;
-};
-#define BUF_INIT { 0, 0, 0 }
-#define BUF_REWIND(b) do { (b)->n = 0; } while (0)
-#define BUF_FREE(b) do { \
- buf *_b = (b); \
- free(_b->p); _b->p = 0; _b->n = _b->sz = 0; \
-} while (0)
-#define BUF_PUTC(b, ch) do { \
- struct buf *_b = (b); \
- if (_b->n >= _b->sz) { \
- _b->sz = _b->sz ? 2*_b->sz : 32; \
- _b->p = realloc(_b->p, _b->sz); \
- if (!_b->p) bail("out of memory allocating %zu bytes", _b->sz); \
- } \
- _b->p[_b->n] = (ch); \
-} while (0)
-
-static int read_line(FILE *fp, struct buf *b)
-{
- int ch;
-
- ch = getc(fp);
- if (ch == EOF)
- return (-1);
- else if (ch != '\n') do {
- BUF_PUTC(b, ch); b->n++;
- ch = getc(fp);
- } while (ch != EOF && ch != '\n');
- BUF_PUTC(b, 0);
- return (0);
-}
-
-#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 && ((f&PRF_HYPHEN) || *p != '#')) { rc = -1; goto end; }
-
- rc = 0;
-end:
- errno = err;
- return (rc);
-}
-
-#ifdef DEBUG
-static void dump_eventq(const char *what)
-{
- unsigned i;
- const struct event *ev;
- char fn[MAXFNSZ];
-
- printf("\n;; event dump (%s):\n", what);
- for (i = 0; i < eventq.n; i++) {
- ev = &eventq.v[i];
- switch (ev->ev) {
- case EV_BEGIN:
- store_filename(fn, filetab.v[ev->file].id);
- printf(";; %8"PRIuSEC": begin %s\n", ev->pos, fn);
- break;
- case EV_END:
- store_filename(fn, filetab.v[ev->file].id);
- printf(";; %8"PRIuSEC": end %s\n", ev->pos, fn);
- break;
- case EV_WRITE:
- printf(";; %8"PRIuSEC": write\n", ev->pos);
- break;
- case EV_STOP:
- printf(";; %8"PRIuSEC": stop\n", ev->pos);
- break;
- default:
- printf(";; %8"PRIuSEC": ?%u\n", ev->pos, ev->ev);
- break;
- }
- }
-}
-#endif
-