version 1.4, 2014/03/28 10:00:40 |
version 1.7, 2014/03/28 10:37:50 |
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
#include <unistd.h> |
|
|
/* |
/* |
* All recognised node types. |
* All recognised node types. |
Line 638 pnode_printmacroline(struct parse *p, struct pnode *pn |
|
Line 639 pnode_printmacroline(struct parse *p, struct pnode *pn |
|
} |
} |
|
|
static void |
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) |
pnode_printrefsect(struct parse *p, struct pnode *pn) |
{ |
{ |
struct pnode *pp; |
struct pnode *pp; |
Line 648 pnode_printrefsect(struct parse *p, struct pnode *pn) |
|
Line 663 pnode_printrefsect(struct parse *p, struct pnode *pn) |
|
|
|
fputs(".Sh ", stdout); |
fputs(".Sh ", stdout); |
|
|
if (NULL != pp) |
if (NULL != pp) { |
pnode_printmacroline(p, pp); |
pnode_printmacroline(p, pp); |
else |
pnode_unlink(pp); |
|
} else |
puts("UNKNOWN"); |
puts("UNKNOWN"); |
} |
} |
|
|
Line 696 pnode_printrefmeta(struct parse *p, struct pnode *pn) |
|
Line 712 pnode_printrefmeta(struct parse *p, struct pnode *pn) |
|
fputs(".Dt ", stdout); |
fputs(".Dt ", stdout); |
|
|
if (NULL != title) { |
if (NULL != title) { |
|
/* FIXME: uppercase. */ |
pnode_printmacrolinepart(p, title); |
pnode_printmacrolinepart(p, title); |
putchar(' '); |
putchar(' '); |
} else |
} else |
Line 804 pnode_printarg(struct parse *p, struct pnode *pn, int |
|
Line 821 pnode_printarg(struct parse *p, struct pnode *pn, int |
|
puts(""); |
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). |
* Print a parsed node (or ignore it--whatever). |
* This is a recursive function. |
* This is a recursive function. |
Line 869 pnode_print(struct parse *p, struct pnode *pn) |
|
Line 921 pnode_print(struct parse *p, struct pnode *pn) |
|
puts(".Bd -literal"); |
puts(".Bd -literal"); |
break; |
break; |
case (NODE_REFMETA): |
case (NODE_REFMETA): |
pnode_printrefmeta(p, pn); |
abort(); |
pnode_unlinksub(pn); |
|
break; |
break; |
case (NODE_REFNAME): |
case (NODE_REFNAME): |
fputs(".Nm ", stdout); |
fputs(".Nm ", stdout); |
Line 886 pnode_print(struct parse *p, struct pnode *pn) |
|
Line 937 pnode_print(struct parse *p, struct pnode *pn) |
|
pnode_unlinksub(pn); |
pnode_unlinksub(pn); |
return; |
return; |
case (NODE_REFSYNOPSISDIV): |
case (NODE_REFSYNOPSISDIV): |
puts(".Sh SYNOPSIS"); |
pnode_printrefsynopsisdiv(p, pn); |
break; |
break; |
case (NODE_REFSECT1): |
case (NODE_REFSECT1): |
pnode_printrefsect(p, pn); |
pnode_printrefsect(p, pn); |
pnode_unlinksub(pn); |
|
break; |
break; |
case (NODE_TEXT): |
case (NODE_TEXT): |
bufclear(p); |
bufclear(p); |
Line 966 readfile(XML_Parser xp, int fd, |
|
Line 1016 readfile(XML_Parser xp, int fd, |
|
* Exit when we've read all or errors have occured |
* Exit when we've read all or errors have occured |
* during the parse sequence. |
* during the parse sequence. |
*/ |
*/ |
|
pnode_printprologue(&p, p.root); |
pnode_print(&p, p.root); |
pnode_print(&p, p.root); |
pnode_free(p.root); |
pnode_free(p.root); |
free(p.b); |
free(p.b); |