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 )