=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -p -r1.6 -r1.7 --- docbook2mdoc/docbook2mdoc.c 2014/03/28 10:08:24 1.6 +++ docbook2mdoc/docbook2mdoc.c 2014/03/28 10:37:50 1.7 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.6 2014/03/28 10:08:24 kristaps Exp $ */ +/* $Id: docbook2mdoc.c,v 1.7 2014/03/28 10:37:50 kristaps Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * @@ -24,6 +24,7 @@ #include #include #include +#include /* * All recognised node types. @@ -73,8 +74,6 @@ struct parse { int stop; /* should we stop now? */ struct pnode *root; /* root of parse tree */ struct pnode *cur; /* current node in tree */ - unsigned int flags; -#define PARSE_HAS_META 1 char *b; size_t bsz; size_t mbsz; @@ -713,6 +712,7 @@ pnode_printrefmeta(struct parse *p, struct pnode *pn) fputs(".Dt ", stdout); if (NULL != title) { + /* FIXME: uppercase. */ pnode_printmacrolinepart(p, title); putchar(' '); } else @@ -821,6 +821,41 @@ pnode_printarg(struct parse *p, struct pnode *pn, int puts(""); } +/* + * Recursively search and return the first instance of "node". + */ +static struct pnode * +pnode_findfirst(struct pnode *pn, enum nodeid node) +{ + struct pnode *pp, *res; + + res = NULL; + TAILQ_FOREACH(pp, &pn->childq, child) { + res = pp->node == node ? pp : + pnode_findfirst(pp, node); + if (NULL != res) + break; + } + + return(res); +} + +static void +pnode_printprologue(struct parse *p, struct pnode *pn) +{ + struct pnode *pp; + + if (NULL != (pp = pnode_findfirst(p->root, NODE_REFMETA))) { + pnode_printrefmeta(p, pp); + pnode_unlink(pp); + } else { + puts(".\\\" Supplying bogus prologue..."); + puts(".Dd $Mdocdate" "$"); + puts(".Dt UNKNOWN 1"); + puts(".Os"); + } +} + /* * Print a parsed node (or ignore it--whatever). * This is a recursive function. @@ -886,9 +921,7 @@ pnode_print(struct parse *p, struct pnode *pn) puts(".Bd -literal"); break; case (NODE_REFMETA): - pnode_printrefmeta(p, pn); - pnode_unlinksub(pn); - p->flags |= PARSE_HAS_META; + abort(); break; case (NODE_REFNAME): fputs(".Nm ", stdout); @@ -896,11 +929,6 @@ pnode_print(struct parse *p, struct pnode *pn) pnode_unlinksub(pn); return; case (NODE_REFNAMEDIV): - if ( ! (PARSE_HAS_META & p->flags)) { - puts(".Dd $Mdocdate" "$"); - puts(".Dt UNKNOWN 1"); - puts(".Os"); - } puts(".Sh NAME"); break; case (NODE_REFPURPOSE): @@ -988,6 +1016,7 @@ readfile(XML_Parser xp, int fd, * Exit when we've read all or errors have occured * during the parse sequence. */ + pnode_printprologue(&p, p.root); pnode_print(&p, p.root); pnode_free(p.root); free(p.b);