XML-Hash-XS
view release on metacpan or search on metacpan
src/xh_x2h.c view on Meta::CPAN
content_key_len = xh_strlen(ctx->opts.content);
}
#define XH_X2H_PROCESS_STATE(st) case st: goto st;
switch (ctx->state) {
case PARSER_ST_NONE: break;
XH_X2H_PARSER_STATE_LIST
case XML_DECL_FOUND: break;
case PARSER_ST_DONE: goto DONE;
}
#undef XH_X2H_PROCESS_STATE
PARSE_CONTENT:
content = NULL;
flags &= ~(XH_X2H_NEED_NORMALIZE | XH_X2H_IS_NOT_BLANK);
DO(CONTENT)
EXPECT_CHAR("new element", '<')
DO(PARSE_ELEMENT)
EXPECT_CHAR("xml declaration", '?')
if (real_depth != 0) goto INVALID_XML;
END_OF_TEXT(TEXT_BEFORE_XML_DECL, content, end - content)
SCAN3(XML_DECL, 'x', 'm', 'l')
DO(XML_DECL_ATTR)
EXPECT_BLANK("blank")
#undef NEW_ATTRIBUTE
#define NEW_ATTRIBUTE(k, kl, v, vl) NEW_XML_DECL_ATTRIBUTE(k, kl, v, vl)
#undef SEARCH_ATTRIBUTE_VALUE
#define SEARCH_ATTRIBUTE_VALUE(loop, top_loop, quot) SEARCH_XML_DECL_ATTRIBUTE_VALUE(loop, top_loop, quot)
SEARCH_ATTRIBUTES(XML_DECL_ATTR, SEARCH_END_XML_DECLARATION)
#undef NEW_ATTRIBUTE
#define NEW_ATTRIBUTE(k, kl, v, vl) NEW_NODE_ATTRIBUTE(k, kl, v, vl)
#undef SEARCH_ATTRIBUTE_VALUE
#define SEARCH_ATTRIBUTE_VALUE(loop, top_loop, quot) SEARCH_NODE_ATTRIBUTE_VALUE(loop, top_loop, quot)
goto INVALID_XML;
EXPECT_CHAR("PI", '-')
SCAN10(STYLESHEET_PI, 's', 't', 'y', 'l', 'e', 's', 'h', 'e', 'e', 't')
DO(STYLESHEET_PI_ATTR)
EXPECT_BLANK("blank")
#undef NEW_ATTRIBUTE
#define NEW_ATTRIBUTE(k, kl, v, vl) NEW_PI_ATTRIBUTE(k, kl, v, vl)
#undef SEARCH_ATTRIBUTE_VALUE
#define SEARCH_ATTRIBUTE_VALUE(loop, top_loop, quot) SEARCH_XML_DECL_ATTRIBUTE_VALUE(loop, top_loop, quot)
SEARCH_ATTRIBUTES(STYLESHEET_PI_ATTR, SEARCH_END_PI)
#undef NEW_ATTRIBUTE
#define NEW_ATTRIBUTE(k, kl, v, vl) NEW_NODE_ATTRIBUTE(k, kl, v, vl)
#undef SEARCH_ATTRIBUTE_VALUE
#define SEARCH_ATTRIBUTE_VALUE(loop, top_loop, quot) SEARCH_NODE_ATTRIBUTE_VALUE(loop, top_loop, quot)
goto INVALID_XML;
EXPECT_ANY("wrong character")
goto INVALID_XML;
END(STYLESHEET_PI_ATTR)
goto INVALID_XML;
END10(STYLESHEET_PI, INVALID_XML)
goto INVALID_XML;
EXPECT_ANY("wrong character")
goto INVALID_XML;
END(XML_DECL_ATTR)
goto INVALID_XML;
END3(XML_DECL, INVALID_XML)
goto INVALID_XML;
EXPECT_CHAR("comment or cdata or doctype", '!')
flags &= ~XH_X2H_TEXT_NODE;
END_OF_TEXT(TEXT_BEFORE_COMMENT, content, end - content)
DO(XML_COMMENT_NODE_OR_CDATA)
EXPECT_CHAR("comment", '-')
PARSE_COMMENT
EXPECT_CHAR("cdata", '[')
if (ctx->opts.trim) {
PARSE_CDATA_WITH_TRIM
;
}
else {
PARSE_CDATA
;
}
EXPECT_CHAR("doctype", 'D')
PARSE_DOCTYPE
EXPECT_ANY("wrong character")
goto INVALID_XML;
END(XML_COMMENT_NODE_OR_CDATA)
goto INVALID_XML;
EXPECT_CHAR("closing tag", '/')
END_OF_TEXT(TEXT_BEFORE_CLOSING_TAG, content, end - content)
//node = cur;
DO(PARSE_CLOSING_TAG)
EXPECT_CHAR("end tag name", '>')
CLOSE_TAG
goto PARSE_CONTENT;
EXPECT_BLANK("end tag name")
DO(SEARCH_CLOSING_END_TAG)
EXPECT_CHAR("end tag", '>')
CLOSE_TAG
goto PARSE_CONTENT;
SKIP_BLANK
EXPECT_ANY("wrong character")
goto INVALID_XML;
END(SEARCH_CLOSING_END_TAG)
goto INVALID_XML;
END(PARSE_CLOSING_TAG)
goto INVALID_XML;
EXPECT_ANY("opening tag")
flags &= ~XH_X2H_TEXT_NODE;
END_OF_TEXT(TEXT_BEFORE_OPENING_TAG, content, end - content)
node = cur - 1;
DO(PARSE_OPENING_TAG)
EXPECT_CHAR("end tag", '>')
OPEN_TAG(node, cur - node - 1)
goto PARSE_CONTENT;
EXPECT_CHAR("self closing tag", '/')
OPEN_TAG(node, cur - node - 1)
CLOSE_TAG
DO(SEARCH_OPENING_END_TAG)
EXPECT_CHAR("end tag", '>')
goto PARSE_CONTENT;
EXPECT_ANY("wrong character")
goto INVALID_XML;
END(SEARCH_OPENING_END_TAG)
goto INVALID_XML;
EXPECT_BLANK("end tag name")
OPEN_TAG(node, cur - node - 1)
SEARCH_ATTRIBUTES(NODE, SEARCH_END_TAG)
goto PARSE_CONTENT;
END(PARSE_OPENING_TAG);
goto INVALID_XML;
( run in 0.513 second using v1.01-cache-2.11-cpan-39bf76dae61 )