- /* --- 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 --- */
-
- s->ops->attach(s, sc, t);
- }
-
- /* --- Include configuration from a file --- *
- *
- * Slightly tricky. Scan the optional semicolon from the including
- * stream, not the included one.
- */
-
- else if (strcmp(sc->d.buf, "include") == 0) {
- FILE *fp;
- dstr d = DSTR_INIT;
-
- token(sc);
- conf_name(sc, '/', &d);
- if ((fp = fopen(d.buf, "r")) == 0)
- error(sc, "can't include `%s': %s", d.buf, strerror(errno));
- if (sc->t == ';')
- token(sc);
- pushback(sc);
- scan_push(sc, scan_file(fp, xstrdup(d.buf), SCF_FREENAME));
- token(sc);
- dstr_destroy(&d);
- continue; /* Don't parse a trailing `;' */
- }
-
- /* --- Other configuration is handled elsewhere --- */
-
- else {
-
- /* --- First try among the sources --- */
-
- {
- source_ops **sops;
-
- for (sops = sources; *sops; sops++) {
- if ((*sops)->option && (*sops)->option(0, sc))
- goto found_option;
- }
- }
-
- /* --- Then try among the targets --- */
-
- {
- target_ops **tops;
-
- for (tops = targets; *tops; tops++) {
- if ((*tops)->option && (*tops)->option(0, sc))
- goto found_option;
- }
- }
-
- /* --- Nobody wants the option --- */
-
- error(sc, "unknown global option or prefix `%s'", sc->d.buf);
-
- found_option:;
- }
-
- if (sc->t == ';')
- token(sc);
- }