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 + -
显示快捷键?