chiark / gitweb /
runlisp.conf.5.in: Fix end-of-sentence punctuataion.
[runlisp] / lib.c
diff --git a/lib.c b/lib.c
index d369e7d77e6c43708d30f83aa8a520d723d3c17c..f0fb6e29c0000acdea1aca9866c2700a6691ff9d 100644 (file)
--- 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)
 {
  */
 int dstr_readline(struct dstr *d, FILE *fp)
 {
+  char *p = d->p + d->len, *lim = d->p + d->sz;
   size_t n;
   size_t n;
-  int any = 0;
+  int ch;
 
 
+  ch = getc(fp); if (ch == EOF) return (-1);
   for (;;) {
   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 ----------------------------------------*/
 }
 
 /*----- 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
 
          /* 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,
           */
          if (p < l && *p == '?')
            p = subst(p + 1, l, sb, file, line, subqfilt,