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

📄 catalog.c.svn-base

📁 这是一个用于解析xml文件的类库。使用这个类库
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
    /*     * First tries steps 2/ 3/ 4/ if a system ID is provided.     */    if (sysID != NULL) {	xmlCatalogEntryPtr rewrite = NULL;	int lenrewrite = 0, len;	cur = catal;	haveDelegate = 0;	while (cur != NULL) {	    switch (cur->type) {		case XML_CATA_SYSTEM:		    if (xmlStrEqual(sysID, cur->name)) {			if (xmlDebugCatalogs)			    xmlGenericError(xmlGenericErrorContext,				    "Found system match %s\n", cur->name);			catal->depth--;			return(xmlStrdup(cur->URL));		    }		    break;		case XML_CATA_REWRITE_SYSTEM:		    len = xmlStrlen(cur->name);		    if ((len > lenrewrite) &&			(!xmlStrncmp(sysID, cur->name, len))) {			lenrewrite = len;			rewrite = cur;		    }		    break;		case XML_CATA_DELEGATE_SYSTEM:		    if (!xmlStrncmp(sysID, cur->name, xmlStrlen(cur->name)))			haveDelegate++;		    break;		case XML_CATA_NEXT_CATALOG:		    haveNext++;		    break;		default:		    break;	    }	    cur = cur->next;	}	if (rewrite != NULL) {	    if (xmlDebugCatalogs)		xmlGenericError(xmlGenericErrorContext,			"Using rewriting rule %s\n", rewrite->name);	    ret = xmlStrdup(rewrite->URL);	    if (ret != NULL)		ret = xmlStrcat(ret, &sysID[lenrewrite]);	    catal->depth--;	    return(ret);	}	if (haveDelegate) {	    const xmlChar *delegates[MAX_DELEGATE];	    int nbList = 0, i;	    /*	     * Assume the entries have been sorted by decreasing substring	     * matches when the list was produced.	     */	    cur = catal;	    while (cur != NULL) {		if ((cur->type == XML_CATA_DELEGATE_SYSTEM) &&		    (!xmlStrncmp(sysID, cur->name, xmlStrlen(cur->name)))) {		    for (i = 0;i < nbList;i++)			if (xmlStrEqual(cur->URL, delegates[i]))			    break;		    if (i < nbList) {			cur = cur->next;			continue;		    }		    if (nbList < MAX_DELEGATE)			delegates[nbList++] = cur->URL;		    if (cur->children == NULL) {			xmlFetchXMLCatalogFile(cur);		    }		    if (cur->children != NULL) {			if (xmlDebugCatalogs)			    xmlGenericError(xmlGenericErrorContext,				    "Trying system delegate %s\n", cur->URL);			ret = xmlCatalogListXMLResolve(				cur->children, NULL, sysID);			if (ret != NULL) {			    catal->depth--;			    return(ret);			}		    }		}		cur = cur->next;	    }	    /*	     * Apply the cut algorithm explained in 4/	     */	    catal->depth--;	    return(XML_CATAL_BREAK);	}    }    /*     * Then tries 5/ 6/ if a public ID is provided     */    if (pubID != NULL) {	cur = catal;	haveDelegate = 0;	while (cur != NULL) {	    switch (cur->type) {		case XML_CATA_PUBLIC:		    if (xmlStrEqual(pubID, cur->name)) {			if (xmlDebugCatalogs)			    xmlGenericError(xmlGenericErrorContext,				    "Found public match %s\n", cur->name);			catal->depth--;			return(xmlStrdup(cur->URL));		    }		    break;		case XML_CATA_DELEGATE_PUBLIC:		    if (!xmlStrncmp(pubID, cur->name, xmlStrlen(cur->name)) &&			(cur->prefer == XML_CATA_PREFER_PUBLIC))			haveDelegate++;		    break;		case XML_CATA_NEXT_CATALOG:		    if (sysID == NULL)			haveNext++;		    break;		default:		    break;	    }	    cur = cur->next;	}	if (haveDelegate) {	    const xmlChar *delegates[MAX_DELEGATE];	    int nbList = 0, i;	    /*	     * Assume the entries have been sorted by decreasing substring	     * matches when the list was produced.	     */	    cur = catal;	    while (cur != NULL) {		if ((cur->type == XML_CATA_DELEGATE_PUBLIC) &&		    (cur->prefer == XML_CATA_PREFER_PUBLIC) &&		    (!xmlStrncmp(pubID, cur->name, xmlStrlen(cur->name)))) {		    for (i = 0;i < nbList;i++)			if (xmlStrEqual(cur->URL, delegates[i]))			    break;		    if (i < nbList) {			cur = cur->next;			continue;		    }		    if (nbList < MAX_DELEGATE)			delegates[nbList++] = cur->URL;			    		    if (cur->children == NULL) {			xmlFetchXMLCatalogFile(cur);		    }		    if (cur->children != NULL) {			if (xmlDebugCatalogs)			    xmlGenericError(xmlGenericErrorContext,				    "Trying public delegate %s\n", cur->URL);			ret = xmlCatalogListXMLResolve(				cur->children, pubID, NULL);			if (ret != NULL) {			    catal->depth--;			    return(ret);			}		    }		}		cur = cur->next;	    }	    /*	     * Apply the cut algorithm explained in 4/	     */	    catal->depth--;	    return(XML_CATAL_BREAK);	}    }    if (haveNext) {	cur = catal;	while (cur != NULL) {	    if (cur->type == XML_CATA_NEXT_CATALOG) {		if (cur->children == NULL) {		    xmlFetchXMLCatalogFile(cur);		}		if (cur->children != NULL) {		    ret = xmlCatalogListXMLResolve(cur->children, pubID, sysID);		    if (ret != NULL) {			catal->depth--;			return(ret);		    }		}	    }	    cur = cur->next;	}    }    catal->depth--;    return(NULL);}/** * xmlCatalogXMLResolveURI: * @catal:  a catalog list * @URI:  the URI * @sysID:  the system ID string * * Do a complete resolution lookup of an External Identifier for a * list of catalog entries. * * Implements (or tries to) 7.2.2. URI Resolution * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html * * Returns the URI of the resource or NULL if not found */static xmlChar *xmlCatalogXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) {    xmlChar *ret = NULL;    xmlCatalogEntryPtr cur;    int haveDelegate = 0;    int haveNext = 0;    xmlCatalogEntryPtr rewrite = NULL;    int lenrewrite = 0, len;    if (catal == NULL)	return(NULL);    if (URI == NULL)	return(NULL);    /*     * First tries steps 2/ 3/ 4/ if a system ID is provided.     */    cur = catal;    haveDelegate = 0;    while (cur != NULL) {	switch (cur->type) {	    case XML_CATA_URI:		if (xmlStrEqual(URI, cur->name)) {		    if (xmlDebugCatalogs)			xmlGenericError(xmlGenericErrorContext,				"Found URI match %s\n", cur->name);		    return(xmlStrdup(cur->URL));		}		break;	    case XML_CATA_REWRITE_URI:		len = xmlStrlen(cur->name);		if ((len > lenrewrite) &&		    (!xmlStrncmp(URI, cur->name, len))) {		    lenrewrite = len;		    rewrite = cur;		}		break;	    case XML_CATA_DELEGATE_URI:		if (!xmlStrncmp(URI, cur->name, xmlStrlen(cur->name)))		    haveDelegate++;		break;	    case XML_CATA_NEXT_CATALOG:		haveNext++;		break;	    default:		break;	}	cur = cur->next;    }    if (rewrite != NULL) {	if (xmlDebugCatalogs)	    xmlGenericError(xmlGenericErrorContext,		    "Using rewriting rule %s\n", rewrite->name);	ret = xmlStrdup(rewrite->URL);	if (ret != NULL)	    ret = xmlStrcat(ret, &URI[lenrewrite]);	return(ret);    }    if (haveDelegate) {	const xmlChar *delegates[MAX_DELEGATE];	int nbList = 0, i;	/*	 * Assume the entries have been sorted by decreasing substring	 * matches when the list was produced.	 */	cur = catal;	while (cur != NULL) {	    if (((cur->type == XML_CATA_DELEGATE_SYSTEM) ||	         (cur->type == XML_CATA_DELEGATE_URI)) &&		(!xmlStrncmp(URI, cur->name, xmlStrlen(cur->name)))) {		for (i = 0;i < nbList;i++)		    if (xmlStrEqual(cur->URL, delegates[i]))			break;		if (i < nbList) {		    cur = cur->next;		    continue;		}		if (nbList < MAX_DELEGATE)		    delegates[nbList++] = cur->URL;		if (cur->children == NULL) {		    xmlFetchXMLCatalogFile(cur);		}		if (cur->children != NULL) {		    if (xmlDebugCatalogs)			xmlGenericError(xmlGenericErrorContext,				"Trying URI delegate %s\n", cur->URL);		    ret = xmlCatalogListXMLResolveURI(			    cur->children, URI);		    if (ret != NULL)			return(ret);		}	    }	    cur = cur->next;	}	/*	 * Apply the cut algorithm explained in 4/	 */	return(XML_CATAL_BREAK);    }    if (haveNext) {	cur = catal;	while (cur != NULL) {	    if (cur->type == XML_CATA_NEXT_CATALOG) {		if (cur->children == NULL) {		    xmlFetchXMLCatalogFile(cur);		}		if (cur->children != NULL) {		    ret = xmlCatalogListXMLResolveURI(cur->children, URI);		    if (ret != NULL)			return(ret);		}	    }	    cur = cur->next;	}    }    return(NULL);}/** * xmlCatalogListXMLResolve: * @catal:  a catalog list * @pubID:  the public ID string * @sysID:  the system ID string * * Do a complete resolution lookup of an External Identifier for a * list of catalogs * * Implements (or tries to) 7.1. External Identifier Resolution * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html * * Returns the URI of the resource or NULL if not found */static xmlChar *xmlCatalogListXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,	              const xmlChar *sysID) {    xmlChar *ret = NULL;    xmlChar *urnID = NULL;        if (catal == NULL)        return(NULL);    if ((pubID == NULL) && (sysID == NULL))	return(NULL);    if (!xmlStrncmp(pubID, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) {	urnID = xmlCatalogUnWrapURN(pubID);	if (xmlDebugCatalogs) {	    if (urnID == NULL)		xmlGenericError(xmlGenericErrorContext,			"Public URN ID %s expanded to NULL\n", pubID);	    else		xmlGenericError(xmlGenericErrorContext,			"Public URN ID expanded to %s\n", urnID);	}	ret = xmlCatalogListXMLResolve(catal, urnID, sysID);	if (urnID != NULL)	    xmlFree(urnID);	return(ret);    }    if (!xmlStrncmp(sysID, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) {	urnID = xmlCatalogUnWrapURN(sysID);	if (xmlDebugCatalogs) {	    if (urnID == NULL)		xmlGenericError(xmlGenericErrorContext,			"System URN ID %s expanded to NULL\n", sysID);	    else		xmlGenericError(xmlGenericErrorContext,			"System URN ID expanded to %s\n", urnID);	}	if (pubID == NULL)	    ret = xmlCatalogListXMLResolve(catal, urnID, NULL);	else if (xmlStrEqual(pubID, urnID))	    ret = xmlCatalogListXMLResolve(catal, pubID, NULL);	else {	    ret = xmlCatalogListXMLResolve(catal, pubID, urnID);	}	if (urnID != NULL)	    xmlFree(urnID);	return(ret);    }    while (catal != NULL) {	if (catal->type == XML_CATA_CATALOG) {	    if (catal->children == NULL) {		xmlFetchXMLCatalogFile(catal);	    }	    if (catal->children != NULL) {		ret = xmlCatalogXMLResolve(catal->children, pubID, sysID);		if (ret != NULL)		    return(ret);	    }	}	catal = catal->next;    }    return(ret);}/** * xmlCatalogListXMLResolveURI: * @catal:  a catalog list * @URI:  the URI * * Do a complete resolution lookup of an URI for a list of catalogs * * Implements (or tries to) 7.2. URI Resolution * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html * * Returns the URI of the resource or NULL if not found */static xmlChar *xmlCatalogListXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) {    xmlChar *ret = NULL;    xmlChar *urnID = NULL;        if (catal == NULL)        return(NULL);    if (URI == NULL)	return(NULL);    if (!xmlStrncmp(URI, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) {	urnID = xmlCatalogUnWrapURN(URI);	if (xmlDebugCatalogs) {	    if (urnID == NULL)		xmlGenericError(xmlGenericErrorContext,			"URN ID %s expanded to NULL\n", URI);	    else		xmlGenericError(xmlGenericErrorContext,			"URN ID expanded to %s\n", urnID);	}	ret = xmlCatalogListXMLResolve(catal, urnID, NULL);	if (urnID != NULL)	    xmlFree(urnID);	return(ret);    }    while (catal != NULL) {	if (catal->type == XML_CATA_CATALOG) {	    if (catal->children == NULL) {		xmlFetchXMLCatalogFile(catal);	    }	    if (catal->children != NULL) {		ret = xmlCatalogXMLResolveURI(catal->children, URI);		if (ret != NULL)		    return(ret);	    }	}	catal = catal->next;    }    return(ret);}/************************************************************************ *									* *			The SGML Catalog parser				* *									* ************************************************************************/#define RAW *cur#define NEXT cur++;#define SKIP(x) cur += x;#define SKIP_BLANKS while (IS_BLANK_CH(*cur)) NEXT;/** * xmlParseSGMLCatalogComment: * @cur:  the current character * * Skip a comment in an SGML catalog * * Returns new current character */static const xmlChar *xmlParseSGMLCatalogComment(const xmlChar *cur) {    if ((cur[0] != '-') || (cur[1] != '-')) 	return(cur);    SKIP(2);    while ((cur[0] != 0) && ((cur[0] != '-') || ((cur[1] != '-'))))	NEXT;    if (cur[0] == 0) {	return(NULL);    }    return(cur + 2);}/** * xmlParseSGMLCatalogPubid:

⌨️ 快捷键说明

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