=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.130 retrieving revision 1.134 diff -u -p -r1.130 -r1.134 --- docbook2mdoc/docbook2mdoc.c 2019/04/16 14:26:27 1.130 +++ docbook2mdoc/docbook2mdoc.c 2019/04/23 22:25:28 1.134 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.130 2019/04/16 14:26:27 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.134 2019/04/23 22:25:28 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -315,20 +315,6 @@ pnode_printciterefentry(struct format *f, struct pnode 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 node is a little peculiar. * First, it can have arbitrary open and closing tokens, which default @@ -389,23 +375,65 @@ pnode_printmath(struct format *f, struct pnode *n) static void 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 child and ignore 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; + 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) { - 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); - } else + } else if (nc == NULL) + macro_line(f, "Fn UNKNOWN void"); + else macro_line(f, "Fo UNKNOWN"); - TAILQ_FOREACH(nc, &n->childq, child) - macro_nodeline(f, "Fa", nc, ARG_SINGLE); + if (nc == NULL) + return; + while (nc != NULL) { + macro_nodeline(f, "Fa", nc, ARG_SINGLE); + pnode_unlink(nc); + nc = TAILQ_FIRST(&n->childq); + } macro_line(f, "Fc"); - pnode_unlinksub(n); } /* @@ -784,6 +812,8 @@ pnode_printrefentry(struct format *f, struct pnode *n) pnode_unlink(info); info = NULL; } + if (info == NULL) + info = pnode_takefirst(n, NODE_INFO); meta = pnode_takefirst(n, NODE_REFMETA); if (meta != NULL && TAILQ_FIRST(&meta->childq) == NULL) { pnode_unlink(meta); @@ -901,16 +931,17 @@ pnode_printrefentry(struct format *f, struct pnode *n) static void pnode_printvarlistentry(struct format *f, struct pnode *n) { - struct pnode *nc, *nn; - int first = 1; + struct pnode *nc, *nn, *ncc; + int comma; macro_open(f, "It"); f->parastate = PARA_HAVE; f->flags |= FMT_IMPL; + comma = -1; TAILQ_FOREACH_SAFE(nc, &n->childq, child, nn) { if (nc->node != NODE_TERM && nc->node != NODE_GLOSSTERM) continue; - if (first == 0) { + if (comma != -1) { switch (f->linestate) { case LINE_NEW: break; @@ -918,14 +949,15 @@ pnode_printvarlistentry(struct format *f, struct pnode print_text(f, ",", 0); break; case LINE_MACRO: - macro_addarg(f, ",", 0); + macro_addarg(f, ",", comma); break; } } 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_unlink(nc); - first = 0; } macro_close(f); f->parastate = PARA_HAVE; @@ -1184,6 +1216,7 @@ pnode_print(struct format *f, struct pnode *n) pnode_printgroup(f, n); break; case NODE_KEYSYM: + case NODE_PRODUCTNAME: macro_open(f, "Sy"); break; case NODE_LINK: @@ -1339,6 +1372,9 @@ pnode_print(struct format *f, struct pnode *n) break; case NODE_VARNAME: macro_open(f, "Va"); + break; + case NODE_VOID: + print_text(f, "void", ARG_SPACE); break; case NODE_XREF: pnode_printxref(f, n);