chiark / gitweb /
runlisp.conf.5.in: Fix end-of-sentence punctuataion.
[runlisp] / lib.c
diff --git a/lib.c b/lib.c
index e648857a9bf2e8a113c28a02891063ad1cc48655..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)
 {
+  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 ----------------------------------------*/
@@ -953,9 +955,9 @@ static void set_config_section_parents(struct config *conf,
  * Inheritance cycles and ambiguous inheritance are diagnosed as fatal
  * errors.
  */
-struct config_var *search_recursive(struct config *conf,
-                                   struct config_section *sect,
-                                   const char *name, size_t sz)
+static struct config_var *search_recursive(struct config *conf,
+                                          struct config_section *sect,
+                                          const char *name, size_t sz)
 {
   struct config_cache_entry *cache;
   struct treap_path path;
@@ -1384,7 +1386,8 @@ static const char *subst(const char *p, const char *l,
    * us which special characters we need to stop at.  This way, we can use
    * `strcspn' to skip over literal text and stop at the next character which
    * needs special handling.  Entries in this table with a null pointer
-   * correspond to impossible flag settings.
+   * correspond to impossible flag settings: notably, `SF_QUOT' can only be
+   * set when `SF_SUBST' is also set.
    */
   static const char *const delimtab[] = {
 
@@ -1396,26 +1399,27 @@ static const char *subst(const char *p, const char *l,
                                         * `SF_QUOT' */
 #define DELIM "|}"                     /* end delimiters of `SF_SUBEXPR' */
 
-    ESCAPE,
-    ESCAPE            WORDSEP,
-    0,
-    ESCAPE            QUOT,
-    ESCAPE      SUBST,
-    ESCAPE      SUBST WORDSEP,
-    0,
-    ESCAPE      SUBST QUOT,
-    ESCAPE DELIM,
-    ESCAPE DELIM       WORDSEP,
-    0,
-    ESCAPE DELIM       QUOT,
-    ESCAPE DELIM SUBST,
-    ESCAPE DELIM SUBST WORDSEP,
-    0,
-    ESCAPE DELIM SUBST QUOT
-
-#undef COMMON
+    ESCAPE,                            /* --- */
+    ESCAPE            WORDSEP,         /* SPLIT */
+    0,                                 /*         QUOT */
+    ESCAPE            QUOT,            /* SPLIT | QUOT */
+    ESCAPE      SUBST,                 /*                SUBST */
+    ESCAPE      SUBST WORDSEP,         /* SPLIT |        SUBST */
+    0,                                 /*         QUOT | SUBST */
+    ESCAPE      SUBST QUOT,            /* SPLIT | QUOT | SUBST */
+    ESCAPE DELIM,                      /*                        SUBEXPR */
+    ESCAPE DELIM       WORDSEP,                /* SPLIT |                SUBEXPR */
+    0,                                 /*         QUOT |         SUBEXPR */
+    ESCAPE DELIM       QUOT,           /* SPLIT | QUOT |         SUBEXPR */
+    ESCAPE DELIM SUBST,                        /*                SUBST | SUBEXPR */
+    ESCAPE DELIM SUBST WORDSEP,                /* SPLIT |        SUBST | SUBEXPR */
+    0,                                 /*         QUOT | SUBST | SUBEXPR */
+    ESCAPE DELIM SUBST QUOT            /* SPLIT | QUOT | SUBST | SUBEXPR */
+
+#undef ESCAPE
+#undef SUBST
 #undef WORDSEP
-#undef SQUOT
+#undef QUOT
 #undef DELIM
   };
 
@@ -1461,7 +1465,7 @@ static const char *subst(const char *p, const char *l,
 
       if (!(f&SF_SKIP)) {
 
-       /* If this is a double quote or backslash then check DFLT to see if
+       /* If this is a double quote or backslash then check QFILT to see if
         * it needs escaping.
         */
        if (qfilt && (*p == '"' || *p == '\\'))
@@ -1636,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,