X-Git-Url: https://git.distorted.org.uk/~mdw/fwd/blobdiff_plain/a6eddf542b718403c2f59203af884daad8334060..2f8a65a18e27f55f646f8d719b57347f064fa15b:/conf.c diff --git a/conf.c b/conf.c index 39d170d..0cd4a17 100644 --- a/conf.c +++ b/conf.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: conf.c,v 1.4 1999/10/15 21:12:36 mdw Exp $ + * $Id: conf.c,v 1.9 2002/01/13 14:48:16 mdw Exp $ * * Configuration parsing * @@ -29,6 +29,22 @@ /*----- Revision history --------------------------------------------------* * * $Log: conf.c,v $ + * Revision 1.9 2002/01/13 14:48:16 mdw + * Make delimiters be a property of a scanner. Change the delimiter- + * changing functions' names. + * + * Revision 1.8 2001/02/03 20:33:26 mdw + * Fix flags to be unsigned. + * + * Revision 1.7 2000/08/01 17:58:10 mdw + * Fix subtleties with functions. + * + * Revision 1.6 2000/02/12 18:13:20 mdw + * Terminate tables of sources and targets. + * + * Revision 1.5 1999/10/22 22:46:44 mdw + * Improve documentation for conf_enum. + * * Revision 1.4 1999/10/15 21:12:36 mdw * Remove redundant debugging code. * @@ -70,17 +86,17 @@ /*----- Source and target tables ------------------------------------------*/ -static source_ops *sources[] = { &xsource_ops, &fsource_ops, &ssource_ops }; -static target_ops *targets[] = { &xtarget_ops, &ftarget_ops, &starget_ops }; - -static const char *notword = 0; -static const char *notdelim = 0; +static source_ops *sources[] = + { &xsource_ops, &fsource_ops, &ssource_ops, 0 }; +static target_ops *targets[] = + { &xtarget_ops, &ftarget_ops, &starget_ops, 0 }; /*----- Main code ---------------------------------------------------------*/ -/* --- @undelim@ --- * +/* --- @conf_undelim@ --- * * - * Arguments: @const char *d, dd@ = pointer to characters to escape + * Arguments: @scanner *sc@ = pointer to scanner definition + * @const char *d, *dd@ = pointer to characters to escape * * Returns: --- * @@ -89,7 +105,11 @@ static const char *notdelim = 0; * second list will always be allowed to continue a word. */ -void undelim(const char *d, const char *dd) { notword = d; notdelim = dd; } +void conf_undelim(scanner *sc, const char *d, const char *dd) +{ + sc->wbegin = d; + sc->wcont = dd; +} /* --- @token@ --- * * @@ -126,7 +146,7 @@ int token(scanner *sc) goto done; } - else if (isspace((unsigned char)ch)) + else if (isspace(ch)) ; else switch (ch) { @@ -145,7 +165,7 @@ int token(scanner *sc) /* --- Various self-delimiting characters --- */ case SELFDELIM: - if (!notword || strchr(notword, ch) == 0) { + if (!sc->wbegin || strchr(sc->wbegin, ch) == 0) { dstr_putc(&sc->d, ch); dstr_putz(&sc->d); sc->t = ch; @@ -175,11 +195,11 @@ int token(scanner *sc) q = !q; break; case SELFDELIM: - if (q || (notdelim && strchr(notdelim, ch))) + if (q || (sc->wcont && strchr(sc->wcont, ch))) goto insert; goto word; default: - if (!q && isspace((unsigned char)(ch))) + if (!q && isspace(ch)) goto word; insert: DPUTC(&sc->d, ch); @@ -247,9 +267,15 @@ void error(scanner *sc, const char *msg, ...) * Returns: Index into list, zero-based, or @-1@. * * Use: Checks whether the current token is a string which matches - * one of the comma-separated items given. If not, an error is - * reported; otherwise the index of the matched item is - * returned. + * one of the comma-separated items given. The return value is + * the index (zero-based) of the matched string in the list. + * + * The flags control the behaviour if no exact match is found. + * If @ENUM_ABBREV@ is set, and the current token is a left + * substring of exactly one of the possibilities, then that one + * is chosen. If @ENUM_NONE@ is set, the value @-1@ is + * returned; otherwise an error is reported and the program is + * terminated. */ int conf_enum(scanner *sc, const char *list, unsigned f, const char *err) @@ -363,16 +389,15 @@ int conf_prefix(scanner *sc, const char *p) void conf_name(scanner *sc, char delim, dstr *d) { unsigned f = 0; - enum { - f_ok = 1, - f_bra = 2 - }; + +#define f_ok 1u +#define f_bra 2u /* --- Read an optional opening bracket --- */ if (sc->t == '[') { token(sc); - f |= f_bra; + f |= f_bra | f_ok; } /* --- Do the main reading sequence --- */ @@ -404,6 +429,9 @@ void conf_name(scanner *sc, char delim, dstr *d) error(sc, "parse error, missing `]'"); } DPUTZ(d); + +#undef f_ok +#undef f_bra } /* --- @conf_parse@ --- *