version 1.130, 2019/04/16 14:26:27 |
version 1.138, 2019/04/24 18:38:02 |
Line 42 pnode_printtext(struct format *f, struct pnode *n) |
|
Line 42 pnode_printtext(struct format *f, struct pnode *n) |
|
|
|
cp = n->b; |
cp = n->b; |
accept_arg = f->flags & FMT_ARG; |
accept_arg = f->flags & FMT_ARG; |
if (f->linestate == LINE_MACRO && !n->spc && !accept_arg) { |
if (f->linestate == LINE_MACRO && !accept_arg && |
|
(n->flags & NFLAG_SPC) == 0) { |
for (;;) { |
for (;;) { |
if (*cp == '\0') |
if (*cp == '\0') |
return; |
return; |
Line 71 pnode_printtext(struct format *f, struct pnode *n) |
|
Line 72 pnode_printtext(struct format *f, struct pnode *n) |
|
*/ |
*/ |
|
|
if (f->linestate != LINE_MACRO && |
if (f->linestate != LINE_MACRO && |
(nn = TAILQ_NEXT(n, child)) != NULL && nn->spc == 0) { |
(nn = TAILQ_NEXT(n, child)) != NULL && |
|
(nn->flags & NFLAG_SPC) == 0) { |
switch (pnode_class(nn->node)) { |
switch (pnode_class(nn->node)) { |
case CLASS_LINE: |
case CLASS_LINE: |
case CLASS_ENCL: |
case CLASS_ENCL: |
macro_open(f, "Pf"); |
macro_open(f, "Pf"); |
accept_arg = 1; |
accept_arg = 1; |
f->flags |= FMT_CHILD; |
f->flags |= FMT_CHILD; |
nn->spc = 1; |
nn->flags |= NFLAG_SPC; |
break; |
break; |
default: |
default: |
break; |
break; |
Line 89 pnode_printtext(struct format *f, struct pnode *n) |
|
Line 91 pnode_printtext(struct format *f, struct pnode *n) |
|
case LINE_NEW: |
case LINE_NEW: |
break; |
break; |
case LINE_TEXT: |
case LINE_TEXT: |
if (n->spc) { |
if (n->flags & NFLAG_SPC) { |
if (n->node == NODE_TEXT) |
if (n->flags & NFLAG_LINE && |
|
pnode_class(n->node) == CLASS_TEXT) |
macro_close(f); |
macro_close(f); |
else |
else |
putchar(' '); |
putchar(' '); |
} |
} |
break; |
break; |
case LINE_MACRO: |
case LINE_MACRO: |
if (accept_arg) |
if (accept_arg == 0) |
putchar(' '); |
|
else |
|
macro_close(f); |
macro_close(f); |
|
else if (n->flags & NFLAG_SPC || |
|
(f->flags & FMT_ARG) == 0 || |
|
(nn = TAILQ_PREV(n, pnodeq, child)) == NULL || |
|
pnode_class(nn->node) != CLASS_TEXT) |
|
putchar(' '); |
break; |
break; |
} |
} |
|
|
Line 315 pnode_printciterefentry(struct format *f, struct pnode |
|
Line 321 pnode_printciterefentry(struct format *f, struct pnode |
|
pnode_unlinksub(n); |
pnode_unlinksub(n); |
} |
} |
|
|
static void |
|
pnode_printfuncdef(struct format *f, struct pnode *n) |
|
{ |
|
struct pnode *nc; |
|
|
|
nc = TAILQ_FIRST(&n->childq); |
|
if (nc != NULL && nc->node == NODE_TEXT) { |
|
macro_argline(f, "Ft", nc->b); |
|
pnode_unlink(nc); |
|
} |
|
macro_nodeline(f, "Fo", n, ARG_SINGLE); |
|
pnode_unlinksub(n); |
|
} |
|
|
|
/* |
/* |
* The <mml:mfenced> node is a little peculiar. |
* The <mml:mfenced> node is a little peculiar. |
* First, it can have arbitrary open and closing tokens, which default |
* First, it can have arbitrary open and closing tokens, which default |
Line 389 pnode_printmath(struct format *f, struct pnode *n) |
|
Line 381 pnode_printmath(struct format *f, struct pnode *n) |
|
static void |
static void |
pnode_printfuncprototype(struct format *f, struct pnode *n) |
pnode_printfuncprototype(struct format *f, struct pnode *n) |
{ |
{ |
struct pnode *nc, *fdef; |
struct pnode *fdef, *ftype, *nc, *nn; |
|
|
TAILQ_FOREACH(fdef, &n->childq, child) |
/* |
if (fdef->node == NODE_FUNCDEF) |
* Extract <funcdef> child and ignore <void> child. |
|
* Leave other children in place, to be treated as parameters. |
|
*/ |
|
|
|
fdef = NULL; |
|
TAILQ_FOREACH_SAFE(nc, &n->childq, child, nn) { |
|
switch (nc->node) { |
|
case NODE_FUNCDEF: |
|
if (fdef == NULL) { |
|
fdef = nc; |
|
TAILQ_REMOVE(&n->childq, nc, child); |
|
nc->parent = NULL; |
|
} |
break; |
break; |
|
case NODE_VOID: |
|
pnode_unlink(nc); |
|
break; |
|
default: |
|
break; |
|
} |
|
} |
|
|
|
/* |
|
* If no children are left, the function is void; use .Fn. |
|
* Otherwise, use .Fo. |
|
*/ |
|
|
|
nc = TAILQ_FIRST(&n->childq); |
if (fdef != NULL) { |
if (fdef != NULL) { |
pnode_printfuncdef(f, fdef); |
ftype = TAILQ_FIRST(&fdef->childq); |
|
if (ftype != NULL && ftype->node == NODE_TEXT) { |
|
macro_argline(f, "Ft", ftype->b); |
|
pnode_unlink(ftype); |
|
} |
|
if (nc == NULL) { |
|
macro_open(f, "Fn"); |
|
macro_addnode(f, fdef, ARG_SPACE | ARG_SINGLE); |
|
macro_addarg(f, "void", ARG_SPACE); |
|
macro_close(f); |
|
} else |
|
macro_nodeline(f, "Fo", fdef, ARG_SINGLE); |
pnode_unlink(fdef); |
pnode_unlink(fdef); |
} else |
} else if (nc == NULL) |
|
macro_line(f, "Fn UNKNOWN void"); |
|
else |
macro_line(f, "Fo UNKNOWN"); |
macro_line(f, "Fo UNKNOWN"); |
|
|
TAILQ_FOREACH(nc, &n->childq, child) |
if (nc == NULL) |
macro_nodeline(f, "Fa", nc, ARG_SINGLE); |
return; |
|
|
|
while (nc != NULL) { |
|
macro_nodeline(f, "Fa", nc, ARG_SINGLE); |
|
pnode_unlink(nc); |
|
nc = TAILQ_FIRST(&n->childq); |
|
} |
macro_line(f, "Fc"); |
macro_line(f, "Fc"); |
pnode_unlinksub(n); |
|
} |
} |
|
|
/* |
/* |
Line 784 pnode_printrefentry(struct format *f, struct pnode *n) |
|
Line 818 pnode_printrefentry(struct format *f, struct pnode *n) |
|
pnode_unlink(info); |
pnode_unlink(info); |
info = NULL; |
info = NULL; |
} |
} |
|
if (info == NULL) |
|
info = pnode_takefirst(n, NODE_INFO); |
meta = pnode_takefirst(n, NODE_REFMETA); |
meta = pnode_takefirst(n, NODE_REFMETA); |
if (meta != NULL && TAILQ_FIRST(&meta->childq) == NULL) { |
if (meta != NULL && TAILQ_FIRST(&meta->childq) == NULL) { |
pnode_unlink(meta); |
pnode_unlink(meta); |
Line 857 pnode_printrefentry(struct format *f, struct pnode *n) |
|
Line 893 pnode_printrefentry(struct format *f, struct pnode *n) |
|
exit(1); |
exit(1); |
} |
} |
match->node = NODE_SECTION; |
match->node = NODE_SECTION; |
match->spc = 1; |
match->flags |= NFLAG_SPC; |
match->parent = n; |
match->parent = n; |
TAILQ_INIT(&match->childq); |
TAILQ_INIT(&match->childq); |
TAILQ_INIT(&match->attrq); |
TAILQ_INIT(&match->attrq); |
Line 866 pnode_printrefentry(struct format *f, struct pnode *n) |
|
Line 902 pnode_printrefentry(struct format *f, struct pnode *n) |
|
exit(1); |
exit(1); |
} |
} |
nc->node = NODE_TITLE; |
nc->node = NODE_TITLE; |
nc->spc = 1; |
nc->flags |= NFLAG_SPC; |
if ((nc = pnode_alloc(nc)) == NULL) { |
if ((nc = pnode_alloc(nc)) == NULL) { |
perror(NULL); |
perror(NULL); |
exit(1); |
exit(1); |
Line 876 pnode_printrefentry(struct format *f, struct pnode *n) |
|
Line 912 pnode_printrefentry(struct format *f, struct pnode *n) |
|
perror(NULL); |
perror(NULL); |
exit(1); |
exit(1); |
} |
} |
nc->spc = 1; |
nc->flags |= NFLAG_SPC; |
if (later == NULL) |
if (later == NULL) |
TAILQ_INSERT_TAIL(&n->childq, match, child); |
TAILQ_INSERT_TAIL(&n->childq, match, child); |
else |
else |
Line 901 pnode_printrefentry(struct format *f, struct pnode *n) |
|
Line 937 pnode_printrefentry(struct format *f, struct pnode *n) |
|
static void |
static void |
pnode_printvarlistentry(struct format *f, struct pnode *n) |
pnode_printvarlistentry(struct format *f, struct pnode *n) |
{ |
{ |
struct pnode *nc, *nn; |
struct pnode *nc, *nn, *ncc; |
int first = 1; |
int comma; |
|
|
macro_open(f, "It"); |
macro_open(f, "It"); |
f->parastate = PARA_HAVE; |
f->parastate = PARA_HAVE; |
f->flags |= FMT_IMPL; |
f->flags |= FMT_IMPL; |
|
comma = -1; |
TAILQ_FOREACH_SAFE(nc, &n->childq, child, nn) { |
TAILQ_FOREACH_SAFE(nc, &n->childq, child, nn) { |
if (nc->node != NODE_TERM && nc->node != NODE_GLOSSTERM) |
if (nc->node != NODE_TERM && nc->node != NODE_GLOSSTERM) |
continue; |
continue; |
if (first == 0) { |
if (comma != -1) { |
switch (f->linestate) { |
switch (f->linestate) { |
case LINE_NEW: |
case LINE_NEW: |
break; |
break; |
Line 918 pnode_printvarlistentry(struct format *f, struct pnode |
|
Line 955 pnode_printvarlistentry(struct format *f, struct pnode |
|
print_text(f, ",", 0); |
print_text(f, ",", 0); |
break; |
break; |
case LINE_MACRO: |
case LINE_MACRO: |
macro_addarg(f, ",", 0); |
macro_addarg(f, ",", comma); |
break; |
break; |
} |
} |
} |
} |
f->parastate = PARA_HAVE; |
f->parastate = PARA_HAVE; |
|
comma = (ncc = TAILQ_FIRST(&nc->childq)) == NULL || |
|
pnode_class(ncc->node) == CLASS_TEXT ? 0 : ARG_SPACE; |
pnode_print(f, nc); |
pnode_print(f, nc); |
pnode_unlink(nc); |
pnode_unlink(nc); |
first = 0; |
|
} |
} |
macro_close(f); |
macro_close(f); |
f->parastate = PARA_HAVE; |
f->parastate = PARA_HAVE; |
Line 1005 pnode_printtgroup2(struct format *f, struct pnode *n) |
|
Line 1043 pnode_printtgroup2(struct format *f, struct pnode *n) |
|
pnode_unlink(nr); |
pnode_unlink(nr); |
} |
} |
macro_line(f, "El"); |
macro_line(f, "El"); |
|
f->parastate = PARA_WANT; |
pnode_unlinksub(n); |
pnode_unlinksub(n); |
} |
} |
|
|
Line 1031 pnode_printtgroup(struct format *f, struct pnode *n) |
|
Line 1070 pnode_printtgroup(struct format *f, struct pnode *n) |
|
pnode_printrow(f, nc); |
pnode_printrow(f, nc); |
} |
} |
macro_line(f, "El"); |
macro_line(f, "El"); |
|
f->parastate = PARA_WANT; |
pnode_unlinksub(n); |
pnode_unlinksub(n); |
} |
} |
|
|
Line 1050 pnode_printlist(struct format *f, struct pnode *n) |
|
Line 1090 pnode_printlist(struct format *f, struct pnode *n) |
|
f->parastate = PARA_HAVE; |
f->parastate = PARA_HAVE; |
} |
} |
macro_line(f, "El"); |
macro_line(f, "El"); |
|
f->parastate = PARA_WANT; |
pnode_unlinksub(n); |
pnode_unlinksub(n); |
} |
} |
|
|
Line 1068 pnode_printvariablelist(struct format *f, struct pnode |
|
Line 1109 pnode_printvariablelist(struct format *f, struct pnode |
|
macro_nodeline(f, "It", nc, 0); |
macro_nodeline(f, "It", nc, 0); |
} |
} |
macro_line(f, "El"); |
macro_line(f, "El"); |
|
f->parastate = PARA_WANT; |
pnode_unlinksub(n); |
pnode_unlinksub(n); |
} |
} |
|
|
Line 1087 pnode_print(struct format *f, struct pnode *n) |
|
Line 1129 pnode_print(struct format *f, struct pnode *n) |
|
return; |
return; |
|
|
was_impl = f->flags & FMT_IMPL; |
was_impl = f->flags & FMT_IMPL; |
if (n->spc) |
if (n->flags & NFLAG_SPC) |
f->flags &= ~FMT_NOSPC; |
f->flags &= ~FMT_NOSPC; |
else |
else |
f->flags |= FMT_NOSPC; |
f->flags |= FMT_NOSPC; |
Line 1184 pnode_print(struct format *f, struct pnode *n) |
|
Line 1226 pnode_print(struct format *f, struct pnode *n) |
|
pnode_printgroup(f, n); |
pnode_printgroup(f, n); |
break; |
break; |
case NODE_KEYSYM: |
case NODE_KEYSYM: |
|
case NODE_PRODUCTNAME: |
macro_open(f, "Sy"); |
macro_open(f, "Sy"); |
break; |
break; |
case NODE_LINK: |
case NODE_LINK: |
Line 1251 pnode_print(struct format *f, struct pnode *n) |
|
Line 1294 pnode_print(struct format *f, struct pnode *n) |
|
if ((nc = TAILQ_FIRST(&n->childq)) != NULL && |
if ((nc = TAILQ_FIRST(&n->childq)) != NULL && |
nc->node == NODE_FILENAME && |
nc->node == NODE_FILENAME && |
TAILQ_NEXT(nc, child) == NULL) { |
TAILQ_NEXT(nc, child) == NULL) { |
if (n->spc) |
if (n->flags & NFLAG_SPC) |
nc->spc = 1; |
nc->flags |= NFLAG_SPC; |
} else if (was_impl) |
} else if (was_impl) |
macro_open(f, "Do"); |
macro_open(f, "Do"); |
else { |
else { |
Line 1310 pnode_print(struct format *f, struct pnode *n) |
|
Line 1353 pnode_print(struct format *f, struct pnode *n) |
|
else |
else |
print_text(f, "_", 0); |
print_text(f, "_", 0); |
if ((nc = TAILQ_FIRST(&n->childq)) != NULL) |
if ((nc = TAILQ_FIRST(&n->childq)) != NULL) |
nc->spc = 0; |
nc->flags &= ~(NFLAG_LINE | NFLAG_SPC); |
break; |
break; |
case NODE_SUPERSCRIPT: |
case NODE_SUPERSCRIPT: |
fputs("\\(ha", stdout); |
fputs("\\(ha", stdout); |
if ((nc = TAILQ_FIRST(&n->childq)) != NULL) |
if ((nc = TAILQ_FIRST(&n->childq)) != NULL) |
nc->spc = 0; |
nc->flags &= ~(NFLAG_LINE | NFLAG_SPC); |
break; |
break; |
case NODE_TEXT: |
case NODE_TEXT: |
case NODE_ESCAPE: |
case NODE_ESCAPE: |
Line 1340 pnode_print(struct format *f, struct pnode *n) |
|
Line 1383 pnode_print(struct format *f, struct pnode *n) |
|
case NODE_VARNAME: |
case NODE_VARNAME: |
macro_open(f, "Va"); |
macro_open(f, "Va"); |
break; |
break; |
|
case NODE_VOID: |
|
print_text(f, "void", ARG_SPACE); |
|
break; |
case NODE_XREF: |
case NODE_XREF: |
pnode_printxref(f, n); |
pnode_printxref(f, n); |
break; |
break; |
Line 1444 pnode_print(struct format *f, struct pnode *n) |
|
Line 1490 pnode_print(struct format *f, struct pnode *n) |
|
case NODE_SYNOPSIS: |
case NODE_SYNOPSIS: |
f->parastate = PARA_HAVE; |
f->parastate = PARA_HAVE; |
macro_line(f, "Ed"); |
macro_line(f, "Ed"); |
|
f->parastate = PARA_WANT; |
break; |
break; |
case NODE_TITLE: |
case NODE_TITLE: |
case NODE_SUBTITLE: |
case NODE_SUBTITLE: |