⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.c.svn-base

📁 这是一个用于解析xml文件的类库。使用这个类库
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
intxmlSkipBlankChars(xmlParserCtxtPtr ctxt) {    int res = 0;    /*     * It's Okay to use CUR/NEXT here since all the blanks are on     * the ASCII range.     */    if ((ctxt->inputNr == 1) && (ctxt->instate != XML_PARSER_DTD)) {	const xmlChar *cur;	/*	 * if we are in the document content, go really fast	 */	cur = ctxt->input->cur;	while (IS_BLANK_CH(*cur)) {	    if (*cur == '\n') {		ctxt->input->line++; ctxt->input->col = 1;	    }	    cur++;	    res++;	    if (*cur == 0) {		ctxt->input->cur = cur;		xmlParserInputGrow(ctxt->input, INPUT_CHUNK);		cur = ctxt->input->cur;	    }	}	ctxt->input->cur = cur;    } else {	int cur;	do {	    cur = CUR;	    while (IS_BLANK(cur)) { /* CHECKED tstblanks.xml */		NEXT;		cur = CUR;		res++;	    }	    while ((cur == 0) && (ctxt->inputNr > 1) &&		   (ctxt->instate != XML_PARSER_COMMENT)) {		xmlPopInput(ctxt);		cur = CUR;	    }	    /*	     * Need to handle support of entities branching here	     */	    if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt);	} while (IS_BLANK(cur)); /* CHECKED tstblanks.xml */    }    return(res);}/************************************************************************ *									* *		Commodity functions to handle entities			* *									* ************************************************************************//** * xmlPopInput: * @ctxt:  an XML parser context * * xmlPopInput: the current input pointed by ctxt->input came to an end *          pop it and return the next char. * * Returns the current xmlChar in the parser context */xmlCharxmlPopInput(xmlParserCtxtPtr ctxt) {    if (ctxt->inputNr == 1) return(0); /* End of main Input */    if (xmlParserDebugEntities)	xmlGenericError(xmlGenericErrorContext,		"Popping input %d\n", ctxt->inputNr);    xmlFreeInputStream(inputPop(ctxt));    if ((*ctxt->input->cur == 0) &&        (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0))	    return(xmlPopInput(ctxt));    return(CUR);}/** * xmlPushInput: * @ctxt:  an XML parser context * @input:  an XML parser input fragment (entity, XML fragment ...). * * xmlPushInput: switch to a new input stream which is stacked on top *               of the previous one(s). */voidxmlPushInput(xmlParserCtxtPtr ctxt, xmlParserInputPtr input) {    if (input == NULL) return;    if (xmlParserDebugEntities) {	if ((ctxt->input != NULL) && (ctxt->input->filename))	    xmlGenericError(xmlGenericErrorContext,		    "%s(%d): ", ctxt->input->filename,		    ctxt->input->line);	xmlGenericError(xmlGenericErrorContext,		"Pushing input %d : %.30s\n", ctxt->inputNr+1, input->cur);    }    inputPush(ctxt, input);    GROW;}/** * xmlParseCharRef: * @ctxt:  an XML parser context * * parse Reference declarations * * [66] CharRef ::= '&#' [0-9]+ ';' | *                  '&#x' [0-9a-fA-F]+ ';' * * [ WFC: Legal Character ] * Characters referred to using character references must match the * production for Char.  * * Returns the value parsed (as an int), 0 in case of error */intxmlParseCharRef(xmlParserCtxtPtr ctxt) {    unsigned int val = 0;    int count = 0;    /*     * Using RAW/CUR/NEXT is okay since we are working on ASCII range here     */    if ((RAW == '&') && (NXT(1) == '#') &&        (NXT(2) == 'x')) {	SKIP(3);	GROW;	while (RAW != ';') { /* loop blocked by count */	    if (count++ > 20) {		count = 0;		GROW;	    }	    if ((RAW >= '0') && (RAW <= '9')) 	        val = val * 16 + (CUR - '0');	    else if ((RAW >= 'a') && (RAW <= 'f') && (count < 20))	        val = val * 16 + (CUR - 'a') + 10;	    else if ((RAW >= 'A') && (RAW <= 'F') && (count < 20))	        val = val * 16 + (CUR - 'A') + 10;	    else {		xmlFatalErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, NULL);		val = 0;		break;	    }	    NEXT;	    count++;	}	if (RAW == ';') {	    /* on purpose to avoid reentrancy problems with NEXT and SKIP */	    ctxt->input->col++;	    ctxt->nbChars ++;	    ctxt->input->cur++;	}    } else if  ((RAW == '&') && (NXT(1) == '#')) {	SKIP(2);	GROW;	while (RAW != ';') { /* loop blocked by count */	    if (count++ > 20) {		count = 0;		GROW;	    }	    if ((RAW >= '0') && (RAW <= '9')) 	        val = val * 10 + (CUR - '0');	    else {		xmlFatalErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, NULL);		val = 0;		break;	    }	    NEXT;	    count++;	}	if (RAW == ';') {	    /* on purpose to avoid reentrancy problems with NEXT and SKIP */	    ctxt->input->col++;	    ctxt->nbChars ++;	    ctxt->input->cur++;	}    } else {        xmlFatalErr(ctxt, XML_ERR_INVALID_CHARREF, NULL);    }    /*     * [ WFC: Legal Character ]     * Characters referred to using character references must match the     * production for Char.      */    if (IS_CHAR(val)) {        return(val);    } else {        xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR,                          "xmlParseCharRef: invalid xmlChar value %d\n",	                  val);    }    return(0);}/** * xmlParseStringCharRef: * @ctxt:  an XML parser context * @str:  a pointer to an index in the string * * parse Reference declarations, variant parsing from a string rather * than an an input flow. * * [66] CharRef ::= '&#' [0-9]+ ';' | *                  '&#x' [0-9a-fA-F]+ ';' * * [ WFC: Legal Character ] * Characters referred to using character references must match the * production for Char.  * * Returns the value parsed (as an int), 0 in case of error, str will be *         updated to the current value of the index */static intxmlParseStringCharRef(xmlParserCtxtPtr ctxt, const xmlChar **str) {    const xmlChar *ptr;    xmlChar cur;    int val = 0;    if ((str == NULL) || (*str == NULL)) return(0);    ptr = *str;    cur = *ptr;    if ((cur == '&') && (ptr[1] == '#') && (ptr[2] == 'x')) {	ptr += 3;	cur = *ptr;	while (cur != ';') { /* Non input consuming loop */	    if ((cur >= '0') && (cur <= '9')) 	        val = val * 16 + (cur - '0');	    else if ((cur >= 'a') && (cur <= 'f'))	        val = val * 16 + (cur - 'a') + 10;	    else if ((cur >= 'A') && (cur <= 'F'))	        val = val * 16 + (cur - 'A') + 10;	    else {		xmlFatalErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, NULL);		val = 0;		break;	    }	    ptr++;	    cur = *ptr;	}	if (cur == ';')	    ptr++;    } else if  ((cur == '&') && (ptr[1] == '#')){	ptr += 2;	cur = *ptr;	while (cur != ';') { /* Non input consuming loops */	    if ((cur >= '0') && (cur <= '9')) 	        val = val * 10 + (cur - '0');	    else {		xmlFatalErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, NULL);		val = 0;		break;	    }	    ptr++;	    cur = *ptr;	}	if (cur == ';')	    ptr++;    } else {	xmlFatalErr(ctxt, XML_ERR_INVALID_CHARREF, NULL);	return(0);    }    *str = ptr;    /*     * [ WFC: Legal Character ]     * Characters referred to using character references must match the     * production for Char.      */    if (IS_CHAR(val)) {        return(val);    } else {        xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR,			  "xmlParseStringCharRef: invalid xmlChar value %d\n",			  val);    }    return(0);}/** * xmlNewBlanksWrapperInputStream: * @ctxt:  an XML parser context * @entity:  an Entity pointer * * Create a new input stream for wrapping * blanks around a PEReference * * Returns the new input stream or NULL */ static void deallocblankswrapper (xmlChar *str) {xmlFree(str);} static xmlParserInputPtrxmlNewBlanksWrapperInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) {    xmlParserInputPtr input;    xmlChar *buffer;    size_t length;    if (entity == NULL) {	xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR,	            "xmlNewBlanksWrapperInputStream entity\n");	return(NULL);    }    if (xmlParserDebugEntities)	xmlGenericError(xmlGenericErrorContext,		"new blanks wrapper for entity: %s\n", entity->name);    input = xmlNewInputStream(ctxt);    if (input == NULL) {	return(NULL);    }    length = xmlStrlen(entity->name) + 5;    buffer = xmlMallocAtomic(length);    if (buffer == NULL) {	xmlErrMemory(ctxt, NULL);    	return(NULL);    }    buffer [0] = ' ';    buffer [1] = '%';    buffer [length-3] = ';';    buffer [length-2] = ' ';    buffer [length-1] = 0;    memcpy(buffer + 2, entity->name, length - 5);    input->free = deallocblankswrapper;    input->base = buffer;    input->cur = buffer;    input->length = length;    input->end = &buffer[length];    return(input);}/** * xmlParserHandlePEReference: * @ctxt:  the parser context *  * [69] PEReference ::= '%' Name ';' * * [ WFC: No Recursion ] * A parsed entity must not contain a recursive * reference to itself, either directly or indirectly.  * * [ WFC: Entity Declared ] * In a document without any DTD, a document with only an internal DTD * subset which contains no parameter entity references, or a document * with "standalone='yes'", ...  ... The declaration of a parameter * entity must precede any reference to it... * * [ VC: Entity Declared ] * In a document with an external subset or external parameter entities * with "standalone='no'", ...  ... The declaration of a parameter entity * must precede any reference to it... * * [ WFC: In DTD ] * Parameter-entity references may only appear in the DTD. * NOTE: misleading but this is handled. * * A PEReference may have been detected in the current input stream * the handling is done accordingly to  *      http://www.w3.org/TR/REC-xml#entproc * i.e.  *   - Included in literal in entity values *   - Included as Parameter Entity reference within DTDs */voidxmlParserHandlePEReference(xmlParserCtxtPtr ctxt) {    const xmlChar *name;    xmlEntityPtr entity = NULL;    xmlParserInputPtr input;    if (RAW != '%') return;    switch(ctxt->instate) {	case XML_PARSER_CDATA_SECTION:	    return;        case XML_PARSER_COMMENT:	    return;	case XML_PARSER_START_TAG:	    return;	case XML_PARSER_END_TAG:	    return;        case XML_PARSER_EOF:	    xmlFatalErr(ctxt, XML_ERR_PEREF_AT_EOF, NULL);	    return;        case XML_PARSER_PROLOG:	case XML_PARSER_START:	case XML_PARSER_MISC:	    xmlFatalErr(ctxt, XML_ERR_PEREF_IN_PROLOG, NULL);	    return;	case XML_PARSER_ENTITY_DECL:        case XML_PARSER_CONTENT:        case XML_PARSER_ATTRIBUTE_VALUE:        case XML_PARSER_PI:	case XML_PARSER_SYSTEM_LITERAL:	case XML_PARSER_PUBLIC_LITERAL:	    /* we just ignore it there */	    return;        case XML_PARSER_EPILOG:	    xmlFatalErr(ctxt, XML_ERR_PEREF_IN_EPILOG, NULL);	    return;	case XML_PARSER_ENTITY_VALUE:	    /*	     * NOTE: in the case of entity values, we don't do the	     *       substitution here since we need the literal	     *       entity value to be able to save the internal	     *       subset of the document.	     *       This will be handled by xmlStringDecodeEntities	     */	    return;        case XML_PARSER_DTD:	    /*	     * [WFC: Well-Formedness Constraint: PEs in Internal Subset]	     * In the internal DTD subset, parameter-entity references	     * can occur only where markup declarations can occur, not	     * within markup declarations.	     * In that case this is handled in xmlParseMarkupDecl	     */	    if ((ctxt->external == 0) && (ctxt->inputNr == 1))		return;	    if (IS_BLANK_CH(NXT(1)) || NXT(1) == 0)		return;            break;        case XML_PARSER_IGNORE:            return;    }    NEXT;    name = xmlParseName(ctxt);    if (xmlParserDebugEntities)	xmlGenericError(xmlGenericErrorContext,		"PEReference: %s\n", name);    if (name == NULL) {	xmlFatalErr(ctxt, XML_ERR_PEREF_NO_NAME, NULL);    } else {	if (RAW == ';') {	    NEXT;	    if ((ctxt->sax != NULL) && (ctxt->sax->getParameterEntity != NULL))		entity = ctxt->sax->getParameterEntity(ctxt->userData, name);	    if (entity == NULL) {	        		/*		 * [ WFC: Entity Declared ]		 * In a document without any DTD, a document with only an		 * internal DTD subset which contains no parameter entity		 * references, or a document with "standalone='yes'", ...		 * ... The declaration of a parameter entity must precede		 * any reference to it...		 */

⌨️ 快捷键说明

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