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

📄 parser.c.svn-base

📁 这是一个用于解析xml文件的类库。使用这个类库
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
		if ((ctxt->standalone == 1) ||		    ((ctxt->hasExternalSubset == 0) &&		     (ctxt->hasPErefs == 0))) {		    xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY,			 "PEReference: %%%s; not found\n", name);	        } else {		    /*		     * [ 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...		     */		    if ((ctxt->validate) && (ctxt->vctxt.error != NULL)) {		        xmlValidityError(ctxt, XML_WAR_UNDECLARED_ENTITY,			                 "PEReference: %%%s; not found\n",				         name);		    } else 		        xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY,			              "PEReference: %%%s; not found\n",				      name, NULL);		    ctxt->valid = 0;		}	    } else if (ctxt->input->free != deallocblankswrapper) {		    input = xmlNewBlanksWrapperInputStream(ctxt, entity);		    xmlPushInput(ctxt, input);	    } else {	        if ((entity->etype == XML_INTERNAL_PARAMETER_ENTITY) ||		    (entity->etype == XML_EXTERNAL_PARAMETER_ENTITY)) {		    xmlChar start[4];		    xmlCharEncoding enc;		    /*		     * handle the extra spaces added before and after		     * c.f. http://www.w3.org/TR/REC-xml#as-PE		     * this is done independently.		     */		    input = xmlNewEntityInputStream(ctxt, entity);		    xmlPushInput(ctxt, input);		    /* 		     * Get the 4 first bytes and decode the charset		     * if enc != XML_CHAR_ENCODING_NONE		     * plug some encoding conversion routines.		     * Note that, since we may have some non-UTF8		     * encoding (like UTF16, bug 135229), the 'length'		     * is not known, but we can calculate based upon		     * the amount of data in the buffer.		     */		    GROW		    if ((ctxt->input->end - ctxt->input->cur)>=4) {			start[0] = RAW;			start[1] = NXT(1);			start[2] = NXT(2);			start[3] = NXT(3);			enc = xmlDetectCharEncoding(start, 4);			if (enc != XML_CHAR_ENCODING_NONE) {			    xmlSwitchEncoding(ctxt, enc);			}		    }		    if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) &&			(CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l' )) &&			(IS_BLANK_CH(NXT(5)))) {			xmlParseTextDecl(ctxt);		    }		} else {		    xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_PARAMETER,			     "PEReference: %s is not a parameter entity\n",				      name);		}	    }	} else {	    xmlFatalErr(ctxt, XML_ERR_PEREF_SEMICOL_MISSING, NULL);	}    }}/* * Macro used to grow the current buffer. */#define growBuffer(buffer) {						\    xmlChar *tmp;							\    buffer##_size *= 2;							\    tmp = (xmlChar *)							\    		xmlRealloc(buffer, buffer##_size * sizeof(xmlChar));	\    if (tmp == NULL) goto mem_error;					\    buffer = tmp;							\}/** * xmlStringLenDecodeEntities: * @ctxt:  the parser context * @str:  the input string * @len: the string length * @what:  combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF * @end:  an end marker xmlChar, 0 if none * @end2:  an end marker xmlChar, 0 if none * @end3:  an end marker xmlChar, 0 if none *  * Takes a entity string content and process to do the adequate substitutions. * * [67] Reference ::= EntityRef | CharRef * * [69] PEReference ::= '%' Name ';' * * Returns A newly allocated string with the substitution done. The caller *      must deallocate it ! */xmlChar *xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len,		      int what, xmlChar end, xmlChar  end2, xmlChar end3) {    xmlChar *buffer = NULL;    int buffer_size = 0;    xmlChar *current = NULL;    const xmlChar *last;    xmlEntityPtr ent;    int c,l;    int nbchars = 0;    if ((str == NULL) || (len < 0))	return(NULL);    last = str + len;    if (ctxt->depth > 40) {	xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL);	return(NULL);    }    /*     * allocate a translation buffer.     */    buffer_size = XML_PARSER_BIG_BUFFER_SIZE;    buffer = (xmlChar *) xmlMallocAtomic(buffer_size * sizeof(xmlChar));    if (buffer == NULL) goto mem_error;    /*     * OK loop until we reach one of the ending char or a size limit.     * we are operating on already parsed values.     */    if (str < last)	c = CUR_SCHAR(str, l);    else        c = 0;    while ((c != 0) && (c != end) && /* non input consuming loop */	   (c != end2) && (c != end3)) {	if (c == 0) break;        if ((c == '&') && (str[1] == '#')) {	    int val = xmlParseStringCharRef(ctxt, &str);	    if (val != 0) {		COPY_BUF(0,buffer,nbchars,val);	    }	} else if ((c == '&') && (what & XML_SUBSTITUTE_REF)) {	    if (xmlParserDebugEntities)		xmlGenericError(xmlGenericErrorContext,			"String decoding Entity Reference: %.30s\n",			str);	    ent = xmlParseStringEntityRef(ctxt, &str);	    if ((ent != NULL) &&		(ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) {		if (ent->content != NULL) {		    COPY_BUF(0,buffer,nbchars,ent->content[0]);		} else {		    xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR,			    "predefined entity has no content\n");		}	    } else if ((ent != NULL) && (ent->content != NULL)) {		xmlChar *rep;		ctxt->depth++;		rep = xmlStringDecodeEntities(ctxt, ent->content, what,			                      0, 0, 0);		ctxt->depth--;		if (rep != NULL) {		    current = rep;		    while (*current != 0) { /* non input consuming loop */			buffer[nbchars++] = *current++;			if (nbchars >		            buffer_size - XML_PARSER_BUFFER_SIZE) {			    growBuffer(buffer);			}		    }		    xmlFree(rep);		}	    } else if (ent != NULL) {		int i = xmlStrlen(ent->name);		const xmlChar *cur = ent->name;		buffer[nbchars++] = '&';		if (nbchars > buffer_size - i - XML_PARSER_BUFFER_SIZE) {		    growBuffer(buffer);		}		for (;i > 0;i--)		    buffer[nbchars++] = *cur++;		buffer[nbchars++] = ';';	    }	} else if (c == '%' && (what & XML_SUBSTITUTE_PEREF)) {	    if (xmlParserDebugEntities)		xmlGenericError(xmlGenericErrorContext,			"String decoding PE Reference: %.30s\n", str);	    ent = xmlParseStringPEReference(ctxt, &str);	    if (ent != NULL) {		xmlChar *rep;		ctxt->depth++;		rep = xmlStringDecodeEntities(ctxt, ent->content, what,			                      0, 0, 0);		ctxt->depth--;		if (rep != NULL) {		    current = rep;		    while (*current != 0) { /* non input consuming loop */			buffer[nbchars++] = *current++;			if (nbchars >		            buffer_size - XML_PARSER_BUFFER_SIZE) {			    growBuffer(buffer);			}		    }		    xmlFree(rep);		}	    }	} else {	    COPY_BUF(l,buffer,nbchars,c);	    str += l;	    if (nbchars > buffer_size - XML_PARSER_BUFFER_SIZE) {	      growBuffer(buffer);	    }	}	if (str < last)	    c = CUR_SCHAR(str, l);	else	    c = 0;    }    buffer[nbchars++] = 0;    return(buffer);mem_error:    xmlErrMemory(ctxt, NULL);    return(NULL);}/** * xmlStringDecodeEntities: * @ctxt:  the parser context * @str:  the input string * @what:  combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF * @end:  an end marker xmlChar, 0 if none * @end2:  an end marker xmlChar, 0 if none * @end3:  an end marker xmlChar, 0 if none *  * Takes a entity string content and process to do the adequate substitutions. * * [67] Reference ::= EntityRef | CharRef * * [69] PEReference ::= '%' Name ';' * * Returns A newly allocated string with the substitution done. The caller *      must deallocate it ! */xmlChar *xmlStringDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int what,		        xmlChar end, xmlChar  end2, xmlChar end3) {    return(xmlStringLenDecodeEntities(ctxt, str, xmlStrlen(str), what,           end, end2, end3));}/************************************************************************ *									* *		Commodity functions, cleanup needed ?			* *									* ************************************************************************//** * areBlanks: * @ctxt:  an XML parser context * @str:  a xmlChar * * @len:  the size of @str * @blank_chars: we know the chars are blanks * * Is this a sequence of blank chars that one can ignore ? * * Returns 1 if ignorable 0 otherwise. */static int areBlanks(xmlParserCtxtPtr ctxt, const xmlChar *str, int len,                     int blank_chars) {    int i, ret;    xmlNodePtr lastChild;    /*     * Don't spend time trying to differentiate them, the same callback is     * used !     */    if (ctxt->sax->ignorableWhitespace == ctxt->sax->characters)	return(0);    /*     * Check for xml:space value.     */    if (*(ctxt->space) == 1)	return(0);    /*     * Check that the string is made of blanks     */    if (blank_chars == 0) {	for (i = 0;i < len;i++)	    if (!(IS_BLANK_CH(str[i]))) return(0);    }    /*     * Look if the element is mixed content in the DTD if available     */    if (ctxt->node == NULL) return(0);    if (ctxt->myDoc != NULL) {	ret = xmlIsMixedElement(ctxt->myDoc, ctxt->node->name);        if (ret == 0) return(1);        if (ret == 1) return(0);    }    /*     * Otherwise, heuristic :-\     */    if (RAW != '<') return(0);    if ((ctxt->node->children == NULL) &&	(RAW == '<') && (NXT(1) == '/')) return(0);    lastChild = xmlGetLastChild(ctxt->node);    if (lastChild == NULL) {        if ((ctxt->node->type != XML_ELEMENT_NODE) &&            (ctxt->node->content != NULL)) return(0);    } else if (xmlNodeIsText(lastChild))        return(0);    else if ((ctxt->node->children != NULL) &&             (xmlNodeIsText(ctxt->node->children)))        return(0);    return(1);}/************************************************************************ *									* *		Extra stuff for namespace support			* *	Relates to http://www.w3.org/TR/WD-xml-names			* *									* ************************************************************************//** * xmlSplitQName: * @ctxt:  an XML parser context * @name:  an XML parser context * @prefix:  a xmlChar **  * * parse an UTF8 encoded XML qualified name string * * [NS 5] QName ::= (Prefix ':')? LocalPart * * [NS 6] Prefix ::= NCName * * [NS 7] LocalPart ::= NCName * * Returns the local part, and prefix is updated *   to get the Prefix if any. */xmlChar *xmlSplitQName(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefix) {    xmlChar buf[XML_MAX_NAMELEN + 5];    xmlChar *buffer = NULL;    int len = 0;    int max = XML_MAX_NAMELEN;    xmlChar *ret = NULL;    const xmlChar *cur = name;    int c;    *prefix = NULL;    if (cur == NULL) return(NULL);#ifndef XML_XML_NAMESPACE    /* xml: prefix is not really a namespace */    if ((cur[0] == 'x') && (cur[1] == 'm') &&        (cur[2] == 'l') && (cur[3] == ':'))	return(xmlStrdup(name));#endif    /* nasty but well=formed */    if (cur[0] == ':')	return(xmlStrdup(name));    c = *cur++;    while ((c != 0) && (c != ':') && (len < max)) { /* tested bigname.xml */	buf[len++] = c;	c = *cur++;    }    if (len >= max) {	/*	 * Okay someone managed to make a huge name, so he's ready to pay	 * for the processing speed.	 */	max = len * 2;		buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar));	if (buffer == NULL) {	    xmlErrMemory(ctxt, NULL);	    return(NULL);	}	memcpy(buffer, buf, len);	while ((c != 0) && (c != ':')) { /* tested bigname.xml */	    if (len + 10 > max) {		max *= 2;		buffer = (xmlChar *) xmlRealloc(buffer,						max * sizeof(xmlChar));		if (buffer == NULL) {		    xmlErrMemory(ctxt, NULL);		    return(NULL);		}	    }	    buffer[len++] = c;	    c = *cur++;	}	buffer[len] = 0;    }        /* nasty but well=formed    if ((c == ':') && (*cur == 0)) {	return(xmlStrdup(name));    } */    if (buffer == NULL)	ret = xmlStrndup(buf, len);    else {	ret = buffer;	buffer = NULL;	max = XML_MAX_NAMELEN;    }    if (c == ':') {	c = *cur;        *prefix = ret;	if (c == 0) {

⌨️ 快捷键说明

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