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

📄 parser.c

📁 SIP 1.5.0源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
 * Returns the new input stream or NULL */xmlParserInputPtrxmlNewInputStream(xmlParserCtxtPtr ctxt) {    xmlParserInputPtr input;    input = (xmlParserInputPtr) xmlMalloc(sizeof(xmlParserInput));    if (input == NULL) {	if (ctxt != NULL) {	    ctxt->errNo = XML_ERR_NO_MEMORY;	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))		ctxt->sax->error(ctxt->userData, 			 "malloc: couldn't allocate a new input stream\n");	    ctxt->errNo = XML_ERR_NO_MEMORY;	}	return(NULL);    }    memset(input, 0, sizeof(xmlParserInput));    input->line = 1;    input->col = 1;    input->standalone = -1;    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;    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;    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) {        ctxt->errNo = XML_ERR_INTERNAL_ERROR;        if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))	    ctxt->sax->error(ctxt->userData,	      "internal: xmlNewEntityInputStream entity = NULL\n");	ctxt->errNo = XML_ERR_INTERNAL_ERROR;	return(NULL);    }    if (entity->content == NULL) {	switch (entity->etype) {            case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:	        ctxt->errNo = XML_ERR_UNPARSED_ENTITY;		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))		    ctxt->sax->error(ctxt->userData,		      "xmlNewEntityInputStream unparsed entity !\n");                break;            case XML_EXTERNAL_GENERAL_PARSED_ENTITY:            case XML_EXTERNAL_PARAMETER_ENTITY:		return(xmlLoadExternalEntity((char *) entity->SystemID,		       (char *) entity->ExternalID, ctxt));            case XML_INTERNAL_GENERAL_ENTITY:		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))		    ctxt->sax->error(ctxt->userData,	  "Internal entity %s without content !\n", entity->name);                break;            case XML_INTERNAL_PARAMETER_ENTITY:		ctxt->errNo = XML_ERR_INTERNAL_ERROR;		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))		    ctxt->sax->error(ctxt->userData,	  "Internal parameter entity %s without content !\n", entity->name);                break;            case XML_INTERNAL_PREDEFINED_ENTITY:		ctxt->errNo = XML_ERR_INTERNAL_ERROR;		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))		    ctxt->sax->error(ctxt->userData,	      "Predefined entity %s without content !\n", entity->name);                break;	}	return(NULL);    }    input = xmlNewInputStream(ctxt);    if (input == NULL) {	return(NULL);    }    input->filename = (char *) entity->SystemID;    input->base = entity->content;    input->cur = entity->content;    input->length = entity->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) {	ctxt->errNo = XML_ERR_INTERNAL_ERROR;        if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))	    ctxt->sax->error(ctxt->userData,	      "internal: xmlNewStringInputStream string = NULL\n");	return(NULL);    }    input = xmlNewInputStream(ctxt);    if (input == NULL) {	return(NULL);    }    input->base = buffer;    input->cur = buffer;    input->length = xmlStrlen(buffer);    return(input);}/** * xmlNewInputFromFile: * @ctxt:  an XML parser context * @filename:  the filename to use as entity * * Create a new input stream based on a file. * * Returns the new input stream or NULL in case of error */xmlParserInputPtrxmlNewInputFromFile(xmlParserCtxtPtr ctxt, const char *filename) {    xmlParserInputBufferPtr buf;    xmlParserInputPtr inputStream;    char *directory = NULL;    if (ctxt == NULL) return(NULL);    buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE);    if (buf == NULL) {	char name[XML_PARSER_BIG_BUFFER_SIZE];        if ((ctxt->input != NULL) && (ctxt->input->directory != NULL)) {#ifdef WIN32            sprintf(name, "%s\\%s", ctxt->input->directory, filename);#else            sprintf(name, "%s/%s", ctxt->input->directory, filename);#endif            buf = xmlParserInputBufferCreateFilename(name,	                                             XML_CHAR_ENCODING_NONE);	    if (buf != NULL)		directory = xmlParserGetDirectory(name);	}	if ((buf == NULL) && (ctxt->directory != NULL)) {#ifdef WIN32            sprintf(name, "%s\\%s", ctxt->directory, filename);#else            sprintf(name, "%s/%s", ctxt->directory, filename);#endif            buf = xmlParserInputBufferCreateFilename(name,	                                             XML_CHAR_ENCODING_NONE);	    if (buf != NULL)		directory = xmlParserGetDirectory(name);	}	if (buf == NULL)	    return(NULL);    }    if (directory == NULL)        directory = xmlParserGetDirectory(filename);    inputStream = xmlNewInputStream(ctxt);    if (inputStream == NULL) {	if (directory != NULL) xmlFree((char *) directory);	return(NULL);    }    inputStream->filename = xmlMemStrdup(filename);    inputStream->directory = directory;    inputStream->buf = buf;    inputStream->base = inputStream->buf->buffer->content;    inputStream->cur = inputStream->buf->buffer->content;    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 */voidxmlInitParserCtxt(xmlParserCtxtPtr ctxt){    xmlSAXHandler *sax;    xmlDefaultSAXHandlerInit();    sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler));    if (sax == NULL) {        fprintf(stderr, "xmlInitParserCtxt: out of memory\n");    }    memset(sax, 0, sizeof(xmlSAXHandler));    /* Allocate the Input stack */    ctxt->inputTab = (xmlParserInputPtr *) xmlMalloc(5 * sizeof(xmlParserInputPtr));    ctxt->inputNr = 0;    ctxt->inputMax = 5;    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 */    ctxt->nodeTab = (xmlNodePtr *) xmlMalloc(10 * sizeof(xmlNodePtr));    ctxt->nodeNr = 0;    ctxt->nodeMax = 10;    ctxt->node = NULL;    /* Allocate the Name stack */    ctxt->nameTab = (xmlChar **) xmlMalloc(10 * sizeof(xmlChar *));    ctxt->nameNr = 0;    ctxt->nameMax = 10;    ctxt->name = NULL;    /* Allocate the space stack */    ctxt->spaceTab = (int *) xmlMalloc(10 * sizeof(int));    ctxt->spaceNr = 1;    ctxt->spaceMax = 10;    ctxt->spaceTab[0] = -1;    ctxt->space = &ctxt->spaceTab[0];    if (sax == NULL) {	ctxt->sax = &xmlDefaultSAXHandler;    } else {        ctxt->sax = sax;	memcpy(sax, &xmlDefaultSAXHandler, sizeof(xmlSAXHandler));    }    ctxt->userData = ctxt;    ctxt->myDoc = NULL;    ctxt->wellFormed = 1;    ctxt->valid = 1;    ctxt->validate = xmlDoValidityCheckingDefaultValue;    ctxt->keepBlanks = xmlKeepBlanksDefaultValue;    ctxt->vctxt.userData = ctxt;    if (ctxt->validate) {	ctxt->vctxt.error = xmlParserValidityError;	if (xmlGetWarningsDefaultValue == 0)	    ctxt->vctxt.warning = NULL;	else	    ctxt->vctxt.warning = xmlParserValidityWarning;	/* Allocate the Node stack */	ctxt->vctxt.nodeTab = (xmlNodePtr *) xmlMalloc(4 * sizeof(xmlNodePtr));	ctxt->vctxt.nodeNr = 0;	ctxt->vctxt.nodeMax = 4;	ctxt->vctxt.node = NULL;    } else {	ctxt->vctxt.error = NULL;	ctxt->vctxt.warning = NULL;    }    ctxt->replaceEntities = xmlSubstituteEntitiesDefaultValue;    ctxt->record_info = 0;    ctxt->nbChars = 0;    ctxt->checkIndex = 0;    ctxt->inSubset = 0;    ctxt->errNo = XML_ERR_OK;    ctxt->depth = 0;    xmlInitNodeInfoSeq(&ctxt->node_seq);}/** * xmlFreeParserCtxt: * @ctxt:  an XML parser context * * Free all the memory used by a parser context. However the parsed * document in ctxt->myDoc is not freed. */voidxmlFreeParserCtxt(xmlParserCtxtPtr ctxt){    xmlParserInputPtr input;    xmlChar *oldname;    if (ctxt == NULL) return;    while ((input = inputPop(ctxt)) != NULL) {        xmlFreeInputStream(input);    }    while ((oldname = namePop(ctxt)) != NULL) {	xmlFree(oldname);    }    if (ctxt->spaceTab != NULL) xmlFree(ctxt->spaceTab);    if (ctxt->nameTab != NULL) xmlFree(ctxt->nameTab);    if (ctxt->nodeTab != NULL) xmlFree(ctxt->nodeTab);    if (ctxt->inputTab != NULL) xmlFree(ctxt->inputTab);    if (ctxt->version != NULL) xmlFree((char *) ctxt->version);    if (ctxt->encoding != NULL) xmlFree((char *) ctxt->encoding);    if (ctxt->intSubName != NULL) xmlFree((char *) ctxt->intSubName);    if (ctxt->extSubURI != NULL) xmlFree((char *) ctxt->extSubURI);    if (ctxt->extSubSystem != NULL) xmlFree((char *) ctxt->extSubSystem);    if (ctxt->vctxt.nodeTab != NULL) xmlFree(ctxt->vctxt.nodeTab);    if ((ctxt->sax != NULL) && (ctxt->sax != &xmlDefaultSAXHandler))        xmlFree(ctxt->sax);    if (ctxt->directory != NULL) xmlFree((char *) ctxt->directory);    xmlFree(ctxt);}/** * xmlNewParserCtxt: * * Allocate and initialize a new parser context. * * Returns the xmlParserCtxtPtr or NULL */xmlParserCtxtPtrxmlNewParserCtxt(){    xmlParserCtxtPtr ctxt;    ctxt = (xmlParserCtxtPtr) xmlMalloc(sizeof(xmlParserCtxt));    if (ctxt == NULL) {        fprintf(stderr, "xmlNewParserCtxt : cannot allocate context\n");        perror("malloc");	return(NULL);    }    memset(ctxt, 0, sizeof(xmlParserCtxt));    xmlInitParserCtxt(ctxt);    return(ctxt);}/** * xmlClearParserCtxt: * @ctxt:  an XML parser context * * Clear (release owned resources) and reinitialize a parser context */voidxmlClearParserCtxt(xmlParserCtxtPtr ctxt){  xmlClearNodeInfoSeq(&ctxt->node_seq);  xmlInitParserCtxt(ctxt);}/************************************************************************ *									* *		Commodity functions to handle entities			* *									* ************************************************************************//** * xmlCheckEntity: * @ctxt:  an XML parser context * @content:  the entity content string * * Parse an entity content and checks the WF constraints * */voidxmlCheckEntity(xmlParserCtxtPtr ctxt, const xmlChar *content) {}/** * 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) {    int val = 0;    if (ctxt->token != 0) {	val = ctxt->token;        ctxt->token = 0;        return(val);    }    if ((RAW == '&') && (NXT(1) == '#') &&        (NXT(2) == 'x')) {	SKIP(3);	while (RAW != ';') {	    if ((RAW >= '0') && (RAW <= '9')) 	        val = val * 16 + (CUR - '0');	    else if ((RAW >= 'a') && (RAW <= 'f'))	        val = val * 16 + (CUR - 'a') + 10;	    else if ((RAW >= 'A') && (RAW <= 'F'))	        val = val * 16 + (CUR - 'A') + 10;	    else {		ctxt->errNo = XML_ERR_INVALID_HEX_CHARREF;	        if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))		    ctxt->sax->error(ctxt->userData, 		         "xmlParseCharRef: invalid hexadecimal value\n");		ctxt->wellFormed = 0;		ctxt->disableSAX = 1;		val = 0;		break;	    }	    NEXT;	}	if (RAW == ';') {	    /* on purpose to avoid reentrancy problems with NEXT and SKIP */	    ctxt->nbChars ++;	    ctxt->input->cur++;

⌨️ 快捷键说明

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