X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/runlisp/blobdiff_plain/6df280cddef4ab6cf14d7ec135c719e6c7d27040..5910232a336e0fa2c32bb1a00c8b69e54995d863:/lib.c diff --git a/lib.c b/lib.c index d369e7d..f0fb6e2 100644 --- a/lib.c +++ b/lib.c @@ -232,19 +232,21 @@ PRINTF_LIKE(2, 3) void dstr_putf(struct dstr *d, const char *p, ...) */ int dstr_readline(struct dstr *d, FILE *fp) { + char *p = d->p + d->len, *lim = d->p + d->sz; size_t n; - int any = 0; + int ch; + ch = getc(fp); if (ch == EOF) return (-1); for (;;) { - dstr_ensure(d, 2); - if (!fgets(d->p + d->len, d->sz - d->len, fp)) break; - n = strlen(d->p + d->len); assert(n > 0); any = 1; - d->len += n; - if (d->p[d->len - 1] == '\n') { d->p[--d->len] = 0; break; } + if (p == lim) { + n = d->len = p - d->p; dstr_ensure(d, 1); + p = d->p + n; lim = d->p + d->sz; + } + if (ch == EOF || ch == '\n') break; + *p++ = ch; ch = getc(fp); } - - if (!any) return (-1); - else return (0); + d->len = p - d->p; *p++ = 0; + return (0); } /*----- Dynamic vectors of strings ----------------------------------------*/ @@ -1638,7 +1640,7 @@ static const char *subst(const char *p, const char *l, /* If there's an alternative, then we need to process (or maybe * skip) it. Otherwise, we should complain if there was no - * veriable, and we're not skipping. + * variable, and we're not skipping. */ if (p < l && *p == '?') p = subst(p + 1, l, sb, file, line, subqfilt,