char *xml_parse_attr_value(struct xml_context *ctx, struct xml_dtd_attr *attr);
+void xml_skip_internal_subset(struct xml_context *ctx);
void xml_parse_notation_decl(struct xml_context *ctx);
void xml_parse_entity_decl(struct xml_context *ctx);
void xml_parse_element_decl(struct xml_context *ctx);
xml_skip_char(ctx);
xml_dec(ctx);
}
+
+void
+xml_skip_internal_subset(struct xml_context *ctx)
+{
+ TRACE(ctx, "skip_internal_subset");
+ /* AlreadyParsed: '[' */
+ uns c;
+ while ((c = xml_get_char(ctx)) != ']')
+ {
+ if (c != '<')
+ continue;
+ if ((c = xml_get_char(ctx)) == '?')
+ {
+ xml_inc(ctx);
+ xml_skip_pi(ctx);
+ }
+ else if (c != '!')
+ xml_dec(ctx);
+ else if (xml_get_char(ctx) == '-')
+ {
+ xml_inc(ctx);
+ xml_skip_comment(ctx);
+ }
+ else
+ while ((c = xml_get_char(ctx)) != '>')
+ if (c == '\'' || c == '"')
+ while (xml_get_char(ctx) != c);
+ }
+ xml_dec(ctx);
+}
{
xml_parse_white(ctx, 0);
xml_parse_char(ctx, '<');
+ xml_inc(ctx);
if ((c = xml_get_char(ctx)) == '?')
/* Processing intruction */
if (!(ctx->flags & XML_REPORT_PIS))
PULL(DOCTYPE_DECL);
if (xml_peek_char(ctx) == '[')
{
- // FIXME: ability to skip the subset
xml_skip_char(ctx);
xml_inc(ctx);
- xml_dtd_init(ctx);
- if (ctx->h_dtd_start)
- ctx->h_dtd_start(ctx);
- xml_parse_internal_subset(ctx);
- // FIXME: external subset
- if (ctx->h_dtd_end)
- ctx->h_dtd_end(ctx);
- xml_parse_white(ctx, 0);
+ if (ctx->flags & XML_PARSE_DTD)
+ {
+ xml_dtd_init(ctx);
+ if (ctx->h_dtd_start)
+ ctx->h_dtd_start(ctx);
+ // FIXME: pu;; iface?
+ xml_parse_internal_subset(ctx);
+ // FIXME: external subset
+ if (ctx->h_dtd_end)
+ ctx->h_dtd_end(ctx);
+ }
+ else
+ xml_skip_internal_subset(ctx);
}
+ xml_parse_white(ctx, 0);
xml_parse_char(ctx, '>');
+ xml_dec(ctx);
}
}
}
else
xml_skip_char(ctx);
-first_tag: ;
-
xml_inc(ctx);
+first_tag:
+
if ((c = xml_get_char(ctx)) == '?')
{
/* PI */
uns
xml_parse(struct xml_context *ctx)
{
- ctx->pull = 0;
- xml_next(ctx);
+ /* This cycle shoud run only once unless the user overrides the value of ctx->pull in a SAX handler */
+ do
+ {
+ ctx->pull = 0;
+ }
+ while (xml_next(ctx));
return ctx->err_code;
}
enum {
WANT_FIRST = 0x100,
+ WANT_PARSE_DTD,
WANT_HIDE_ERRORS,
WANT_UNFOLD_CDATA,
WANT_IGNORE_COMMENTS,
{ "sax", 0, 0, 's' },
{ "pull", 0, 0, 'p' },
{ "dom", 0, 0, 'd' },
+ { "dtd", 0, 0, WANT_PARSE_DTD },
{ "hide-errors", 0, 0, WANT_HIDE_ERRORS },
{ "unfold-cdata", 0, 0, WANT_UNFOLD_CDATA },
{ "ignore-comments", 0, 0, WANT_IGNORE_COMMENTS },
Options:\n"
CF_USAGE
"\
--s, --pull Test PULL interface\n\
+-p, --pull Test PULL interface\n\
-s, --sax Test SAX interface\n\
-d, --dom Test DOM interface\n\
+ --dtd Enable parsing of DTD\n\
--hide-errors Hide warnings and error messages\n\
--unfold-cdata Unfold CDATA sections\n\
--ignore-comments Ignore processing instructions\n\
static uns want_sax;
static uns want_pull;
static uns want_dom;
+static uns want_parse_dtd;
static uns want_hide_errors;
static uns want_unfold_cdata;
static uns want_ignore_comments;
case 'd':
want_dom++;
break;
+ case WANT_PARSE_DTD:
+ want_parse_dtd++;
+ break;
case WANT_HIDE_ERRORS:
want_hide_errors++;
break;
}
if (want_dom)
ctx.flags |= XML_ALLOC_ALL;
+ if (want_parse_dtd)
+ ctx.flags |= XML_PARSE_DTD;
if (want_unfold_cdata)
ctx.flags |= XML_UNFOLD_CDATA;
if (want_ignore_comments)
/* Other parameters */
XML_UNFOLD_CDATA = 0x00000100, /* Unfold CDATA sections */
XML_VALIDATING = 0x00000200, /* Validate everything (not fully implemented!) */
+ XML_PARSE_DTD = 0x00000400, /* Enable parsing of DTD */
/* Internals, do not change! */
XML_EMPTY_ELEM_TAG = 0x00010000, /* The current element match EmptyElemTag */