=================================================================== RCS file: /cvs/docbook2mdoc/parse.c,v retrieving revision 1.24 retrieving revision 1.28 diff -u -p -r1.24 -r1.28 --- docbook2mdoc/parse.c 2019/04/08 22:47:34 1.24 +++ docbook2mdoc/parse.c 2019/04/09 13:35:29 1.28 @@ -1,4 +1,4 @@ -/* $Id: parse.c,v 1.24 2019/04/08 22:47:34 schwarze Exp $ */ +/* $Id: parse.c,v 1.28 2019/04/09 13:35:29 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -213,7 +213,7 @@ static const struct element elements[] = { { "varname", NODE_VARNAME }, { "warning", NODE_WARNING }, { "wordasword", NODE_WORDASWORD }, - { "xi:include", NODE_DELETE_WARN }, + { "xi:include", NODE_INCLUDE }, { "year", NODE_YEAR }, { NULL, NODE_IGNORE } }; @@ -409,8 +409,15 @@ xml_entity(struct parse *p, const char *name) TAILQ_FOREACH(dat, &p->doctype->childq, child) { if ((ccp = pnode_getattr_raw(dat, ATTRKEY_NAME, NULL)) == NULL || - strcmp(ccp, name) != 0 || - (ccp = pnode_getattr_raw(dat, + strcmp(ccp, name) != 0) + continue; + if ((ccp = pnode_getattr_raw(dat, + ATTRKEY_SYSTEM, NULL)) != NULL) { + parse_file(p, -1, ccp); + p->flags &= ~PFLAG_SPC; + return; + } + if ((ccp = pnode_getattr_raw(dat, ATTRKEY_DEFINITION, NULL)) == NULL) continue; if ((cp = strdup(ccp)) == NULL) { @@ -624,6 +631,7 @@ xml_attrval(struct parse *ps, const char *name) perror(NULL); exit(1); } + ps->flags &= ~PFLAG_ATTR; } /* @@ -634,6 +642,8 @@ static void xml_elem_end(struct parse *ps, const char *name) { const struct element *elem; + struct pnode *n; + const char *cp; enum nodeid node; /* @@ -664,6 +674,18 @@ xml_elem_end(struct parse *ps, const char *name) break; case NODE_IGNORE: break; + case NODE_INCLUDE: + n = ps->cur; + ps->cur = ps->cur->parent; + cp = pnode_getattr_raw(n, ATTRKEY_HREF, NULL); + if (cp == NULL) + error_msg(ps, " element " + "without href attribute"); + else + parse_file(ps, -1, cp); + pnode_unlink(n); + ps->flags &= ~PFLAG_SPC; + break; case NODE_DOCTYPE: ps->flags &= ~PFLAG_EEND; /* FALLTHROUGH */ @@ -954,7 +976,9 @@ parse_string(struct parse *p, char *b, size_t rlen, /* Process text up to the next tag, entity, or EOL. */ } else { - advance(p, b, rlen, &pend, "<&", refill); + advance(p, b, rlen, &pend, + p->ncur == NODE_DOCTYPE ? "<&]" : "<&", + refill); xml_char(p, b + poff, pend - poff); } }