version 1.50, 2019/03/22 16:10:09 |
version 1.52, 2019/03/22 16:21:23 |
|
|
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 */ |
}; |
}; |
|
|
|
|
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"); |
puts(".Pp"); |
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 806 pnode_printrefmeta(struct parse *p, struct pnode *pn) |
|
Line 819 pnode_printrefmeta(struct parse *p, struct pnode *pn) |
|
else if (NODE_REFENTRYTITLE == pp->node) |
else if (NODE_REFENTRYTITLE == pp->node) |
title = pp; |
title = pp; |
|
|
puts(".Dd $Mdocdate" "$"); |
|
fputs(".Dt", stdout); |
fputs(".Dt", stdout); |
p->newln = 0; |
p->newln = 0; |
|
|
Line 820 pnode_printrefmeta(struct parse *p, struct pnode *pn) |
|
Line 832 pnode_printrefmeta(struct parse *p, struct pnode *pn) |
|
p->newln = 1; |
p->newln = 1; |
} else |
} else |
pnode_printmacroline(p, manvol); |
pnode_printmacroline(p, manvol); |
|
|
puts(".Os"); |
|
} |
} |
|
|
static void |
static void |
|
|
pnode_printprologue(struct parse *p, struct pnode *pn) |
pnode_printprologue(struct parse *p, struct pnode *pn) |
{ |
{ |
struct pnode *pp; |
struct pnode *pp; |
|
struct pattr *ap; |
|
const char *name; |
|
|
pp = NULL == p->root ? NULL : |
pp = NULL == p->root ? NULL : |
pnode_findfirst(p->root, NODE_REFMETA); |
pnode_findfirst(p->root, NODE_REFMETA); |
|
|
|
puts(".Dd $Mdocdate" "$"); |
if (NULL != pp) { |
if (NULL != pp) { |
pnode_printrefmeta(p, pp); |
pnode_printrefmeta(p, pp); |
pnode_unlink(pp); |
pnode_unlink(pp); |
} else { |
} else { |
puts(".\\\" Supplying bogus prologue..."); |
name = "UNKNOWN"; |
puts(".Dd $Mdocdate" "$"); |
TAILQ_FOREACH(ap, &p->root->attrq, child) { |
puts(".Dt UNKNOWN 1"); |
if (ATTRKEY_ID == ap->key) { |
puts(".Os"); |
name = ap->rawval; |
|
break; |
|
} |
|
} |
|
printf(".Dt %s 1\n", name); |
} |
} |
|
puts(".Os"); |
|
|
if (PARSE_EQN & p->flags) { |
if (PARSE_EQN & p->flags) { |
puts(".EQ"); |
puts(".EQ"); |
Line 1417 pnode_print(struct parse *p, struct pnode *pn) |
|
Line 1435 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 1609 pnode_print(struct parse *p, struct pnode *pn) |
|
Line 1619 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 */ |