=================================================================== RCS file: /cvs/docbook2mdoc/parse.c,v retrieving revision 1.48 retrieving revision 1.50 diff -u -p -r1.48 -r1.50 --- docbook2mdoc/parse.c 2019/04/21 14:48:11 1.48 +++ docbook2mdoc/parse.c 2019/04/23 15:47:23 1.50 @@ -1,4 +1,4 @@ -/* $Id: parse.c,v 1.48 2019/04/21 14:48:11 schwarze Exp $ */ +/* $Id: parse.c,v 1.50 2019/04/23 15:47:23 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -383,6 +383,7 @@ xml_entity(struct parse *p, const char *name) struct pnode *n; const char *ccp; char *cp; + unsigned int codepoint; enum pstate pstate; if (p->del > 0) @@ -427,6 +428,16 @@ xml_entity(struct parse *p, const char *name) return; } } + if (*name == '#') { + codepoint = strtonum(name + 1, 0, 0x10ffff, &ccp); + if (ccp == NULL) { + if ((n = pnode_alloc(p->cur)) == NULL || + asprintf(&n->b, "\\[u%4.4X]", + codepoint) < 0) + fatal(p); + goto done; + } + } error_msg(p, "unknown entity &%s;", name); return; } @@ -435,6 +446,7 @@ xml_entity(struct parse *p, const char *name) if ((n = pnode_alloc(p->cur)) == NULL || (n->b = strdup(entity->roff)) == NULL) fatal(p); +done: n->node = NODE_ESCAPE; n->spc = (p->flags & PFLAG_SPC) != 0; p->flags &= ~PFLAG_SPC; @@ -626,6 +638,7 @@ xml_elem_end(struct parse *p, const char *name) if (p->del == 0) pnode_closetext(p, 0); + n = p->cur; node = name == NULL ? p->ncur : xml_name2node(p, name); switch (node) { @@ -638,8 +651,7 @@ xml_elem_end(struct parse *p, const char *name) case NODE_UNKNOWN: break; case NODE_INCLUDE: - n = p->cur; - p->cur = p->cur->parent; + p->cur = n->parent; cp = pnode_getattr_raw(n, ATTRKEY_HREF, NULL); if (cp == NULL) error_msg(p, " element " @@ -655,7 +667,7 @@ xml_elem_end(struct parse *p, const char *name) p->flags &= ~PFLAG_EEND; /* FALLTHROUGH */ default: - if (p->cur == NULL || node != p->cur->node) { + if (n == NULL || node != n->node) { warn_msg(p, "element not open: ", name); break; } @@ -669,13 +681,21 @@ xml_elem_end(struct parse *p, const char *name) * obviously better than discarding it or crashing. */ - if (p->cur->parent != NULL || node == NODE_DOCTYPE) { - p->cur = p->cur->parent; + if (n->parent != NULL || node == NODE_DOCTYPE) { + p->cur = n->parent; if (p->cur != NULL) p->ncur = p->cur->node; } else p->tree->flags |= TREE_CLOSED; p->flags &= ~PFLAG_SPC; + + /* Include a file containing entity declarations. */ + + if (node == NODE_ENTITY && strcmp("%", + pnode_getattr_raw(n, ATTRKEY_NAME, "")) == 0 && + (cp = pnode_getattr_raw(n, ATTRKEY_SYSTEM, NULL)) != NULL) + parse_file(p, -1, cp); + break; } assert(p->del == 0);