=================================================================== RCS file: /cvs/docbook2mdoc/macro.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -p -r1.1 -r1.2 --- docbook2mdoc/macro.c 2019/03/26 19:17:29 1.1 +++ docbook2mdoc/macro.c 2019/03/28 20:41:33 1.2 @@ -1,4 +1,4 @@ -/* $Id: macro.c,v 1.1 2019/03/26 19:17:29 schwarze Exp $ */ +/* $Id: macro.c,v 1.2 2019/03/28 20:41:33 schwarze Exp $ */ /* * Copyright (c) 2019 Ingo Schwarze * @@ -157,13 +157,13 @@ macro_addnode(struct format *f, struct pnode *pn, int assert(f->linestate == LINE_MACRO); /* - * If the only child is a text node, just add that text, - * letting macro_addarg() decide about quoting. + * If this node or its only child is a text node, just add + * that text, letting macro_addarg() decide about quoting. */ - pn = TAILQ_FIRST(&pn->childq); - if (pn != NULL && pn->node == NODE_TEXT && - TAILQ_NEXT(pn, child) == NULL) { + if (pn->node == NODE_TEXT || + ((pn = TAILQ_FIRST(&pn->childq)) != NULL && + pn->node == NODE_TEXT && TAILQ_NEXT(pn, child) == NULL)) { macro_addarg(f, pn->b, flags); return; } @@ -193,10 +193,7 @@ macro_addnode(struct format *f, struct pnode *pn, int */ while (pn != NULL) { - if (pn->node == NODE_TEXT) - macro_addarg(f, pn->b, flags); - else - macro_addnode(f, pn, flags); + macro_addnode(f, pn, flags); pn = TAILQ_NEXT(pn, child); flags |= ARG_SPACE; } @@ -210,4 +207,41 @@ macro_nodeline(struct format *f, const char *name, str macro_open(f, name); macro_addnode(f, pn, ARG_SPACE | flags); macro_close(f); +} + + +/* + * Print a word on the current text line if one is open, or on a new text + * line otherwise. The flag ARG_SPACE inserts spaces between words. + */ +void +print_text(struct format *f, const char *word, int flags) { + switch (f->linestate) { + case LINE_NEW: + break; + case LINE_TEXT: + if (flags & ARG_SPACE) + putchar(' '); + break; + case LINE_MACRO: + macro_close(f); + break; + } + fputs(word, stdout); + f->linestate = LINE_TEXT; +} + +/* + * Recursively print the content of a node on a text line. + */ +void +print_textnode(struct format *f, struct pnode *n) +{ + struct pnode *nc; + + if (n->node == NODE_TEXT) + print_text(f, n->b, ARG_SPACE); + else + TAILQ_FOREACH(nc, &n->childq, child) + print_textnode(f, nc); }