Yikes! Stack trash I'd never noticed before. Oops.
[sgt/halibut] / main.c
diff --git a/main.c b/main.c
index 4dec663..24e6077 100644 (file)
--- a/main.c
+++ b/main.c
@@ -11,20 +11,29 @@ static void dbg_prtsource(paragraph *sourceform);
 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", xhtml_backend, xhtml_config_filename, 0x0002, 0},
+    {"html", xhtml_backend, xhtml_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) {
@@ -34,9 +43,10 @@ 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];
 
     /*
      * Set up initial (default) parameters.
@@ -84,7 +94,9 @@ int main(int argc, char **argv) {
                        assert(opt[0] == '-');
                        for (k = 0; k < (int)lenof(backends); k++)
                            if (!strcmp(opt+1, backends[k].name)) {
+printf("%d\n", backendbits);
                                backendbits |= backends[k].bitfield;
+printf("%d\n", backendbits);
                                if (val) {
                                    paragraph *p = backends[k].filename(val);
                                    assert(p);
@@ -231,6 +243,7 @@ int main(int argc, char **argv) {
            infiles[nfiles++] = p;
        }
     }
+printf("%d\n", backendbits);
 
     if (errs)
        exit(EXIT_FAILURE);
@@ -307,13 +320,40 @@ int main(int argc, char **argv) {
        }
 
        /*
+        * 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.
         */
+printf("%d\n", backendbits);
        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);