*/
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 ----------------------------------------*/
/* 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,