X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/runlisp/blobdiff_plain/a8833af0fa20b68e6e09736f57c8f3137719cc0c..60f1d5fe519c30e68be464696ce9c4ad56a6b050:/lib.c diff --git a/lib.c b/lib.c index dea6c09..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 ----------------------------------------*/ @@ -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,22 +1399,22 @@ 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 + 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 @@ -1637,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,