=================================================================== RCS file: /cvs/docbook2mdoc/parse.c,v retrieving revision 1.25 retrieving revision 1.28 diff -u -p -r1.25 -r1.28 --- docbook2mdoc/parse.c 2019/04/08 23:40:17 1.25 +++ docbook2mdoc/parse.c 2019/04/09 13:35:29 1.28 @@ -1,4 +1,4 @@ -/* $Id: parse.c,v 1.25 2019/04/08 23:40:17 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 } }; @@ -631,6 +631,7 @@ xml_attrval(struct parse *ps, const char *name) perror(NULL); exit(1); } + ps->flags &= ~PFLAG_ATTR; } /* @@ -641,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; /* @@ -671,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 */ @@ -961,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); } }