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

📄 valid.c

📁 libxml,在UNIX/LINUX下非常重要的一个库,为XML相关应用提供方便.目前上载的是最新版本,若要取得最新版本,请参考里面的readme.
💻 C
📖 第 1 页 / 共 5 页
字号:
    ret = (xmlElementContentPtr) xmlMalloc(sizeof(xmlElementContent));    if (ret == NULL) {	xmlVErrMemory(NULL, "malloc failed");	return(NULL);    }    memset(ret, 0, sizeof(xmlElementContent));    ret->type = type;    ret->ocur = XML_ELEMENT_CONTENT_ONCE;    if (name != NULL) {        int l;	const xmlChar *tmp;	tmp = xmlSplitQName3(name, &l);	if (tmp == NULL) {	    if (dict == NULL)		ret->name = xmlStrdup(name);	    else	        ret->name = xmlDictLookup(dict, name, -1);	} else {	    if (dict == NULL) {		ret->prefix = xmlStrndup(name, l);		ret->name = xmlStrdup(tmp);	    } else {	        ret->prefix = xmlDictLookup(dict, name, l);		ret->name = xmlDictLookup(dict, tmp, -1);	    }	}    }    return(ret);}/** * xmlNewElementContent: * @name:  the subelement name or NULL * @type:  the type of element content decl * * Allocate an element content structure. * Deprecated in favor of xmlNewDocElementContent * * Returns NULL if not, otherwise the new element content structure */xmlElementContentPtrxmlNewElementContent(const xmlChar *name, xmlElementContentType type) {    return(xmlNewDocElementContent(NULL, name, type));}/** * xmlCopyDocElementContent: * @doc:  the document owning the element declaration * @cur:  An element content pointer. * * Build a copy of an element content description. *  * Returns the new xmlElementContentPtr or NULL in case of error. */xmlElementContentPtrxmlCopyDocElementContent(xmlDocPtr doc, xmlElementContentPtr cur) {    xmlElementContentPtr ret = NULL, prev = NULL, tmp;    xmlDictPtr dict = NULL;    if (cur == NULL) return(NULL);    if (doc != NULL)        dict = doc->dict;    ret = (xmlElementContentPtr) xmlMalloc(sizeof(xmlElementContent));    if (ret == NULL) {	xmlVErrMemory(NULL, "malloc failed");	return(NULL);    }    memset(ret, 0, sizeof(xmlElementContent));    ret->type = cur->type;    ret->ocur = cur->ocur;    if (cur->name != NULL) {	if (dict)	    ret->name = xmlDictLookup(dict, cur->name, -1);	else	    ret->name = xmlStrdup(cur->name);    }        if (cur->prefix != NULL) {	if (dict)	    ret->prefix = xmlDictLookup(dict, cur->prefix, -1);	else	    ret->prefix = xmlStrdup(cur->prefix);    }    if (cur->c1 != NULL)        ret->c1 = xmlCopyDocElementContent(doc, cur->c1);    if (ret->c1 != NULL)	ret->c1->parent = ret;    if (cur->c2 != NULL) {        prev = ret;	cur = cur->c2;	while (cur != NULL) {	    tmp = (xmlElementContentPtr) xmlMalloc(sizeof(xmlElementContent));	    if (tmp == NULL) {		xmlVErrMemory(NULL, "malloc failed");		return(ret);	    }	    memset(tmp, 0, sizeof(xmlElementContent));	    tmp->type = cur->type;	    tmp->ocur = cur->ocur;	    prev->c2 = tmp;	    if (cur->name != NULL) {		if (dict)		    tmp->name = xmlDictLookup(dict, cur->name, -1);		else		    tmp->name = xmlStrdup(cur->name);	    }	    	    if (cur->prefix != NULL) {		if (dict)		    tmp->prefix = xmlDictLookup(dict, cur->prefix, -1);		else		    tmp->prefix = xmlStrdup(cur->prefix);	    }	    if (cur->c1 != NULL)	        tmp->c1 = xmlCopyDocElementContent(doc,cur->c1);	    if (tmp->c1 != NULL)		tmp->c1->parent = ret;	    prev = tmp;	    cur = cur->c2;	}    }    return(ret);}/** * xmlCopyElementContent: * @cur:  An element content pointer. * * Build a copy of an element content description. * Deprecated, use xmlCopyDocElementContent instead *  * Returns the new xmlElementContentPtr or NULL in case of error. */xmlElementContentPtrxmlCopyElementContent(xmlElementContentPtr cur) {    return(xmlCopyDocElementContent(NULL, cur));}/** * xmlFreeDocElementContent: * @doc: the document owning the element declaration * @cur:  the element content tree to free * * Free an element content structure. The whole subtree is removed. */voidxmlFreeDocElementContent(xmlDocPtr doc, xmlElementContentPtr cur) {    xmlElementContentPtr next;    xmlDictPtr dict = NULL;    if (doc != NULL)        dict = doc->dict;    while (cur != NULL) {        next = cur->c2;	switch (cur->type) {	    case XML_ELEMENT_CONTENT_PCDATA:	    case XML_ELEMENT_CONTENT_ELEMENT:	    case XML_ELEMENT_CONTENT_SEQ:	    case XML_ELEMENT_CONTENT_OR:		break;	    default:		xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, 			"Internal: ELEMENT content corrupted invalid type\n",			NULL);		return;	}	if (cur->c1 != NULL) xmlFreeDocElementContent(doc, cur->c1);	if (dict) {	    if ((cur->name != NULL) && (!xmlDictOwns(dict, cur->name)))	        xmlFree((xmlChar *) cur->name);	    if ((cur->prefix != NULL) && (!xmlDictOwns(dict, cur->prefix)))	        xmlFree((xmlChar *) cur->prefix);	} else {	    if (cur->name != NULL) xmlFree((xmlChar *) cur->name);	    if (cur->prefix != NULL) xmlFree((xmlChar *) cur->prefix);	}	xmlFree(cur);	cur = next;    }}/** * xmlFreeElementContent: * @cur:  the element content tree to free * * Free an element content structure. The whole subtree is removed. * Deprecated, use xmlFreeDocElementContent instead */voidxmlFreeElementContent(xmlElementContentPtr cur) {    xmlFreeDocElementContent(NULL, cur);}#ifdef LIBXML_OUTPUT_ENABLED/** * xmlDumpElementContent: * @buf:  An XML buffer * @content:  An element table * @glob: 1 if one must print the englobing parenthesis, 0 otherwise * * This will dump the content of the element table as an XML DTD definition */static voidxmlDumpElementContent(xmlBufferPtr buf, xmlElementContentPtr content, int glob) {    if (content == NULL) return;    if (glob) xmlBufferWriteChar(buf, "(");    switch (content->type) {        case XML_ELEMENT_CONTENT_PCDATA:            xmlBufferWriteChar(buf, "#PCDATA");	    break;	case XML_ELEMENT_CONTENT_ELEMENT:	    if (content->prefix != NULL) {		xmlBufferWriteCHAR(buf, content->prefix);		xmlBufferWriteChar(buf, ":");	    }	    xmlBufferWriteCHAR(buf, content->name);	    break;	case XML_ELEMENT_CONTENT_SEQ:	    if ((content->c1->type == XML_ELEMENT_CONTENT_OR) ||	        (content->c1->type == XML_ELEMENT_CONTENT_SEQ))		xmlDumpElementContent(buf, content->c1, 1);	    else		xmlDumpElementContent(buf, content->c1, 0);            xmlBufferWriteChar(buf, " , ");	    if ((content->c2->type == XML_ELEMENT_CONTENT_OR) ||	        ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) &&		 (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)))		xmlDumpElementContent(buf, content->c2, 1);	    else		xmlDumpElementContent(buf, content->c2, 0);	    break;	case XML_ELEMENT_CONTENT_OR:	    if ((content->c1->type == XML_ELEMENT_CONTENT_OR) ||	        (content->c1->type == XML_ELEMENT_CONTENT_SEQ))		xmlDumpElementContent(buf, content->c1, 1);	    else		xmlDumpElementContent(buf, content->c1, 0);            xmlBufferWriteChar(buf, " | ");	    if ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) ||	        ((content->c2->type == XML_ELEMENT_CONTENT_OR) &&		 (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)))		xmlDumpElementContent(buf, content->c2, 1);	    else		xmlDumpElementContent(buf, content->c2, 0);	    break;	default:	    xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, 		    "Internal: ELEMENT content corrupted invalid type\n",		    NULL);    }    if (glob)        xmlBufferWriteChar(buf, ")");    switch (content->ocur) {        case XML_ELEMENT_CONTENT_ONCE:	    break;        case XML_ELEMENT_CONTENT_OPT:	    xmlBufferWriteChar(buf, "?");	    break;        case XML_ELEMENT_CONTENT_MULT:	    xmlBufferWriteChar(buf, "*");	    break;        case XML_ELEMENT_CONTENT_PLUS:	    xmlBufferWriteChar(buf, "+");	    break;    }}/** * xmlSprintfElementContent: * @buf:  an output buffer * @content:  An element table * @glob: 1 if one must print the englobing parenthesis, 0 otherwise * * Deprecated, unsafe, use xmlSnprintfElementContent */voidxmlSprintfElementContent(char *buf ATTRIBUTE_UNUSED,	                 xmlElementContentPtr content ATTRIBUTE_UNUSED,			 int glob ATTRIBUTE_UNUSED) {}#endif /* LIBXML_OUTPUT_ENABLED *//** * xmlSnprintfElementContent: * @buf:  an output buffer * @size:  the buffer size * @content:  An element table * @glob: 1 if one must print the englobing parenthesis, 0 otherwise * * This will dump the content of the element content definition * Intended just for the debug routine */voidxmlSnprintfElementContent(char *buf, int size, xmlElementContentPtr content, int glob) {    int len;    if (content == NULL) return;    len = strlen(buf);    if (size - len < 50) {	if ((size - len > 4) && (buf[len - 1] != '.'))	    strcat(buf, " ...");	return;    }    if (glob) strcat(buf, "(");    switch (content->type) {        case XML_ELEMENT_CONTENT_PCDATA:            strcat(buf, "#PCDATA");	    break;	case XML_ELEMENT_CONTENT_ELEMENT:	    if (content->prefix != NULL) {		if (size - len < xmlStrlen(content->prefix) + 10) {		    strcat(buf, " ...");		    return;		}		strcat(buf, (char *) content->prefix);		strcat(buf, ":");	    }	    if (size - len < xmlStrlen(content->name) + 10) {		strcat(buf, " ...");		return;	    }	    if (content->name != NULL)		strcat(buf, (char *) content->name);	    break;	case XML_ELEMENT_CONTENT_SEQ:	    if ((content->c1->type == XML_ELEMENT_CONTENT_OR) ||	        (content->c1->type == XML_ELEMENT_CONTENT_SEQ))		xmlSnprintfElementContent(buf, size, content->c1, 1);	    else		xmlSnprintfElementContent(buf, size, content->c1, 0);	    len = strlen(buf);	    if (size - len < 50) {		if ((size - len > 4) && (buf[len - 1] != '.'))		    strcat(buf, " ...");		return;	    }            strcat(buf, " , ");	    if (((content->c2->type == XML_ELEMENT_CONTENT_OR) ||		 (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)) &&		(content->c2->type != XML_ELEMENT_CONTENT_ELEMENT))		xmlSnprintfElementContent(buf, size, content->c2, 1);	    else		xmlSnprintfElementContent(buf, size, content->c2, 0);	    break;	case XML_ELEMENT_CONTENT_OR:	    if ((content->c1->type == XML_ELEMENT_CONTENT_OR) ||	        (content->c1->type == XML_ELEMENT_CONTENT_SEQ))		xmlSnprintfElementContent(buf, size, content->c1, 1);	    else		xmlSnprintfElementContent(buf, size, content->c1, 0);	    len = strlen(buf);	    if (size - len < 50) {		if ((size - len > 4) && (buf[len - 1] != '.'))		    strcat(buf, " ...");		return;	    }            strcat(buf, " | ");	    if (((content->c2->type == XML_ELEMENT_CONTENT_SEQ) ||		 (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)) &&		(content->c2->type != XML_ELEMENT_CONTENT_ELEMENT))		xmlSnprintfElementContent(buf, size, content->c2, 1);	    else		xmlSnprintfElementContent(buf, size, content->c2, 0);	    break;    }    if (glob)        strcat(buf, ")");    switch (content->ocur) {        case XML_ELEMENT_CONTENT_ONCE:	    break;        case XML_ELEMENT_CONTENT_OPT:	    strcat(buf, "?");	    break;        case XML_ELEMENT_CONTENT_MULT:	    strcat(buf, "*");	    break;        case XML_ELEMENT_CONTENT_PLUS:	    strcat(buf, "+");	    break;    }}/**************************************************************** *								* *	Registration of DTD declarations			* *								* ****************************************************************//** * xmlFreeElement: * @elem:  An element * * Deallocate the memory used by an element definition */static voidxmlFreeElement(xmlElementPtr elem) {    if (elem == NULL) return;    xmlUnlinkNode((xmlNodePtr) elem);    xmlFreeDocElementContent(elem->doc, elem->content);    if (elem->name != NULL)	xmlFree((xmlChar *) elem->name);    if (elem->prefix != NULL)	xmlFree((xmlChar *) elem->prefix);#ifdef LIBXML_REGEXP_ENABLED    if (elem->contModel != NULL)	xmlRegFreeRegexp(elem->contModel);#endif    xmlFree(elem);}/** * xmlAddElementDecl: * @ctxt:  the validation context * @dtd:  pointer to the DTD * @name:  the entity name * @type:  the element type * @content:  the element content tree or NULL * * Register a new element declaration * * Returns NULL if not, otherwise the entity */xmlElementPtrxmlAddElementDecl(xmlValidCtxtPtr ctxt,                  xmlDtdPtr dtd, const xmlChar *name,                  xmlElementTypeVal type,		  xmlElementContentPtr content) {    xmlElementPtr ret;    xmlElementTablePtr table;    xmlAttributePtr oldAttributes = NULL;    xmlChar *ns, *uqname;    if (dtd == NULL) {	return(NULL);    }    if (name == NULL) {	return(NULL);    }    switch (type) {        case XML_ELEMENT_TYPE_EMPTY:	    if (content != NULL) {		xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, 		        "xmlAddElementDecl: content != NULL for EMPTY\n",			NULL);		return(NULL);	    }	    break;	case XML_ELEMENT_TYPE_ANY:	    if (content != NULL) {		xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, 		        "xmlAddElementDecl: content != NULL for ANY\n",			NULL);		return(NULL);	    }	    break;	case XML_ELEMENT_TYPE_MIXED:	    if (content == NULL) {		xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, 		        "xmlAddElementDecl: content == NULL for MIXED\n",			NULL);		return(NULL);	    }

⌨️ 快捷键说明

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