rngparser.c
来自「图片显示,电脑光于望技术湖连望键往,网络」· C语言 代码 · 共 1,594 行 · 第 1/4 页
C
1,594 行
* * Returns 0 in case of success and -1 in case of error */static intxmlParseCRNG_patternBlock(xmlCRelaxNGParserCtxtPtr ctxt){ tokenPtr token; token = xmlParseCRNGGetToken(ctxt, 1); if ((token->toktype != CRNG_OP) || (token->token[0] != '{') || (token->token[1] != 0)) { ERROR("Expecting \"{\" here"); } xmlParseCRNGDropTokens(ctxt, 1); xmlParseCRNG_pattern(ctxt); token = xmlParseCRNGGetToken(ctxt, 1); if ((token->toktype != CRNG_OP) || (token->token[0] != '}') || (token->token[1] != 0)) { ERROR("Expecting \"}\" here"); } xmlParseCRNGDropTokens(ctxt, 1); return(0);}/** * xmlParseCRNG_datatype: * @ctxt: a compact RNG parser context * * Parse datatype of the RELAX NG Compact Syntax Appendix A * * Returns 0 in case of success and -1 in case of error */static intxmlParseCRNG_datatype(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED){ tokenPtr token; xmlAttrPtr attrs = NULL; token = xmlParseCRNGGetToken(ctxt, 1); if (token->toktype == CRNG_KEYWORD) { if (token->token == ctxt->key_string) { attrs = xmlParseCRNG_datatypeAttributes(ctxt, BAD_CAST "", token->token); xmlParseCRNGDropTokens(ctxt, 1); } else if (token->token == ctxt->key_token) { attrs = xmlParseCRNG_datatypeAttributes(ctxt, BAD_CAST "", token->token); xmlParseCRNGDropTokens(ctxt, 1); } else { TODO /* probably an error */ } } else if (token->toktype == CRNG_LITERAL_SEGMENT) { ctxt->insert = xmlNewNode(NULL, BAD_CAST "value"); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); xmlNodeAddContent(ctxt->insert, token->token); } else if (token->toktype == CRNG_QNAME) { attrs = xmlParseCRNG_datatypeAttributes(ctxt, xmlParseCRNG_lookupDatatypePrefix(ctxt, token->prefix), token->token); } else { TODO } if (attrs != NULL) { token = xmlParseCRNGGetToken(ctxt, 1); if (token->toktype == CRNG_LITERAL_SEGMENT) { ctxt->insert = xmlNewNode(NULL, BAD_CAST "value"); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) { xmlFreePropList(attrs); CRNG_MEM_ERROR0(); } ctxt->insert->properties = attrs; xmlNodeAddContent(ctxt->insert, token->token); } else if ((token->toktype == CRNG_OP) && (token->token[0] == '{') && (token->token[0] == 0)) { ctxt->insert = xmlNewNode(NULL, BAD_CAST "data"); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) { xmlFreePropList(attrs); CRNG_MEM_ERROR0(); } ctxt->insert->properties = attrs; xmlParseCRNG_params(ctxt); } else { ctxt->insert = xmlNewNode(NULL, BAD_CAST "data"); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) { xmlFreePropList(attrs); CRNG_MEM_ERROR0(); } ctxt->insert->properties = attrs; xmlNodeAddContent(ctxt->insert, token->token); } } return(0);}/** * xmlParseCRNG_primary: * @ctxt: a compact RNG parser context * * Parse primary of the RELAX NG Compact Syntax Appendix A * * Returns 0 in case of success and -1 in case of error */static intxmlParseCRNG_primary(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED){ tokenPtr token; token = xmlParseCRNGGetToken(ctxt, 1); if (token == NULL) return(0); if (token->toktype == CRNG_KEYWORD) { if (token->token == ctxt->key_element) { ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); ctxt->isElem = 1; xmlParseCRNG_nameClass(ctxt); xmlParseCRNG_patternBlock(ctxt); } else if (token->token == ctxt->key_attribute) { ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); ctxt->isElem = 0; xmlParseCRNG_nameClass(ctxt); xmlParseCRNG_patternBlock(ctxt); } else if (token->token == ctxt->key_mixed) { ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); xmlParseCRNG_patternBlock(ctxt); } else if (token->token == ctxt->key_list) { ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); xmlParseCRNG_patternBlock(ctxt); } else if (token->token == ctxt->key_empty) { ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); } else if (token->token == ctxt->key_notAllowed) { ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); } else if (token->token == ctxt->key_text) { ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); } else if (token->token == ctxt->key_parent) { ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); TODO } else if (token->token == ctxt->key_grammar) { ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); TODO } else if (token->token == ctxt->key_external) { ctxt->insert = xmlNewNode(NULL, BAD_CAST "externalRef"); xmlParseCRNGDropTokens(ctxt, 1); if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); TODO } else { TODO } } else if (token->toktype == CRNG_IDENTIFIER) { ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_ref); if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); xmlSetProp(ctxt->insert, BAD_CAST "name", token->token); xmlParseCRNGDropTokens(ctxt, 1); } else if (token->toktype == CRNG_QNAME) { xmlParseCRNG_datatype(ctxt); } else if (token->toktype == CRNG_LITERAL_SEGMENT) { xmlParseCRNG_datatype(ctxt); } else if ((token->toktype == CRNG_OP) && (token->token[0] == '(') && (token->token[1] == 0)) { xmlParseCRNGDropTokens(ctxt, 1); xmlParseCRNG_pattern(ctxt); token = xmlParseCRNGGetToken(ctxt, 1); if ((token->toktype != CRNG_OP) || (token->token[0] != ')') || (token->token[1] != 0)) { ERROR("Expecting \")\" here"); } xmlParseCRNGDropTokens(ctxt, 1); } return(0);}/** * xmlParseCRNG_particle: * @ctxt: a compact RNG parser context * * Parse particle of the RELAX NG Compact Syntax Appendix A * * Returns 0 in case of success and -1 in case of error */static intxmlParseCRNG_particle(xmlCRelaxNGParserCtxtPtr ctxt){ tokenPtr token; xmlNodePtr insert = ctxt->insert, res, tmp = NULL; ctxt->insert = NULL; xmlParseCRNG_primary(ctxt); res = ctxt->insert; token = xmlParseCRNGGetToken(ctxt, 1); if ((token != NULL) && (token->toktype == CRNG_OP)) { if ((token->token[0] == '*') && (token->token[1] == 0)) { tmp = xmlNewNode(NULL, BAD_CAST "zeroOrMore"); if (tmp == NULL) CRNG_MEM_ERROR0(); } else if ((token->token[0] == '+') && (token->token[1] == 0)) { tmp = xmlNewNode(NULL, BAD_CAST "oneOrMore"); if (tmp == NULL) CRNG_MEM_ERROR0(); } else if ((token->token[0] == '?') && (token->token[1] == 0)) { tmp = xmlNewNode(NULL, BAD_CAST "optional"); if (tmp == NULL) CRNG_MEM_ERROR0(); } if (tmp != NULL) { xmlAddChild(tmp, res); res = tmp; xmlParseCRNGDropTokens(ctxt, 1); } } if (insert != NULL) { xmlAddChild(insert, res); ctxt->insert = insert; } else ctxt->insert = res; return(0);}/** * xmlParseCRNG_pattern: * @ctxt: a compact RNG parser context * * Parse pattern of the RELAX NG Compact Syntax Appendix A * * Returns 0 in case of success and -1 in case of error */static intxmlParseCRNG_pattern(xmlCRelaxNGParserCtxtPtr ctxt){ tokenPtr token; xmlNodePtr insert = ctxt->insert, prev, grp; ctxt->insert = NULL; xmlParseCRNG_particle(ctxt); prev = ctxt->insert; token = xmlParseCRNGGetToken(ctxt, 1); while ((prev != NULL) && (token != NULL) && (token->toktype == CRNG_OP)) { if (token->token == ctxt->key_or) { grp = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_choice); if (grp == NULL) CRNG_MEM_ERROR0(); } else if (token->token == ctxt->key_and) { grp = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_interleave); if (grp == NULL) CRNG_MEM_ERROR0(); } else if (token->token == ctxt->key_comma) { grp = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_group); if (grp == NULL) CRNG_MEM_ERROR0(); } else break; xmlParseCRNGDropTokens(ctxt, 1); ctxt->insert = NULL; xmlParseCRNG_particle(ctxt); xmlAddChild(grp, prev); xmlAddChild(grp, ctxt->insert); prev = grp; token = xmlParseCRNGGetToken(ctxt, 1); } if (insert != NULL) { xmlAddChild(insert, prev); ctxt->insert = insert; } else { ctxt->insert = prev; } return(0);}/** * xmlParseCRNG_component: * @ctxt: a compact RNG parser context * * Parse component of the RELAX NG Compact Syntax Appendix A * * Returns 0 in case of success and -1 in case of error */static intxmlParseCRNG_component(xmlCRelaxNGParserCtxtPtr ctxt){ tokenPtr token, tok2; xmlNodePtr insert = ctxt->insert; token = xmlParseCRNGGetToken(ctxt, 1); if (token == NULL) return(0); if (token->toktype == CRNG_KEYWORD) { if (token->token == ctxt->key_start) { xmlNodePtr start; start = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_start); if (start == NULL) CRNG_MEM_ERROR0(); if (ctxt->insert != NULL) xmlAddChild(ctxt->insert, start); ctxt->insert = start; xmlParseCRNGDropTokens(ctxt, 1); token = xmlParseCRNGGetToken(ctxt, 1); if ((token->toktype == CRNG_OP) && (token->token == ctxt->key_equal)) { } else if ((token->toktype == CRNG_OP) && (token->token == ctxt->key_orequal)) { xmlParseCRNG_attribute(ctxt, ctxt->key_combine, NULL, BAD_CAST "choice"); } else if ((token->toktype == CRNG_OP) && (token->token == ctxt->key_andequal)) { xmlParseCRNG_attribute(ctxt, ctxt->key_combine, NULL, BAD_CAST "interleave"); } else { ERROR("expecting \"=\" or \"&=\" or \"|=\" here") return(-1); } start->properties = ctxt->attrs; ctxt->attrs = NULL; xmlParseCRNGDropTokens(ctxt, 1); xmlParseCRNG_pattern(ctxt); } else if (token->token == ctxt->key_include) { TODO } else if (token->token == ctxt->key_div) { TODO } else { return(-1); } } else if (token->toktype == CRNG_IDENTIFIER) { xmlNodePtr define; const xmlChar *identifier; identifier = token->token; tok2 = xmlParseCRNGGetToken(ctxt, 2); if ((tok2->toktype == CRNG_OP) && (tok2->token == ctxt->key_equal)) { } else if ((tok2->toktype == CRNG_OP) && (tok2->token == ctxt->key_orequal)) { xmlParseCRNG_attribute(ctxt, ctxt->key_combine, NULL, BAD_CAST "choice"); } else if ((tok2->toktype == CRNG_OP) && (tok2->token == ctxt->key_andequal)) { xmlParseCRNG_attribute(ctxt, ctxt->key_combine, NULL, BAD_CAST "interleave"); } else { ERROR("expecting \"=\" or \"&=\" or \"|=\" here") return(-1); } xmlParseCRNGDropTokens(ctxt, 2); define = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_define); if (define == NULL) CRNG_MEM_ERROR0(); define->properties = ctxt->attrs; ctxt->attrs = NULL; xmlSetProp(define, BAD_CAST "name", identifier); if (ctxt->insert != NULL) xmlAddChild(ctxt->insert, define); ctxt->insert = define; xmlParseCRNG_pattern(ctxt); } else { return(-1); } ctxt->insert = insert; return(0);}/** * xmlParseCRNG_grammar: * @ctxt: a compact RNG parser context * * Parse grammar of the RELAX NG Compact Syntax Appendix A * * Returns 0 in case of success and -1 in case of error */static intxmlParseCRNG_grammar(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED){ tokenPtr token; int ret; token = xmlParseCRNGGetToken(ctxt, 1); while (token != NULL) { ret = xmlParseCRNG_component(ctxt); if (ret != 0) break; token = xmlParseCRNGGetToken(ctxt, 1); } return(0);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?