=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.58 retrieving revision 1.59 diff -u -p -r1.58 -r1.59 --- docbook2mdoc/docbook2mdoc.c 2019/03/22 16:50:54 1.58 +++ docbook2mdoc/docbook2mdoc.c 2019/03/22 16:55:44 1.59 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.58 2019/03/22 16:50:54 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.59 2019/03/22 16:55:44 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -491,6 +491,22 @@ pnode_unlinksub(struct pnode *pn) } /* + * Retrieve an attribute string from a node. + * Return defval if the node has no such attribute. + */ +const char * +pnode_getattr_raw(struct pnode *pn, enum attrkey key, const char *defval) +{ + struct pattr *ap; + + TAILQ_FOREACH(ap, &pn->attrq, child) + if (ap->key == key) + return ATTRVAL__MAX == ap->val ? ap->rawval : + attrvals[ap->val]; + return(defval); +} + +/* * Reset the lookaside buffer. */ static void @@ -911,15 +927,8 @@ static void pnode_printmathfenced(struct parse *p, struct pnode *pn) { struct pnode *pp; - struct pattr *ap; - TAILQ_FOREACH(ap, &pn->attrq, child) - if (ATTRKEY_OPEN == ap->key) { - printf("left %s ", ap->rawval); - break; - } - if (NULL == ap) - printf("left ( "); + printf("left %s ", pnode_getattr_raw(pn, ATTRKEY_OPEN, "(")); pp = TAILQ_FIRST(&pn->childq); pnode_print(p, pp); @@ -929,13 +938,7 @@ pnode_printmathfenced(struct parse *p, struct pnode *p pnode_print(p, pp); } - TAILQ_FOREACH(ap, &pn->attrq, child) - if (ATTRKEY_CLOSE == ap->key) { - printf("right %s ", ap->rawval); - break; - } - if (NULL == ap) - printf("right ) "); + printf("right %s ", pnode_getattr_raw(pn, ATTRKEY_CLOSE, ")")); } /* @@ -1090,8 +1093,6 @@ static void pnode_printprologue(struct parse *p, struct pnode *pn) { struct pnode *pp; - struct pattr *ap; - const char *name; pp = NULL == p->root ? NULL : pnode_findfirst(p->root, NODE_REFMETA); @@ -1100,16 +1101,9 @@ pnode_printprologue(struct parse *p, struct pnode *pn) if (NULL != pp) { pnode_printrefmeta(p, pp); pnode_unlink(pp); - } else { - name = "UNKNOWN"; - TAILQ_FOREACH(ap, &p->root->attrq, child) { - if (ATTRKEY_ID == ap->key) { - name = ap->rawval; - break; - } - } - printf(".Dt %s 1\n", name); - } + } else + printf(".Dt %s 1\n", + pnode_getattr_raw(p->root, ATTRKEY_ID, "UNKNOWN")); puts(".Os"); if (PARSE_EQN & p->flags) { @@ -1255,7 +1249,7 @@ static void pnode_print(struct parse *p, struct pnode *pn) { struct pnode *pp; - struct pattr *ap; + const char *ccp; char *cp; int last, sv; @@ -1364,13 +1358,11 @@ pnode_print(struct parse *p, struct pnode *pn) puts(".Sh LEGAL NOTICE"); break; case (NODE_LINK): - TAILQ_FOREACH(ap, &pn->attrq, child) - if (ATTRKEY_LINKEND == ap->key) - break; - if (ap == NULL) + ccp = pnode_getattr_raw(pn, ATTRKEY_LINKEND, NULL); + if (NULL == ccp) break; pnode_printmopen(p); - printf("Sx %s\n", ap->rawval); + printf("Sx %s\n", ccp); p->newln = 1; return; case (NODE_LITERAL):