version 1.51, 2019/03/22 16:14:52 |
version 1.54, 2019/03/22 16:32:34 |
|
|
char *b; /* NUL-terminated buffer for pre-print */ |
char *b; /* NUL-terminated buffer for pre-print */ |
size_t bsz; /* current length of b */ |
size_t bsz; /* current length of b */ |
size_t mbsz; /* max bsz allocation */ |
size_t mbsz; /* max bsz allocation */ |
|
int level; /* header level, starting at 1 */ |
int newln; /* output: are we on a fresh line */ |
int newln; /* output: are we on a fresh line */ |
}; |
}; |
|
|
Line 689 pnode_printmclosepunct(struct parse *p, struct pnode * |
|
Line 690 pnode_printmclosepunct(struct parse *p, struct pnode * |
|
p->newln = 1; |
p->newln = 1; |
} |
} |
|
|
|
static void |
|
pnode_printpara(struct parse *p, struct pnode *pn) |
|
{ |
|
struct pnode *pp; |
|
|
|
assert(p->newln); |
|
if (NULL == pn->parent || NODE_LISTITEM == pn->parent->node) |
|
return; |
|
|
|
pp = TAILQ_PREV(pn, pnodeq, child); |
|
if (NULL == pp) |
|
pp = pn->parent; |
|
switch (pp->node) { |
|
case (NODE_CHAPTER): |
|
case (NODE_PREFACE): |
|
case (NODE_REFSECT1): |
|
case (NODE_REFSECT2): |
|
case (NODE_REFSECT3): |
|
case (NODE_REFSECTION): |
|
case (NODE_SECT1): |
|
case (NODE_SECT2): |
|
case (NODE_SECTION): |
|
if (2 > p->level) |
|
return; |
|
break; |
|
default: |
|
break; |
|
} |
|
puts(".Pp"); |
|
} |
|
|
/* |
/* |
* If the SYNOPSIS macro has a superfluous title, kill it. |
* If the SYNOPSIS macro has a superfluous title, kill it. |
*/ |
*/ |
|
|
pnode_printrefsect(struct parse *p, struct pnode *pn) |
pnode_printrefsect(struct parse *p, struct pnode *pn) |
{ |
{ |
struct pnode *pp; |
struct pnode *pp; |
|
const char *title; |
|
int flags, level; |
|
|
|
level = ++p->level; |
|
flags = 1 == level ? MACROLINE_UPPER : 0; |
|
if (3 > level) { |
|
switch (pn->node) { |
|
case (NODE_CAUTION): |
|
case (NODE_NOTE): |
|
case (NODE_TIP): |
|
case (NODE_WARNING): |
|
level = 3; |
|
break; |
|
default: |
|
break; |
|
} |
|
} |
|
|
TAILQ_FOREACH(pp, &pn->childq, child) |
TAILQ_FOREACH(pp, &pn->childq, child) |
if (NODE_TITLE == pp->node) |
if (NODE_TITLE == pp->node) |
break; |
break; |
|
|
switch (pn->node) { |
if (NULL == pp) { |
case (NODE_REFSECT1): |
switch (pn->node) { |
/* FALLTHROUGH */ |
case (NODE_PREFACE): |
case (NODE_SECT1): |
title = "Preface"; |
/* FALLTHROUGH */ |
break; |
case (NODE_CHAPTER): |
case (NODE_CAUTION): |
|
title = "Caution"; |
|
break; |
|
case (NODE_NOTE): |
|
title = "Note"; |
|
break; |
|
case (NODE_TIP): |
|
title = "Tip"; |
|
break; |
|
case (NODE_WARNING): |
|
title = "Warning"; |
|
break; |
|
default: |
|
title = "Unknown"; |
|
break; |
|
} |
|
} |
|
|
|
switch (level) { |
|
case (1): |
fputs(".Sh", stdout); |
fputs(".Sh", stdout); |
break; |
break; |
case (NODE_REFSECT2): |
case (2): |
/* FALLTHROUGH */ |
|
case (NODE_SECT2): |
|
fputs(".Ss", stdout); |
fputs(".Ss", stdout); |
break; |
break; |
case (NODE_REFSECT3): |
default: |
puts(".Pp"); |
pnode_printpara(p, pn); |
fputs(".Sy", stdout); |
fputs(".Sy", stdout); |
break; |
break; |
case (NODE_NOTE): |
|
/* FALLTHROUGH */ |
|
case (NODE_REFSECTION): |
|
/* FALLTHROUGH */ |
|
case (NODE_TIP): |
|
/* FALLTHROUGH */ |
|
case (NODE_CAUTION): |
|
/* FALLTHROUGH */ |
|
case (NODE_WARNING): |
|
puts(".Pp"); |
|
if (NULL == pp) |
|
return; |
|
fputs(".Em", stdout); |
|
break; |
|
default: |
|
break; |
|
} |
} |
|
|
p->newln = 0; |
|
|
|
if (NULL != pp) { |
if (NULL != pp) { |
pnode_printmacrolinetext(p, pp, |
p->newln = 0; |
NODE_REFSECT1 == pn->node || NODE_SECT1 == pn->node ? |
pnode_printmacrolinetext(p, pp, flags); |
MACROLINE_UPPER : 0); |
|
pnode_printmclose(p, 1); |
pnode_printmclose(p, 1); |
pnode_unlink(pp); |
pnode_unlink(pp); |
} else { |
} else |
puts(NODE_REFSECT1 == pn->node || NODE_SECT1 == pn->node ? |
printf(" %s\n", title); |
"UNKNOWN" : "unknown"); |
|
p->newln = 1; |
|
} |
|
} |
} |
|
|
/* |
/* |
Line 1148 pnode_printtable(struct parse *p, struct pnode *pn) |
|
Line 1192 pnode_printtable(struct parse *p, struct pnode *pn) |
|
assert(p->newln); |
assert(p->newln); |
TAILQ_FOREACH(pp, &pn->childq, child) |
TAILQ_FOREACH(pp, &pn->childq, child) |
if (NODE_TITLE == pp->node) { |
if (NODE_TITLE == pp->node) { |
puts(".Pp"); |
pnode_printpara(p, pp); |
pnode_print(p, pp); |
pnode_print(p, pp); |
pnode_unlink(pp); |
pnode_unlink(pp); |
} |
} |
Line 1172 pnode_printlist(struct parse *p, struct pnode *pn) |
|
Line 1216 pnode_printlist(struct parse *p, struct pnode *pn) |
|
assert(p->newln); |
assert(p->newln); |
TAILQ_FOREACH(pp, &pn->childq, child) |
TAILQ_FOREACH(pp, &pn->childq, child) |
if (NODE_TITLE == pp->node) { |
if (NODE_TITLE == pp->node) { |
puts(".Pp"); |
pnode_printpara(p, pp); |
pnode_print(p, pp); |
pnode_print(p, pp); |
pnode_unlink(pp); |
pnode_unlink(pp); |
} |
} |
Line 1181 pnode_printlist(struct parse *p, struct pnode *pn) |
|
Line 1225 pnode_printlist(struct parse *p, struct pnode *pn) |
|
if (NODE_ORDEREDLIST == pn->node) |
if (NODE_ORDEREDLIST == pn->node) |
puts(".Bl -enum"); |
puts(".Bl -enum"); |
else |
else |
puts(".Bl -item"); |
puts(".Bl -bullet"); |
|
|
TAILQ_FOREACH(pp, &pn->childq, child) { |
TAILQ_FOREACH(pp, &pn->childq, child) { |
assert(p->newln); |
assert(p->newln); |
Line 1201 pnode_printvariablelist(struct parse *p, struct pnode |
|
Line 1245 pnode_printvariablelist(struct parse *p, struct pnode |
|
assert(p->newln); |
assert(p->newln); |
TAILQ_FOREACH(pp, &pn->childq, child) |
TAILQ_FOREACH(pp, &pn->childq, child) |
if (NODE_TITLE == pp->node) { |
if (NODE_TITLE == pp->node) { |
puts(".Pp"); |
pnode_printpara(p, pp); |
pnode_print(p, pp); |
pnode_print(p, pp); |
pnode_unlink(pp); |
pnode_unlink(pp); |
} |
} |
Line 1367 pnode_print(struct parse *p, struct pnode *pn) |
|
Line 1411 pnode_print(struct parse *p, struct pnode *pn) |
|
pnode_unlinksub(pn); |
pnode_unlinksub(pn); |
break; |
break; |
case (NODE_PARA): |
case (NODE_PARA): |
assert(p->newln); |
pnode_printpara(p, pn); |
if (NULL != pn->parent && |
|
NODE_LISTITEM == pn->parent->node) |
|
break; |
|
puts(".Pp"); |
|
break; |
break; |
case (NODE_PARAMETER): |
case (NODE_PARAMETER): |
/* Suppress non-text children... */ |
/* Suppress non-text children... */ |
Line 1422 pnode_print(struct parse *p, struct pnode *pn) |
|
Line 1462 pnode_print(struct parse *p, struct pnode *pn) |
|
pnode_printrefsynopsisdiv(p, pn); |
pnode_printrefsynopsisdiv(p, pn); |
puts(".Sh SYNOPSIS"); |
puts(".Sh SYNOPSIS"); |
break; |
break; |
|
case (NODE_PREFACE): |
case (NODE_REFSECT1): |
case (NODE_REFSECT1): |
/* FALLTHROUGH */ |
|
case (NODE_REFSECT2): |
case (NODE_REFSECT2): |
/* FALLTHROUGH */ |
|
case (NODE_REFSECT3): |
case (NODE_REFSECT3): |
/* FALLTHROUGH */ |
|
case (NODE_REFSECTION): |
case (NODE_REFSECTION): |
/* FALLTHROUGH */ |
|
case (NODE_CHAPTER): |
case (NODE_CHAPTER): |
/* FALLTHROUGH */ |
|
case (NODE_SECT1): |
case (NODE_SECT1): |
/* FALLTHROUGH */ |
|
case (NODE_SECT2): |
case (NODE_SECT2): |
/* FALLTHROUGH */ |
case (NODE_SECTION): |
case (NODE_NOTE): |
case (NODE_NOTE): |
/* FALLTHROUGH */ |
|
case (NODE_TIP): |
case (NODE_TIP): |
/* FALLTHROUGH */ |
|
case (NODE_CAUTION): |
case (NODE_CAUTION): |
/* FALLTHROUGH */ |
|
case (NODE_WARNING): |
case (NODE_WARNING): |
assert(p->newln); |
assert(p->newln); |
pnode_printrefsect(p, pn); |
pnode_printrefsect(p, pn); |
Line 1614 pnode_print(struct parse *p, struct pnode *pn) |
|
Line 1646 pnode_print(struct parse *p, struct pnode *pn) |
|
NODE_REFNAME == TAILQ_NEXT(pn, child)->node) |
NODE_REFNAME == TAILQ_NEXT(pn, child)->node) |
fputs(" ,", stdout); |
fputs(" ,", stdout); |
pnode_printmclose(p, sv); |
pnode_printmclose(p, sv); |
|
break; |
|
case (NODE_PREFACE): |
|
case (NODE_REFSECT1): |
|
case (NODE_REFSECT2): |
|
case (NODE_REFSECT3): |
|
case (NODE_REFSECTION): |
|
case (NODE_CHAPTER): |
|
case (NODE_SECT1): |
|
case (NODE_SECT2): |
|
case (NODE_SECTION): |
|
case (NODE_NOTE): |
|
case (NODE_TIP): |
|
case (NODE_CAUTION): |
|
case (NODE_WARNING): |
|
p->level--; |
break; |
break; |
case (NODE_LITERALLAYOUT): |
case (NODE_LITERALLAYOUT): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |