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

📄 parserinternals.c

📁 libxml,在UNIX/LINUX下非常重要的一个库,为XML相关应用提供方便.目前上载的是最新版本,若要取得最新版本,请参考里面的readme.
💻 C
📖 第 1 页 / 共 5 页
字号:
 * * change the input functions when discovering the character encoding * of a given entity. * * Returns 0 in case of success, -1 otherwise */intxmlSwitchToEncoding(xmlParserCtxtPtr ctxt, xmlCharEncodingHandlerPtr handler) {    if (handler != NULL) {        if (ctxt->input != NULL) {	    xmlSwitchInputEncoding(ctxt, ctxt->input, handler);	} else {	    xmlErrInternal(ctxt, "xmlSwitchToEncoding : no input\n",	                   NULL);	    return(-1);	}	/*	 * The parsing is now done in UTF8 natively	 */	ctxt->charset = XML_CHAR_ENCODING_UTF8;    } else 	return(-1);    return(0);}/************************************************************************ *									* *	Commodity functions to handle entities processing		* *									* ************************************************************************//** * xmlFreeInputStream: * @input:  an xmlParserInputPtr * * Free up an input stream. */voidxmlFreeInputStream(xmlParserInputPtr input) {    if (input == NULL) return;    if (input->filename != NULL) xmlFree((char *) input->filename);    if (input->directory != NULL) xmlFree((char *) input->directory);    if (input->encoding != NULL) xmlFree((char *) input->encoding);    if (input->version != NULL) xmlFree((char *) input->version);    if ((input->free != NULL) && (input->base != NULL))        input->free((xmlChar *) input->base);    if (input->buf != NULL)         xmlFreeParserInputBuffer(input->buf);    xmlFree(input);}/** * xmlNewInputStream: * @ctxt:  an XML parser context * * Create a new input stream structure * Returns the new input stream or NULL */xmlParserInputPtrxmlNewInputStream(xmlParserCtxtPtr ctxt) {    xmlParserInputPtr input;    static int id = 0;    input = (xmlParserInputPtr) xmlMalloc(sizeof(xmlParserInput));    if (input == NULL) {        xmlErrMemory(ctxt,  "couldn't allocate a new input stream\n");	return(NULL);    }    memset(input, 0, sizeof(xmlParserInput));    input->line = 1;    input->col = 1;    input->standalone = -1;    /*     * we don't care about thread reentrancy unicity for a single     * parser context (and hence thread) is sufficient.     */    input->id = id++;    return(input);}/** * xmlNewIOInputStream: * @ctxt:  an XML parser context * @input:  an I/O Input * @enc:  the charset encoding if known * * Create a new input stream structure encapsulating the @input into * a stream suitable for the parser. * * Returns the new input stream or NULL */xmlParserInputPtrxmlNewIOInputStream(xmlParserCtxtPtr ctxt, xmlParserInputBufferPtr input,	            xmlCharEncoding enc) {    xmlParserInputPtr inputStream;    if (input == NULL) return(NULL);    if (xmlParserDebugEntities)	xmlGenericError(xmlGenericErrorContext, "new input from I/O\n");    inputStream = xmlNewInputStream(ctxt);    if (inputStream == NULL) {	return(NULL);    }    inputStream->filename = NULL;    inputStream->buf = input;    inputStream->base = inputStream->buf->buffer->content;    inputStream->cur = inputStream->buf->buffer->content;    inputStream->end = &inputStream->base[inputStream->buf->buffer->use];    if (enc != XML_CHAR_ENCODING_NONE) {        xmlSwitchEncoding(ctxt, enc);    }    return(inputStream);}/** * xmlNewEntityInputStream: * @ctxt:  an XML parser context * @entity:  an Entity pointer * * Create a new input stream based on an xmlEntityPtr * * Returns the new input stream or NULL */xmlParserInputPtrxmlNewEntityInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) {    xmlParserInputPtr input;    if (entity == NULL) {        xmlErrInternal(ctxt, "xmlNewEntityInputStream entity = NULL\n",	               NULL);	return(NULL);    }    if (xmlParserDebugEntities)	xmlGenericError(xmlGenericErrorContext,		"new input from entity: %s\n", entity->name);    if (entity->content == NULL) {	switch (entity->etype) {            case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:	        xmlErrInternal(ctxt, "Cannot parse entity %s\n",		               entity->name);                break;            case XML_EXTERNAL_GENERAL_PARSED_ENTITY:            case XML_EXTERNAL_PARAMETER_ENTITY:		return(xmlLoadExternalEntity((char *) entity->URI,		       (char *) entity->ExternalID, ctxt));            case XML_INTERNAL_GENERAL_ENTITY:	        xmlErrInternal(ctxt,		      "Internal entity %s without content !\n",		               entity->name);                break;            case XML_INTERNAL_PARAMETER_ENTITY:	        xmlErrInternal(ctxt,		      "Internal parameter entity %s without content !\n",		               entity->name);                break;            case XML_INTERNAL_PREDEFINED_ENTITY:	        xmlErrInternal(ctxt,		      "Predefined entity %s without content !\n",		               entity->name);                break;	}	return(NULL);    }    input = xmlNewInputStream(ctxt);    if (input == NULL) {	return(NULL);    }    input->filename = (char *) entity->URI;    input->base = entity->content;    input->cur = entity->content;    input->length = entity->length;    input->end = &entity->content[input->length];    return(input);}/** * xmlNewStringInputStream: * @ctxt:  an XML parser context * @buffer:  an memory buffer * * Create a new input stream based on a memory buffer. * Returns the new input stream */xmlParserInputPtrxmlNewStringInputStream(xmlParserCtxtPtr ctxt, const xmlChar *buffer) {    xmlParserInputPtr input;    if (buffer == NULL) {        xmlErrInternal(ctxt, "xmlNewStringInputStream string = NULL\n",	               NULL);	return(NULL);    }    if (xmlParserDebugEntities)	xmlGenericError(xmlGenericErrorContext,		"new fixed input: %.30s\n", buffer);    input = xmlNewInputStream(ctxt);    if (input == NULL) {        xmlErrMemory(ctxt,  "couldn't allocate a new input stream\n");	return(NULL);    }    input->base = buffer;    input->cur = buffer;    input->length = xmlStrlen(buffer);    input->end = &buffer[input->length];    return(input);}/** * xmlNewInputFromFile: * @ctxt:  an XML parser context * @filename:  the filename to use as entity * * Create a new input stream based on a file or an URL. * * Returns the new input stream or NULL in case of error */xmlParserInputPtrxmlNewInputFromFile(xmlParserCtxtPtr ctxt, const char *filename) {    xmlParserInputBufferPtr buf;    xmlParserInputPtr inputStream;    char *directory = NULL;    xmlChar *URI = NULL;    if (xmlParserDebugEntities)	xmlGenericError(xmlGenericErrorContext,		"new input from file: %s\n", filename);    if (ctxt == NULL) return(NULL);    buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE);    if (buf == NULL) {        __xmlLoaderErr(ctxt, "failed to load external entity \"%s\"\n",                     (const char *) filename);	return(NULL);    }    inputStream = xmlNewInputStream(ctxt);    if (inputStream == NULL) {	if (directory != NULL) xmlFree((char *) directory);	if (URI != NULL) xmlFree((char *) URI);	return(NULL);    }    inputStream->buf = buf;    inputStream = xmlCheckHTTPInput(ctxt, inputStream);    if (inputStream == NULL)        return(NULL);        if (inputStream->filename == NULL)	URI = xmlStrdup((xmlChar *) filename);    else	URI = xmlStrdup((xmlChar *) inputStream->filename);    directory = xmlParserGetDirectory((const char *) URI);    inputStream->filename = (char *) xmlCanonicPath((const xmlChar *) URI);    if (URI != NULL) xmlFree((char *) URI);    inputStream->directory = directory;    inputStream->base = inputStream->buf->buffer->content;    inputStream->cur = inputStream->buf->buffer->content;    inputStream->end = &inputStream->base[inputStream->buf->buffer->use];    if ((ctxt->directory == NULL) && (directory != NULL))        ctxt->directory = (char *) xmlStrdup((const xmlChar *) directory);    return(inputStream);}/************************************************************************ *									* *		Commodity functions to handle parser contexts		* *									* ************************************************************************//** * xmlInitParserCtxt: * @ctxt:  an XML parser context * * Initialize a parser context * * Returns 0 in case of success and -1 in case of error */intxmlInitParserCtxt(xmlParserCtxtPtr ctxt){    xmlParserInputPtr input;    if(ctxt==NULL) {        xmlErrInternal(NULL, "Got NULL parser context\n", NULL);        return(-1);    }    xmlDefaultSAXHandlerInit();    if (ctxt->dict == NULL)	ctxt->dict = xmlDictCreate();    if (ctxt->dict == NULL) {        xmlErrMemory(NULL, "cannot initialize parser context\n");	return(-1);    }    if (ctxt->sax == NULL)	ctxt->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler));    if (ctxt->sax == NULL) {        xmlErrMemory(NULL, "cannot initialize parser context\n");	return(-1);    }    else        xmlSAXVersion(ctxt->sax, 2);    ctxt->maxatts = 0;    ctxt->atts = NULL;    /* Allocate the Input stack */    if (ctxt->inputTab == NULL) {	ctxt->inputTab = (xmlParserInputPtr *)		    xmlMalloc(5 * sizeof(xmlParserInputPtr));	ctxt->inputMax = 5;    }    if (ctxt->inputTab == NULL) {        xmlErrMemory(NULL, "cannot initialize parser context\n");	ctxt->inputNr = 0;	ctxt->inputMax = 0;	ctxt->input = NULL;	return(-1);    }    while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */        xmlFreeInputStream(input);    }    ctxt->inputNr = 0;    ctxt->input = NULL;    ctxt->version = NULL;    ctxt->encoding = NULL;    ctxt->standalone = -1;    ctxt->hasExternalSubset = 0;    ctxt->hasPErefs = 0;    ctxt->html = 0;    ctxt->external = 0;    ctxt->instate = XML_PARSER_START;    ctxt->token = 0;    ctxt->directory = NULL;    /* Allocate the Node stack */    if (ctxt->nodeTab == NULL) {	ctxt->nodeTab = (xmlNodePtr *) xmlMalloc(10 * sizeof(xmlNodePtr));	ctxt->nodeMax = 10;    }    if (ctxt->nodeTab == NULL) {        xmlErrMemory(NULL, "cannot initialize parser context\n");	ctxt->nodeNr = 0;	ctxt->nodeMax = 0;	ctxt->node = NULL;	ctxt->inputNr = 0;	ctxt->inputMax = 0;	ctxt->input = NULL;	return(-1);    }    ctxt->nodeNr = 0;    ctxt->node = NULL;    /* Allocate the Name stack */    if (ctxt->nameTab == NULL) {	ctxt->nameTab = (const xmlChar **) xmlMalloc(10 * sizeof(xmlChar *));	ctxt->nameMax = 10;    }    if (ctxt->nameTab == NULL) {        xmlErrMemory(NULL, "cannot initialize parser context\n");	ctxt->nodeNr = 0;	ctxt->nodeMax = 0;	ctxt->node = NULL;	ctxt->inputNr = 0;	ctxt->inputMax = 0;	ctxt->input = NULL;	ctxt->nameNr = 0;	ctxt->nameMax = 0;	ctxt->name = NULL;	return(-1);    }    ctxt->nameNr = 0;    ctxt->name = NULL;    /* Allocate the space stack */    if (ctxt->spaceTab == NULL) {	ctxt->spaceTab = (int *) xmlMalloc(10 * sizeof(int));	ctxt->spaceMax = 10;    }    if (ctxt->spaceTab == NULL) {        xmlErrMemory(NULL, "cannot initialize parser context\n");	ctxt->nodeNr = 0;	ctxt->nodeMax = 0;	ctxt->node = NULL;	ctxt->inputNr = 0;	ctxt->inputMax = 0;	ctxt->input = NULL;	ctxt->nameNr = 0;	ctxt->nameMax = 0;	ctxt->name = NULL;	ctxt->spaceNr = 0;	ctxt->spaceMax = 0;	ctxt->space = NULL;	return(-1);    }    ctxt->spaceNr = 1;    ctxt->spaceMax = 10;    ctxt->spaceTab[0] = -1;    ctxt->space = &ctxt->spaceTab[0];    ctxt->userData = ctxt;    ctxt->myDoc = NULL;    ctxt->wellFormed = 1;    ctxt->nsWellFormed = 1;    ctxt->valid = 1;    ctxt->loadsubset = xmlLoadExtDtdDefaultValue;    ctxt->validate = xmlDoValidityCheckingDefaultValue;    ctxt->pedantic = xmlPedanticParserDefaultValue;    ctxt->linenumbers = xmlLineNumbersDefaultValue;    ctxt->keepBlanks = xmlKeepBlanksDefaultValue;    if (ctxt->keepBlanks == 0)	ctxt->sax->ignorableWhitespace = xmlSAX2IgnorableWhitespace;    ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_0;    ctxt->vctxt.userData = ctxt;    ctxt->vctxt.error = xmlParserValidityError;    ctxt->vctxt.warning = xmlParserValidityWarning;

⌨️ 快捷键说明

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