*/
#include <assert.h>
+#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include "halibut.h"
static void dbg_prtwordlist(int level, word *w);
static void dbg_prtkws(keywordlist *kws);
+static const struct pre_backend {
+ void *(*func)(paragraph *, keywordlist *, indexdata *);
+ int bitfield;
+} pre_backends[] = {
+ {paper_pre_backend, 0x0001}
+};
+
static const struct backend {
char *name;
- void (*func)(paragraph *, keywordlist *, indexdata *);
+ void (*func)(paragraph *, keywordlist *, indexdata *, void *);
paragraph *(*filename)(char *filename);
- int bitfield;
+ int bitfield, prebackend_bitfield;
} backends[] = {
- {"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},
- {"info", info_backend, info_config_filename, 0x0010},
+ {"text", text_backend, text_config_filename, 0x0001, 0},
+ {"xhtml", html_backend, html_config_filename, 0x0002, 0},
+ {"html", html_backend, html_config_filename, 0x0002, 0},
+ {"hlp", whlp_backend, whlp_config_filename, 0x0004, 0},
+ {"whlp", whlp_backend, whlp_config_filename, 0x0004, 0},
+ {"winhelp", whlp_backend, whlp_config_filename, 0x0004, 0},
+ {"man", man_backend, man_config_filename, 0x0008, 0},
+ {"info", info_backend, info_config_filename, 0x0010, 0},
+ {"ps", ps_backend, ps_config_filename, 0x0020, 0x0001},
+ {"pdf", pdf_backend, pdf_config_filename, 0x0040, 0x0001},
};
int main(int argc, char **argv) {
int errs;
int reportcols;
int debug;
- int backendbits;
+ int backendbits, prebackbits;
int k, b;
paragraph *cfg, *cfg_tail;
+ void *pre_backend_data[16];
+
+ setlocale(LC_ALL, "");
/*
* Set up initial (default) parameters.
*/
- infiles = mknewa(char *, argc);
+ infiles = snewn(argc, char *);
nfiles = 0;
nogo = errs = FALSE;
reportcols = 0;
* into a config paragraph.
*/
{
- wchar_t *keywords;
- char *q;
- wchar_t *u;
+ char *s = dupstr(p), *q, *r;
paragraph *para;
- keywords = mknewa(wchar_t, 2+strlen(p));
-
- u = keywords;
- q = p;
+ para = cmdline_cfg_new();
+ q = r = s;
while (*q) {
if (*q == ':') {
- *u++ = L'\0';
+ *r = '\0';
+ cmdline_cfg_add(para, s);
+ r = s;
} else {
if (*q == '\\' && q[1])
q++;
- /* FIXME: lacks charset flexibility */
- *u++ = *q;
+ *r++ = *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 = "<command line>";
- para->fpos.line = para->fpos.col = -1;
+ *r = '\0';
+ cmdline_cfg_add(para, s);
if (cfg_tail)
cfg_tail->next = para;
in.pushback = NULL;
in.reportcols = reportcols;
in.stack = NULL;
+ in.defcharset = charset_from_locale();
idx = make_index();
sfree(in.pushback);
- mark_attr_ends(sourceform);
-
sfree(infiles);
keywords = get_keywords(sourceform);
for (p = sourceform; p; p = p->next)
if (p->type == para_IM)
- index_merge(idx, TRUE, p->keyword, p->words);
+ index_merge(idx, TRUE, p->keyword, p->words, &p->fpos);
build_index(idx);
+ /*
+ * Set up attr_First / attr_Last / attr_Always, in the main
+ * document and in the index entries.
+ */
+ for (p = sourceform; p; p = p->next)
+ mark_attr_ends(p->words);
+ {
+ int i;
+ indexentry *entry;
+
+ for (i = 0; (entry = index234(idx->entries, i)) != NULL; i++)
+ mark_attr_ends(entry->text);
+ }
+
if (debug) {
index_debug(idx);
dbg_prtkws(keywords);
}
/*
+ * Select and run the pre-backends.
+ */
+ prebackbits = 0;
+ for (k = 0; k < (int)lenof(backends); k++)
+ if (backendbits == 0 || (backendbits & backends[k].bitfield))
+ prebackbits |= backends[k].prebackend_bitfield;
+ for (k = 0; k < (int)lenof(pre_backends); k++)
+ if (prebackbits & pre_backends[k].bitfield) {
+ assert(k < (int)lenof(pre_backend_data));
+ pre_backend_data[k] =
+ pre_backends[k].func(sourceform, keywords, idx);
+ }
+
+ /*
* Run the selected set of backends.
*/
for (k = b = 0; k < (int)lenof(backends); k++)
if (b != backends[k].bitfield) {
b = backends[k].bitfield;
- if (backendbits == 0 || (backendbits & b))
- backends[k].func(sourceform, keywords, idx);
+ if (backendbits == 0 || (backendbits & b)) {
+ void *pbd = NULL;
+ int pbb = backends[k].prebackend_bitfield;
+ int m;
+
+ for (m = 0; m < (int)lenof(pre_backends); m++)
+ if (pbb & pre_backends[m].bitfield) {
+ assert(m < (int)lenof(pre_backend_data));
+ pbd = pre_backend_data[m];
+ break;
+ }
+
+ backends[k].func(sourceform, keywords, idx, pbd);
+ }
}
free_para_list(sourceform);