version 1.116, 2019/04/13 13:06:35 |
version 1.117, 2019/04/13 15:13:31 |
Line 442 pnode_printarg(struct format *f, struct pnode *n) |
|
Line 442 pnode_printarg(struct format *f, struct pnode *n) |
|
f->flags |= FMT_IMPL; |
f->flags |= FMT_IMPL; |
} |
} |
} |
} |
|
|
TAILQ_FOREACH(nc, &n->childq, child) { |
TAILQ_FOREACH(nc, &n->childq, child) { |
if (nc->node == NODE_TEXT) |
if (nc->node == NODE_TEXT) |
macro_open(f, "Ar"); |
macro_open(f, "Ar"); |
pnode_print(f, nc); |
pnode_print(f, nc); |
if (isrep && nc->node == NODE_TEXT) |
|
macro_addarg(f, "...", ARG_SPACE); |
|
} |
} |
|
if (isrep && f->linestate == LINE_MACRO) |
|
macro_addarg(f, "...", ARG_SPACE); |
if (isop) { |
if (isop) { |
if (was_impl) |
if (was_impl) |
macro_open(f, "Oc"); |
macro_open(f, "Oc"); |
Line 462 pnode_printarg(struct format *f, struct pnode *n) |
|
Line 461 pnode_printarg(struct format *f, struct pnode *n) |
|
static void |
static void |
pnode_printgroup(struct format *f, struct pnode *n) |
pnode_printgroup(struct format *f, struct pnode *n) |
{ |
{ |
struct pnode *nc, *nn; |
struct pnode *nc; |
struct pattr *a; |
struct pattr *a; |
int isop, sv; |
int bar, isop, isrep, was_impl; |
|
|
isop = 1; |
isop = 1; |
TAILQ_FOREACH(a, &n->attrq, child) |
isrep = was_impl = 0; |
|
TAILQ_FOREACH(a, &n->attrq, child) { |
if (a->key == ATTRKEY_CHOICE && |
if (a->key == ATTRKEY_CHOICE && |
(a->val == ATTRVAL_PLAIN || a->val == ATTRVAL_REQ)) { |
(a->val == ATTRVAL_PLAIN || a->val == ATTRVAL_REQ)) |
isop = 0; |
isop = 0; |
break; |
else if (a->key == ATTRKEY_REP && a->val == ATTRVAL_REPEAT) |
|
isrep = 1; |
|
} |
|
if (isop) { |
|
if (f->flags & FMT_IMPL) { |
|
was_impl = 1; |
|
macro_open(f, "Oo"); |
|
} else { |
|
macro_open(f, "Op"); |
|
f->flags |= FMT_IMPL; |
} |
} |
|
} else if (isrep) { |
/* |
if (f->flags & FMT_IMPL) { |
* Make sure we're on a macro line. |
was_impl = 1; |
* This will prevent pnode_print() for putting us on a |
macro_open(f, "Bro"); |
* subsequent line. |
} else { |
*/ |
macro_open(f, "Brq"); |
sv = f->linestate == LINE_NEW; |
f->flags |= FMT_IMPL; |
if (isop) |
} |
macro_open(f, "Op"); |
} |
else if (sv) |
bar = 0; |
macro_open(f, "No"); |
|
f->flags |= FMT_IMPL; |
|
|
|
/* |
|
* Keep on printing text separated by the vertical bar as long |
|
* as we're within the same origin node as the group. |
|
* This is kind of a nightmare. |
|
* Eh, DocBook... |
|
* FIXME: if there's a "Fl", we don't cut off the leading "-" |
|
* like we do in pnode_print(). |
|
*/ |
|
TAILQ_FOREACH(nc, &n->childq, child) { |
TAILQ_FOREACH(nc, &n->childq, child) { |
pnode_print(f, nc); |
if (bar && f->linestate == LINE_MACRO) |
nn = TAILQ_NEXT(nc, child); |
|
while (nn != NULL) { |
|
if (nc->node != nn->node) |
|
break; |
|
macro_addarg(f, "|", ARG_SPACE); |
macro_addarg(f, "|", ARG_SPACE); |
macro_addnode(f, nn, ARG_SPACE); |
pnode_print(f, nc); |
nc = nn; |
bar = 1; |
nn = TAILQ_NEXT(nn, child); |
|
} |
|
} |
} |
if (sv) |
if (isop) { |
macro_close(f); |
if (was_impl) |
f->flags &= ~FMT_IMPL; |
macro_open(f, "Oc"); |
|
else |
|
f->flags &= ~FMT_IMPL; |
|
} else if (isrep) { |
|
if (was_impl) |
|
macro_open(f, "Brc"); |
|
else |
|
f->flags &= ~FMT_IMPL; |
|
} |
|
if (isrep && f->linestate == LINE_MACRO) |
|
macro_addarg(f, "...", ARG_SPACE); |
pnode_unlinksub(n); |
pnode_unlinksub(n); |
} |
} |
|
|