=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.72 retrieving revision 1.73 diff -u -p -r1.72 -r1.73 --- docbook2mdoc/docbook2mdoc.c 2019/03/25 17:28:32 1.72 +++ docbook2mdoc/docbook2mdoc.c 2019/03/25 23:14:44 1.73 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.72 2019/03/25 17:28:32 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.73 2019/03/25 23:14:44 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -41,7 +41,6 @@ enum linestate { */ struct parse { XML_Parser xml; - enum nodeid node; /* current (NODE_ROOT if pre-tree) */ const char *fname; /* filename */ int stop; /* should we stop now? */ #define PARSE_EQN 1 @@ -249,12 +248,9 @@ xml_char(void *arg, const XML_Char *p, int sz) struct pnode *dat; int i; - /* Stopped or no tree yet. */ - if (ps->stop || ps->node == NODE_ROOT) + if (ps->stop) return; - assert(ps->cur != NULL); - /* * Are we in the midst of processing text? * If we're not processing text right now, then create a text @@ -262,7 +258,7 @@ xml_char(void *arg, const XML_Char *p, int sz) * However, don't do so unless we have some non-whitespace to * process: strip out all leading whitespace to be sure. */ - if (ps->node != NODE_TEXT) { + if (ps->cur->node != NODE_TEXT) { for (i = 0; i < sz; i++) if ( ! isspace((unsigned char)p[i])) break; @@ -276,7 +272,7 @@ xml_char(void *arg, const XML_Char *p, int sz) exit(1); } - dat->node = ps->node = NODE_TEXT; + dat->node = NODE_TEXT; dat->parent = ps->cur; TAILQ_INIT(&dat->childq); TAILQ_INIT(&dat->attrq); @@ -337,10 +333,9 @@ xml_elem_start(void *arg, const XML_Char *name, const return; /* Close out text node, if applicable... */ - if (ps->node == NODE_TEXT) { + if (ps->cur != NULL && ps->cur->node == NODE_TEXT) { pnode_trim(ps->cur); ps->cur = ps->cur->parent; - ps->node = ps->cur->node; } for (node = nodes; node->name != NULL; node++) @@ -348,19 +343,11 @@ xml_elem_start(void *arg, const XML_Char *name, const break; if (node->name == NULL) { - if (ps->node == NODE_ROOT) - return; fprintf(stderr, "%s:%zu:%zu: unknown node \"%s\"\n", ps->fname, XML_GetCurrentLineNumber(ps->xml), XML_GetCurrentColumnNumber(ps->xml), name); ps->stop = 1; return; - } else if (ps->node == NODE_ROOT && ps->root != NULL) { - fprintf(stderr, "%s:%zu:%zu: multiple refentries\n", - ps->fname, XML_GetCurrentLineNumber(ps->xml), - XML_GetCurrentColumnNumber(ps->xml)); - ps->stop = 1; - return; } if (node->node == NODE_INLINEEQUATION) @@ -371,7 +358,7 @@ xml_elem_start(void *arg, const XML_Char *name, const exit(1); } - dat->node = ps->node = node->node; + dat->node = node->node; dat->parent = ps->cur; TAILQ_INIT(&dat->childq); TAILQ_INIT(&dat->attrq); @@ -410,36 +397,30 @@ xml_elem_start(void *arg, const XML_Char *name, const pattr->rawval = strdup(att[1]); TAILQ_INSERT_TAIL(&dat->attrq, pattr, child); } - } /* * Roll up the parse tree. * If we're at a text node, roll that one up first. - * If we hit the root, then assign ourselves as the NODE_ROOT. */ static void xml_elem_end(void *arg, const XML_Char *name) { struct parse *ps = arg; + if (ps->stop) + return; + /* FIXME: find a better way to ditch other namespaces. */ - if (ps->stop || ps->node == NODE_ROOT) + if (strcmp(name, "xi:include") == 0) return; - else if (strcmp(name, "xi:include") == 0) - return; /* Close out text node, if applicable... */ - if (ps->node == NODE_TEXT) { + if (ps->cur->node == NODE_TEXT) { pnode_trim(ps->cur); ps->cur = ps->cur->parent; - ps->node = ps->cur->node; } - - if ((ps->cur = ps->cur->parent) == NULL) - ps->node = NODE_ROOT; - else - ps->node = ps->cur->node; + ps->cur = ps->cur->parent; } /* @@ -500,6 +481,8 @@ pnode_getattr(struct pnode *pn, enum attrkey key) { struct pattr *ap; + if (pn == NULL) + return ATTRVAL__MAX; TAILQ_FOREACH(ap, &pn->attrq, child) if (ap->key == key) return ap->val; @@ -515,6 +498,8 @@ pnode_getattr_raw(struct pnode *pn, enum attrkey key, { struct pattr *ap; + if (pn == NULL) + return defval; TAILQ_FOREACH(ap, &pn->attrq, child) if (ap->key == key) return ap->val == ATTRVAL__MAX ? ap->rawval : @@ -1604,8 +1589,7 @@ readfile(XML_Parser xp, int fd, int rc; ssize_t ssz; - memset(&p, 0, sizeof(struct parse)); - + memset(&p, 0, sizeof(p)); p.fname = fn; p.xml = xp;