-}
-
-/* --- @conf_parse@ --- *
- *
- * Arguments: @scanner *sc@ = pointer to scanner definition
- *
- * Returns: ---
- *
- * Use: Parses a configuration file from the scanner.
- */
-
-void conf_parse(scanner *sc)
-{
- token(sc);
-
- for (;;) {
- if (sc->t == CTOK_EOF)
- break;
- if (sc->t != CTOK_WORD)
- error(sc, "parse error, keyword expected");
-
- /* --- Handle a forwarding request --- */
-
- if (strcmp(sc->d.buf, "forward") == 0 ||
- strcmp(sc->d.buf, "fw") == 0 ||
- strcmp(sc->d.buf, "from") == 0) {
- source *s;
- target *t;
-
- token(sc);
-
- /* --- Read a source description --- */
-
- {
- source_ops **sops;
-
- /* --- Try to find a source type which understands --- */
-
- s = 0;
- for (sops = sources; *sops; sops++) {
- if ((s = (*sops)->read(sc)) != 0)
- goto found_source;
- }
- error(sc, "unknown source name `%s'", sc->d.buf);
-
- /* --- Read any source-specific options --- */
-
- found_source:
- if (sc->t == '{') {
- token(sc);
- while (sc->t == CTOK_WORD) {
- if (!s->ops->option || !s->ops->option(s, sc)) {
- error(sc, "unknown %s source option `%s'",
- s->ops->name, sc->d.buf);
- }
- if (sc->t == ';')
- token(sc);
- }
- if (sc->t != '}')
- error(sc, "parse error, missing `}'");
- token(sc);
- }
- }
-
- /* --- Read a destination description --- */
-
- if (sc->t == CTOK_WORD && (strcmp(sc->d.buf, "to") == 0 ||
- strcmp(sc->d.buf, "->") == 0))
- token(sc);
-
- {
- target_ops **tops;
-
- /* --- Try to find a target which understands --- */
-
- t = 0;
- for (tops = targets; *tops; tops++) {
- if ((t = (*tops)->read(sc)) != 0)
- goto found_target;
- }
- error(sc, "unknown target name `%s'", sc->d.buf);
-
- /* --- Read any target-specific options --- */
-
- found_target:
- if (sc->t == '{') {
- token(sc);
- while (sc->t == CTOK_WORD) {
- if (!t->ops->option || !t->ops->option(t, sc)) {
- error(sc, "unknown %s target option `%s'",
- t->ops->name, sc->d.buf);
- }
- if (sc->t == ';')
- token(sc);
- }
- if (sc->t != '}')
- error(sc, "parse error, `}' expected");
- token(sc);
- }
- }
-
- /* --- Combine the source and target --- */