rngparser.c

来自「图片显示,电脑光于望技术湖连望键往,网络」· C语言 代码 · 共 1,594 行 · 第 1/4 页

C
1,594
字号
/** * xmlParseCRNG_topLevelBody: * @ctxt: a compact RNG parser context * * Parse topLevelBody of the RELAX NG Compact Syntax Appendix A * * Returns 0 in case of success and -1 in case of error */static intxmlParseCRNG_topLevelBody(xmlCRelaxNGParserCtxtPtr ctxt){    tokenPtr token, tok2;        token = xmlParseCRNGGetToken(ctxt, 1);    if (token->toktype == CRNG_KEYWORD) {        if ((token->token == ctxt->key_start) ||	    (token->token == ctxt->key_include) ||	    (token->token == ctxt->key_div)) {	    xmlNodePtr grammar;	    grammar = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_grammar);	    if (grammar == NULL) CRNG_MEM_ERROR0();	    xmlDocSetRootElement(ctxt->doc, grammar);	    ctxt->insert = grammar;	    	    xmlParseCRNG_grammar(ctxt);	} else {	    xmlParseCRNG_pattern(ctxt);	}    } else {        tok2 = xmlParseCRNGGetToken(ctxt, 2);	if ((tok2->toktype == CRNG_OP) && 	    ((tok2->token == ctxt->key_equal) ||	     (tok2->token == ctxt->key_orequal) ||	     (tok2->token == ctxt->key_andequal))) {	    xmlNodePtr grammar;	    grammar = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_grammar);	    if (grammar == NULL) CRNG_MEM_ERROR0();	    xmlDocSetRootElement(ctxt->doc, grammar);	    ctxt->insert = grammar;	    	    xmlParseCRNG_grammar(ctxt);	} else {	    xmlParseCRNG_pattern(ctxt);	}    }    return(0);}/** * xmlParseCRNG_namespacePrefix: * @ctxt: a compact RNG parser context * * Parse namespacePrefix of the RELAX NG Compact Syntax Appendix A * * Returns the prefix or NULL in case of error */static const xmlChar *xmlParseCRNG_namespacePrefix(xmlCRelaxNGParserCtxtPtr ctxt){    tokenPtr token;    const xmlChar *prefix = NULL;    token = xmlParseCRNGGetToken(ctxt, 1);    if (token->toktype == CRNG_IDENTIFIER) {        prefix = token->token;    } else if (token->toktype == CRNG_OP) {	if ((token->token[0] == '=') && (token->token[1] == 0))	    return(NULL);        prefix = token->token;    } else {	ERROR("Expecting a namespace prefix");	return(NULL);    }    xmlParseCRNGDropTokens(ctxt, 1);    if (xmlStrEqual(prefix, BAD_CAST "xmlns")) {	ERROR("Namespace prefix \"xmlns\" is forbidden");    }    return(prefix);}/** * xmlParseCRNG_decl: * @ctxt: a compact RNG parser context * * Parse decl of the RELAX NG Compact Syntax Appendix A * * Returns 0 in case of success and -1 in case of error */static intxmlParseCRNG_decl(xmlCRelaxNGParserCtxtPtr ctxt){    const xmlChar *prefix = NULL;    const xmlChar *namespace = NULL;    tokenPtr token;        token = xmlParseCRNGGetToken(ctxt, 1);    if (token->toktype != CRNG_KEYWORD) return(-1);    if (token->token == ctxt->key_default) {        xmlParseCRNGDropTokens(ctxt, 1);        token = xmlParseCRNGGetToken(ctxt, 1);        if ((token->toktype != CRNG_KEYWORD) ||	    (token->token != ctxt->key_namespace)) {	    ERROR("Expecting keyword \"namespace\" after \"default\"");	}        xmlParseCRNGDropTokens(ctxt, 1);	prefix = xmlParseCRNG_namespacePrefix(ctxt);        token = xmlParseCRNGGetToken(ctxt, 1);        if ((token->toktype != CRNG_OP) ||	    (token->token[0] != '=') || (token->token[1] != 0)) {	    ERROR("Expecting keyword \"=\" here");	}        xmlParseCRNGDropTokens(ctxt, 1);        token = xmlParseCRNGGetToken(ctxt, 1);        if ((token->toktype == CRNG_KEYWORD) &&	    (token->token == ctxt->key_inherit)) {	    namespace = xmlCRelaxNGInherit;	} else if (token->toktype == CRNG_LITERAL_SEGMENT) {	    namespace = token->token;	} else {	    ERROR("Expecting an URI or \"inherit\" value");	}        xmlParseCRNGDropTokens(ctxt, 1);        if (namespace != NULL) {	    if (prefix != NULL)		xmlParseCRNG_bindPrefix(ctxt, prefix, namespace);            xmlParseCRNG_bindPrefix(ctxt, NULL, namespace);	}    } else if (token->token == ctxt->key_namespace) {        xmlParseCRNGDropTokens(ctxt, 1);	prefix = xmlParseCRNG_namespacePrefix(ctxt);        token = xmlParseCRNGGetToken(ctxt, 1);        if ((token->toktype != CRNG_OP) ||	    (token->token[0] != '=') || (token->token[1] != 0)) {	    ERROR("Expecting keyword \"=\" here");	}        xmlParseCRNGDropTokens(ctxt, 1);        token = xmlParseCRNGGetToken(ctxt, 1);        if ((token->toktype == CRNG_KEYWORD) &&	    (token->token == ctxt->key_inherit)) {	    namespace = xmlCRelaxNGInherit;	} else if (token->toktype == CRNG_LITERAL_SEGMENT) {	    namespace = token->token;	} else {	    ERROR("Expecting an URI or \"inherit\" value");	}        xmlParseCRNGDropTokens(ctxt, 1);        if (namespace != NULL)	    xmlParseCRNG_bindPrefix(ctxt, prefix, namespace);    } else if (token->token == ctxt->key_datatypes) {        xmlParseCRNGDropTokens(ctxt, 1);                token = xmlParseCRNGGetToken(ctxt, 1);	if ((token->toktype != CRNG_KEYWORD) &&	    (token->toktype != CRNG_IDENTIFIER)) {	    ERROR("Expecting a datatype prefix identifier here");	} else 	    prefix = token->token;        xmlParseCRNGDropTokens(ctxt, 1);        token = xmlParseCRNGGetToken(ctxt, 1);        if ((token->toktype != CRNG_OP) ||	    (token->token[0] != '=') || (token->token[1] != 0)) {	    ERROR("Expecting keyword \"=\" here");	}        xmlParseCRNGDropTokens(ctxt, 1);        token = xmlParseCRNGGetToken(ctxt, 1);	if (token->toktype == CRNG_LITERAL_SEGMENT) {	    namespace = token->token;	} else {	    ERROR("Expecting a literal value for the datatype identifier");	}        xmlParseCRNGDropTokens(ctxt, 1);        if ((namespace != NULL) && (prefix != NULL))	    xmlParseCRNG_bindDatatypePrefix(ctxt, prefix, namespace);    }    return(0);}/** * xmlParseCRNG_preamble: * @ctxt: a compact RNG parser context * * Parse preamble of the RELAX NG Compact Syntax Appendix A * * Returns 0 in case of success and -1 in case of error */static intxmlParseCRNG_preamble(xmlCRelaxNGParserCtxtPtr ctxt){    tokenPtr token;        token = xmlParseCRNGGetToken(ctxt, 1);    while (token != NULL) {	if (token == NULL) return(-1);	if ((token->toktype == CRNG_KEYWORD) &&	    ((token->token == ctxt->key_default) ||	     (token->token == ctxt->key_namespace) ||	     (token->token == ctxt->key_datatypes))) {	    xmlParseCRNG_decl(ctxt);	} else	    break;	token = xmlParseCRNGGetToken(ctxt, 1);    }    return(0);}/** * xmlParseCRNG_topLevel: * @ctxt: a compact RNG parser context * * Parse topLevel of the RELAX NG Compact Syntax Appendix A * * Returns 0 in case of success and -1 in case of error */static intxmlParseCRNG_topLevel(xmlCRelaxNGParserCtxtPtr ctxt){    xmlParseCRNG_preamble(ctxt);    xmlParseCRNG_topLevelBody(ctxt);    return(0);}/** * xmlConvertCRNG: * @schemas:  pointer to the text of the compact schemas * @len:  length of the schemas in bytes (or 0) * @encoding:  encoding indicated by the context or NULL * * Compiles the schemas into the equivalent Relax-NG XML structure * * Returns the xmlDocPtr resulting from the compilation or *         NULL in case of error */xmlDocPtrxmlConvertCRNG(const char *schemas, int len, const char *encoding) {    struct _xmlCRelaxNGParserCtxt ctxt;    xmlDocPtr ret = NULL;    if (schemas == NULL) return(NULL);    if (len <= 5) len = xmlStrlen((const unsigned char *) schemas);    if (len <= 0) return(NULL);    memset(&ctxt, 0, sizeof(ctxt));    ctxt.compact = (const unsigned char *) schemas;    ctxt.cur = (const unsigned char *) schemas;    ctxt.end = (const unsigned char *) &schemas[len];    ctxt.dict = xmlDictCreate();    if (ctxt.dict == NULL)        return(NULL);    ctxt.doc = xmlNewDoc(NULL);    if (ctxt.doc == NULL) {	xmlDictFree(ctxt.dict);	return(NULL);    }    ctxt.doc->dict = ctxt.dict;    xmlDictReference(ctxt.dict);    ctxt.nbTokens = 0;    ctxt.firstToken = 0;    ctxt.key_attribute = xmlDictLookup(ctxt.dict, BAD_CAST "attribute", -1);    ctxt.key_default = xmlDictLookup(ctxt.dict, BAD_CAST "default", -1);    ctxt.key_datatypes = xmlDictLookup(ctxt.dict, BAD_CAST "datatypes", -1);    ctxt.key_div = xmlDictLookup(ctxt.dict, BAD_CAST "div", -1);    ctxt.key_element = xmlDictLookup(ctxt.dict, BAD_CAST "element", -1);    ctxt.key_empty = xmlDictLookup(ctxt.dict, BAD_CAST "empty", -1);    ctxt.key_external = xmlDictLookup(ctxt.dict, BAD_CAST "external", -1);    ctxt.key_grammar = xmlDictLookup(ctxt.dict, BAD_CAST "grammar", -1);    ctxt.key_include = xmlDictLookup(ctxt.dict, BAD_CAST "include", -1);    ctxt.key_inherit = xmlDictLookup(ctxt.dict, BAD_CAST "inherit", -1);    ctxt.key_list = xmlDictLookup(ctxt.dict, BAD_CAST "list", -1);    ctxt.key_mixed = xmlDictLookup(ctxt.dict, BAD_CAST "mixed", -1);    ctxt.key_namespace = xmlDictLookup(ctxt.dict, BAD_CAST "namespace", -1);    ctxt.key_notAllowed = xmlDictLookup(ctxt.dict, BAD_CAST "notAllowed", -1);    ctxt.key_parent = xmlDictLookup(ctxt.dict, BAD_CAST "parent", -1);    ctxt.key_start = xmlDictLookup(ctxt.dict, BAD_CAST "start", -1);    ctxt.key_string = xmlDictLookup(ctxt.dict, BAD_CAST "string", -1);    ctxt.key_text = xmlDictLookup(ctxt.dict, BAD_CAST "text", -1);    ctxt.key_token = xmlDictLookup(ctxt.dict, BAD_CAST "token", -1);    ctxt.key_equal = xmlDictLookup(ctxt.dict, BAD_CAST "=", 1);    ctxt.key_orequal = xmlDictLookup(ctxt.dict, BAD_CAST "|=", 2);    ctxt.key_andequal = xmlDictLookup(ctxt.dict, BAD_CAST "&=", 2);    ctxt.key_combine = xmlDictLookup(ctxt.dict, BAD_CAST "&=", 2);    ctxt.key_or = xmlDictLookup(ctxt.dict, BAD_CAST "|", 1);    ctxt.key_comma = xmlDictLookup(ctxt.dict, BAD_CAST ",", 1);    ctxt.key_and = xmlDictLookup(ctxt.dict, BAD_CAST "&", 1);    ctxt.key_choice = xmlDictLookup(ctxt.dict, BAD_CAST "choice", -1);    ctxt.key_group = xmlDictLookup(ctxt.dict, BAD_CAST "group", -1);    ctxt.key_interleave = xmlDictLookup(ctxt.dict, BAD_CAST "interleave", -1);    ctxt.key_ref = xmlDictLookup(ctxt.dict, BAD_CAST "ref", 3);    ctxt.key_define = xmlDictLookup(ctxt.dict, BAD_CAST "define", 6);    /* xmlConvertCRNGTokenize(&ctxt); */    xmlConvertCRNG_topLevel(&ctxt);    xmlDictFree(ctxt.dict);    ret = ctxt.doc;    return(ret);}/** * xmlConvertCRNGFile: * @URL: URL or filename for the resource * @encoding:  encoding indicated by the context or NULL * * Compiles the schemas into the equivalent Relax-NG XML structure * * Returns the xmlDocPtr resulting from the compilation or *         NULL in case of error */xmlDocPtrxmlConvertCRNG(const char *URL, const char *encoding) {}#ifdef STANDALONEconst xmlChar *schemas = "# RELAX NG XML syntax specified in compact syntax.\n\\n\default namespace rng = \"http://relaxng.org/ns/structure/1.0\"\n\namespace local = \"\"\n\datatypes xsd = \"http://www.w3.org/2001/XMLSchema-datatypes\"\n\\n\start = pattern\n\\n\pattern =\n\  element element { (nameQName | nameClass), (common & pattern+) }\n\  | element attribute { (nameQName | nameClass), (common & pattern?) }\n\  | element group|interleave|choice|optional\n\            |zeroOrMore|oneOrMore|list|mixed { common & pattern+ }\n\  | element ref|parentRef { nameNCName, common }\n\  | element empty|notAllowed|text { common }\n\  | element data { type, param*, (common & exceptPattern?) }\n\  | element value { commonAttributes, type?, xsd:string }\n\  | element externalRef { href, common }\n\  | element grammar { common & grammarContent* }\n\\n\param = element param { commonAttributes, nameNCName, xsd:string }\n\\n\exceptPattern = element except { common & pattern+ }\n\\n\grammarContent =\n\  definition\n\  | element div { common & grammarContent* }\n\  | element include { href, (common & includeContent*) }\n\\n\includeContent =\n\  definition\n\  | element div { common & includeContent* }\n\\n\definition =\n\  element start { combine?, (common & pattern+) }\n\  | element define { nameNCName, combine?, (common & pattern+) }\n\\n\combine = attribute combine { \"choice\" | \"interleave\" }\n\\n\nameClass =\n\  element name { commonAttributes, xsd:QName }\n\  | element anyName { common & exceptNameClass? }\n\  | element nsName { common & exceptNameClass? }\n\  | element choice { common & nameClass+ }\n\\n\exceptNameClass = element except { common & nameClass+ }\n\\n\nameQName = attribute name { xsd:QName }\n\nameNCName = attribute name { xsd:NCName }\n\href = attribute href { xsd:anyURI }\n\type = attribute type { xsd:NCName }\n\\n\common = commonAttributes, foreignElement*\n\\n\commonAttributes =\n\  attribute ns { xsd:string }?,\n\  attribute datatypeLibrary { xsd:anyURI }?,\n\  foreignAttribute*\n\\n\foreignElement = element * - rng:* { (anyAttribute | text | anyElement)* }\n\foreignAttribute = attribute * - (rng:*|local:*) { text }\n\anyElement = element * { (anyAttribute | text | anyElement)* }\n\anyAttribute = attribute * { text }\n\";int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {    xmlDocPtr res;    res = xmlConvertCRNG(schemas, -1);    if (res != NULL) {        xmlDocFormatDump(stdout, res, 1);	xmlFreeDoc(res);    }    return(0);}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?