=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.132 retrieving revision 1.141 diff -u -p -r1.132 -r1.141 --- docbook2mdoc/docbook2mdoc.c 2019/04/21 14:48:11 1.132 +++ docbook2mdoc/docbook2mdoc.c 2019/04/28 17:10:06 1.141 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.132 2019/04/21 14:48:11 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.141 2019/04/28 17:10:06 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -21,6 +21,7 @@ #include #include +#include "xmalloc.h" #include "node.h" #include "macro.h" #include "format.h" @@ -42,7 +43,8 @@ pnode_printtext(struct format *f, struct pnode *n) cp = n->b; 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 (;;) { if (*cp == '\0') return; @@ -71,14 +73,15 @@ pnode_printtext(struct format *f, struct pnode *n) */ 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)) { case CLASS_LINE: case CLASS_ENCL: macro_open(f, "Pf"); accept_arg = 1; f->flags |= FMT_CHILD; - nn->spc = 1; + nn->flags |= NFLAG_SPC; break; default: break; @@ -89,18 +92,22 @@ pnode_printtext(struct format *f, struct pnode *n) case LINE_NEW: break; case LINE_TEXT: - if (n->spc) { - if (n->node == NODE_TEXT) + if (n->flags & NFLAG_SPC) { + if (n->flags & NFLAG_LINE && + pnode_class(n->node) == CLASS_TEXT) macro_close(f); else putchar(' '); } break; case LINE_MACRO: - if (accept_arg) - putchar(' '); - else + if (accept_arg == 0) 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; } @@ -722,73 +729,34 @@ pnode_printolink(struct format *f, struct pnode *n) static void pnode_printprologue(struct format *f, struct pnode *root) { - struct pnode *date, *refmeta, *name, *vol, *descr, *nc, *nn; - const char *sname; + struct pnode *name, *nc; - /* Collect information. */ + nc = TAILQ_FIRST(&root->childq); + assert(nc->node == NODE_DATE); + macro_nodeline(f, "Dd", nc, 0); + pnode_unlink(nc); - if ((date = pnode_takefirst(root, NODE_PUBDATE)) == NULL) - date = pnode_takefirst(root, NODE_DATE); - - name = vol = NULL; - if ((refmeta = pnode_findfirst(root, NODE_REFMETA)) != NULL) { - TAILQ_FOREACH_SAFE(nc, &refmeta->childq, child, nn) { - switch (nc->node) { - case NODE_REFENTRYTITLE: - name = nc; - break; - case NODE_MANVOLNUM: - vol = nc; - break; - default: - continue; - } - TAILQ_REMOVE(&refmeta->childq, nc, child); - } - } - - if (pnode_findfirst(root, NODE_REFNAMEDIV) == NULL && - ((nc = pnode_findfirst(root, NODE_BOOKINFO)) != NULL || - (nc = pnode_findfirst(root, NODE_REFENTRYINFO)) != NULL)) - descr = pnode_takefirst(nc, NODE_TITLE); - else - descr = NULL; - - /* Print prologue. */ - - if (date == NULL) - macro_line(f, "Dd $Mdocdate" "$"); - else - macro_nodeline(f, "Dd", date, 0); - macro_open(f, "Dt"); - if (name == NULL) { - sname = pnode_getattr_raw(root, ATTRKEY_ID, "UNKNOWN"); - macro_addarg(f, sname, ARG_SPACE | ARG_SINGLE | ARG_UPPER); - } else - macro_addnode(f, name, ARG_SPACE | ARG_SINGLE | ARG_UPPER); - if (vol == NULL) - macro_addarg(f, "1", ARG_SPACE); - else - macro_addnode(f, vol, ARG_SPACE | ARG_SINGLE); + name = TAILQ_FIRST(&root->childq); + assert(name->node == NODE_REFENTRYTITLE); + macro_addnode(f, name, ARG_SPACE | ARG_SINGLE | ARG_UPPER); + TAILQ_REMOVE(&root->childq, name, child); + name->parent = NULL; + nc = TAILQ_FIRST(&root->childq); + assert (nc->node == NODE_MANVOLNUM); + macro_addnode(f, nc, ARG_SPACE | ARG_SINGLE); + pnode_unlink(nc); macro_line(f, "Os"); - if (descr != NULL) { + nc = TAILQ_FIRST(&root->childq); + if (nc != NULL && nc->node == NODE_TITLE) { macro_line(f, "Sh NAME"); - if (name == NULL) - macro_argline(f, "Nm", sname); - else - macro_nodeline(f, "Nm", name, ARG_SINGLE); - macro_nodeline(f, "Nd", descr, 0); + macro_nodeline(f, "Nm", name, ARG_SINGLE); + macro_nodeline(f, "Nd", nc, 0); + pnode_unlink(nc); } - - /* Clean up. */ - - pnode_unlink(date); pnode_unlink(name); - pnode_unlink(vol); - pnode_unlink(descr); f->parastate = PARA_HAVE; } @@ -812,6 +780,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); @@ -880,31 +850,17 @@ pnode_printrefentry(struct format *f, struct pnode *n) */ if (match == NULL) { - if ((match = calloc(1, sizeof(*match))) == NULL) { - perror(NULL); - exit(1); - } + match = xcalloc(1, sizeof(*match)); match->node = NODE_SECTION; - match->spc = 1; + match->flags |= NFLAG_SPC; match->parent = n; TAILQ_INIT(&match->childq); TAILQ_INIT(&match->attrq); - if ((nc = pnode_alloc(match)) == NULL) { - perror(NULL); - exit(1); - } + nc = pnode_alloc(match); nc->node = NODE_TITLE; - nc->spc = 1; - if ((nc = pnode_alloc(nc)) == NULL) { - perror(NULL); - exit(1); - } - nc->node = NODE_TEXT; - if ((nc->b = strdup("AUTHORS")) == NULL) { - perror(NULL); - exit(1); - } - nc->spc = 1; + nc->flags |= NFLAG_SPC; + nc = pnode_alloc_text(nc, "AUTHORS"); + nc->flags |= NFLAG_SPC; if (later == NULL) TAILQ_INSERT_TAIL(&n->childq, match, child); else @@ -929,16 +885,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; @@ -946,14 +903,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; @@ -1033,6 +991,7 @@ pnode_printtgroup2(struct format *f, struct pnode *n) pnode_unlink(nr); } macro_line(f, "El"); + f->parastate = PARA_WANT; pnode_unlinksub(n); } @@ -1059,6 +1018,7 @@ pnode_printtgroup(struct format *f, struct pnode *n) pnode_printrow(f, nc); } macro_line(f, "El"); + f->parastate = PARA_WANT; pnode_unlinksub(n); } @@ -1078,6 +1038,7 @@ pnode_printlist(struct format *f, struct pnode *n) f->parastate = PARA_HAVE; } macro_line(f, "El"); + f->parastate = PARA_WANT; pnode_unlinksub(n); } @@ -1096,6 +1057,7 @@ pnode_printvariablelist(struct format *f, struct pnode macro_nodeline(f, "It", nc, 0); } macro_line(f, "El"); + f->parastate = PARA_WANT; pnode_unlinksub(n); } @@ -1115,7 +1077,7 @@ pnode_print(struct format *f, struct pnode *n) return; was_impl = f->flags & FMT_IMPL; - if (n->spc) + if (n->flags & NFLAG_SPC) f->flags &= ~FMT_NOSPC; else f->flags |= FMT_NOSPC; @@ -1280,8 +1242,8 @@ pnode_print(struct format *f, struct pnode *n) if ((nc = TAILQ_FIRST(&n->childq)) != NULL && nc->node == NODE_FILENAME && TAILQ_NEXT(nc, child) == NULL) { - if (n->spc) - nc->spc = 1; + if (n->flags & NFLAG_SPC) + nc->flags |= NFLAG_SPC; } else if (was_impl) macro_open(f, "Do"); else { @@ -1339,12 +1301,12 @@ pnode_print(struct format *f, struct pnode *n) else print_text(f, "_", 0); if ((nc = TAILQ_FIRST(&n->childq)) != NULL) - nc->spc = 0; + nc->flags &= ~(NFLAG_LINE | NFLAG_SPC); break; case NODE_SUPERSCRIPT: fputs("\\(ha", stdout); if ((nc = TAILQ_FIRST(&n->childq)) != NULL) - nc->spc = 0; + nc->flags &= ~(NFLAG_LINE | NFLAG_SPC); break; case NODE_TEXT: case NODE_ESCAPE: @@ -1476,6 +1438,7 @@ pnode_print(struct format *f, struct pnode *n) case NODE_SYNOPSIS: f->parastate = PARA_HAVE; macro_line(f, "Ed"); + f->parastate = PARA_WANT; break; case NODE_TITLE: case NODE_SUBTITLE: