X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/c8fb54d2c7f1ac9ac48867ab77eecd80bd4b8967..eb4d33e66b85887e34536237e2500075fcd48e5b:/main.c diff --git a/main.c b/main.c index a528453..b509928 100644 --- a/main.c +++ b/main.c @@ -14,15 +14,16 @@ static void dbg_prtkws(keywordlist *kws); static const struct backend { char *name; void (*func)(paragraph *, keywordlist *, indexdata *); + paragraph *(*filename)(char *filename); int bitfield; } backends[] = { - {"text", text_backend, 0x0001}, - {"xhtml", xhtml_backend, 0x0002}, - {"html", xhtml_backend, 0x0002}, - {"hlp", whlp_backend, 0x0004}, - {"whlp", whlp_backend, 0x0004}, - {"winhelp", whlp_backend, 0x0004}, - {"man", man_backend, 0x0008}, + {"text", text_backend, text_config_filename, 0x0001}, + {"xhtml", xhtml_backend, xhtml_config_filename, 0x0002}, + {"html", xhtml_backend, xhtml_config_filename, 0x0002}, + {"hlp", whlp_backend, whlp_config_filename, 0x0004}, + {"whlp", whlp_backend, whlp_config_filename, 0x0004}, + {"winhelp", whlp_backend, whlp_config_filename, 0x0004}, + {"man", man_backend, man_config_filename, 0x0008}, }; int main(int argc, char **argv) { @@ -34,6 +35,7 @@ int main(int argc, char **argv) { int debug; int backendbits; int k, b; + paragraph *cfg, *cfg_tail; /* * Set up initial (default) parameters. @@ -44,6 +46,7 @@ int main(int argc, char **argv) { reportcols = 0; debug = 0; backendbits = 0; + cfg = cfg_tail = NULL; if (argc == 1) { usage(); @@ -81,6 +84,17 @@ int main(int argc, char **argv) { for (k = 0; k < (int)lenof(backends); k++) if (!strcmp(opt+1, backends[k].name)) { backendbits |= backends[k].bitfield; + if (val) { + paragraph *p = backends[k].filename(val); + assert(p); + if (cfg_tail) + cfg_tail->next = p; + else + cfg = p; + while (p->next) + p = p->next; + cfg_tail = p; + } break; } if (k < (int)lenof(backends)) { @@ -132,8 +146,7 @@ int main(int argc, char **argv) { break; } break; -#if 0 - case 'o': + case 'C': /* * Option requiring parameter. */ @@ -150,13 +163,54 @@ int main(int argc, char **argv) { * Now c is the option and p is the parameter. */ switch (c) { - case 'o': - outfile = p; + case 'C': + /* + * -C means we split our argument up into + * colon-separated chunks and assemble them + * into a config paragraph. + */ + { + wchar_t *keywords; + char *q; + wchar_t *u; + paragraph *para; + + keywords = mknewa(wchar_t, 2+strlen(p)); + + u = keywords; + q = p; + + while (*q) { + if (*q == ':') { + *u++ = L'\0'; + } else { + if (*q == '\\' && q[1]) + q++; + /* FIXME: lacks charset flexibility */ + *u++ = *q; + } + q++; + } + *u = L'\0'; + + para = mknew(paragraph); + memset(para, 0, sizeof(*para)); + para->type = para_Config; + para->keyword = keywords; + para->next = NULL; + para->fpos.filename = ""; + para->fpos.line = para->fpos.col = -1; + + if (cfg_tail) + cfg_tail->next = para; + else + cfg = para; + cfg_tail = para; + } break; } p = NULL; /* prevent continued processing */ break; -#endif default: /* * Unrecognised option. @@ -212,6 +266,21 @@ int main(int argc, char **argv) { if (!sourceform) exit(EXIT_FAILURE); + /* + * Append the config directives acquired from the command + * line. + */ + { + paragraph *end; + + end = sourceform; + while (end && end->next) + end = end->next; + assert(end); + + end->next = cfg; + } + sfree(in.pushback); mark_attr_ends(sourceform);