version 1.6, 2014/03/28 10:08:24 |
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. |
|
|
int stop; /* should we stop now? */ |
int stop; /* should we stop now? */ |
struct pnode *root; /* root of parse tree */ |
struct pnode *root; /* root of parse tree */ |
struct pnode *cur; /* current node in tree */ |
struct pnode *cur; /* current node in tree */ |
unsigned int flags; |
|
#define PARSE_HAS_META 1 |
|
char *b; |
char *b; |
size_t bsz; |
size_t bsz; |
size_t mbsz; |
size_t mbsz; |
Line 713 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 821 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 886 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); |
|
p->flags |= PARSE_HAS_META; |
|
break; |
break; |
case (NODE_REFNAME): |
case (NODE_REFNAME): |
fputs(".Nm ", stdout); |
fputs(".Nm ", stdout); |
Line 896 pnode_print(struct parse *p, struct pnode *pn) |
|
Line 929 pnode_print(struct parse *p, struct pnode *pn) |
|
pnode_unlinksub(pn); |
pnode_unlinksub(pn); |
return; |
return; |
case (NODE_REFNAMEDIV): |
case (NODE_REFNAMEDIV): |
if ( ! (PARSE_HAS_META & p->flags)) { |
|
puts(".Dd $Mdocdate" "$"); |
|
puts(".Dt UNKNOWN 1"); |
|
puts(".Os"); |
|
} |
|
puts(".Sh NAME"); |
puts(".Sh NAME"); |
break; |
break; |
case (NODE_REFPURPOSE): |
case (NODE_REFPURPOSE): |
Line 988 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); |