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