=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.5 retrieving revision 1.7 diff -u -p -r1.5 -r1.7 --- docbook2mdoc/docbook2mdoc.c 2014/03/28 10:03:36 1.5 +++ docbook2mdoc/docbook2mdoc.c 2014/03/28 10:37:50 1.7 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.5 2014/03/28 10:03:36 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. @@ -638,6 +639,20 @@ pnode_printmacroline(struct parse *p, struct pnode *pn } static void +pnode_printrefsynopsisdiv(struct parse *p, struct pnode *pn) +{ + struct pnode *pp; + + TAILQ_FOREACH(pp, &pn->childq, child) + if (NODE_TITLE == pp->node) { + pnode_unlink(pp); + break; + } + + puts(".Sh SYNOPSIS"); +} + +static void pnode_printrefsect(struct parse *p, struct pnode *pn) { struct pnode *pp; @@ -697,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 @@ -805,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. @@ -870,8 +921,7 @@ pnode_print(struct parse *p, struct pnode *pn) puts(".Bd -literal"); break; case (NODE_REFMETA): - pnode_printrefmeta(p, pn); - pnode_unlinksub(pn); + abort(); break; case (NODE_REFNAME): fputs(".Nm ", stdout); @@ -887,7 +937,7 @@ pnode_print(struct parse *p, struct pnode *pn) pnode_unlinksub(pn); return; case (NODE_REFSYNOPSISDIV): - puts(".Sh SYNOPSIS"); + pnode_printrefsynopsisdiv(p, pn); break; case (NODE_REFSECT1): pnode_printrefsect(p, pn); @@ -966,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);