summaryrefslogtreecommitdiff
path: root/catalog.c
diff options
context:
space:
mode:
authorDaniel Veillard <veillard@src.gnome.org>2001-10-01 07:36:25 +0000
committerDaniel Veillard <veillard@src.gnome.org>2001-10-01 07:36:25 +0000
commit16756b627bc32956dcecf43b2c1781b1d0657f8f (patch)
treec7fd7e008b3336e9faffdd93aef6bbd31fc1c5f6 /catalog.c
parent5e1cac1ac0c57643f494682e1bded0aa8b10b21f (diff)
downloadlibxml2-16756b627bc32956dcecf43b2c1781b1d0657f8f.tar.gz
Justin Fletcher provided cleaup code in case HAVE_STAT is not defined Igor
* catalog.c: Justin Fletcher provided cleaup code in case HAVE_STAT is not defined * include/win32config.h: Igor Zlatkovic suggested to have HAVE_STAT defined there Daniel
Diffstat (limited to 'catalog.c')
-rw-r--r--catalog.c133
1 files changed, 82 insertions, 51 deletions
diff --git a/catalog.c b/catalog.c
index d7f69040..d08bd44e 100644
--- a/catalog.c
+++ b/catalog.c
@@ -2016,95 +2016,126 @@ xmlInitializeCatalog(void) {
* Returns 0 in case of success -1 in case of error
*/
int
-xmlLoadCatalog(const char *filename) {
- int fd, len, ret, i;
+xmlLoadCatalog(const char *filename)
+{
+#ifdef HAVE_STAT
+ int fd;
+#else
+ FILE *fd;
+#endif
+ int len, ret, i;
+ long size;
+
+#ifdef HAVE_STAT
struct stat info;
+#endif
xmlChar *content;
if (filename == NULL)
- return(-1);
+ return (-1);
if (xmlDefaultCatalog == NULL)
- xmlDefaultCatalog = xmlHashCreate(20);
+ xmlDefaultCatalog = xmlHashCreate(20);
if (xmlDefaultCatalog == NULL)
- return(-1);
+ return (-1);
/*
* Need to be done after ...
*/
if (!xmlCatalogInitialized)
- xmlInitializeCatalog();
+ xmlInitializeCatalog();
#ifdef HAVE_STAT
- if (stat(filename, &info) < 0)
- return(-1);
+ if (stat(filename, &info) < 0)
+ return (-1);
#endif
/*
* Prevent loops
*/
- for (i = 0;i < catalNr;i++) {
- if (xmlStrEqual((const xmlChar *)catalTab[i],
- (const xmlChar *)filename)) {
- xmlGenericError(xmlGenericErrorContext,
- "xmlLoadCatalog: %s seems to induce a loop\n",
- filename);
- return(-1);
- }
+ for (i = 0; i < catalNr; i++) {
+ if (xmlStrEqual((const xmlChar *) catalTab[i],
+ (const xmlChar *) filename)) {
+ xmlGenericError(xmlGenericErrorContext,
+ "xmlLoadCatalog: %s seems to induce a loop\n",
+ filename);
+ return (-1);
+ }
}
if (catalNr >= catalMax) {
- xmlGenericError(xmlGenericErrorContext,
- "xmlLoadCatalog: %s catalog list too deep\n",
- filename);
- return(-1);
+ xmlGenericError(xmlGenericErrorContext,
+ "xmlLoadCatalog: %s catalog list too deep\n",
+ filename);
+ return (-1);
}
catalTab[catalNr++] = filename;
+#ifdef HAVE_STAT
if ((fd = open(filename, O_RDONLY)) < 0) {
- catalNr--;
- return(-1);
+#else
+ if ((fd = fopen(filename, "rb")) == NULL) {
+#endif
+ catalNr--;
+ return (-1);
}
-
- content = xmlMalloc(info.st_size + 10);
+#ifdef HAVE_STAT
+ size = info.st_size;
+#else
+ if (fseek(fd, 0, SEEK_END) || (size = ftell(fd)) == EOF || fseek(fd, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */
+ fclose(fd);
+ return (-1);
+ }
+#endif
+ content = xmlMalloc(size + 10);
if (content == NULL) {
- xmlGenericError(xmlGenericErrorContext,
- "realloc of %d byte failed\n", info.st_size + 10);
- catalNr--;
- return(-1);
+ xmlGenericError(xmlGenericErrorContext,
+ "realloc of %d byte failed\n", size + 10);
+ catalNr--;
+ return (-1);
}
- len = read(fd, content, info.st_size);
+#ifdef HAVE_STAT
+ len = read(fd, content, size);
+#else
+ len = fread(content, 1, size, fd);
+#endif
if (len < 0) {
- xmlFree(content);
- catalNr--;
- return(-1);
+ xmlFree(content);
+ catalNr--;
+ return (-1);
}
content[len] = 0;
+#ifdef HAVE_STAT
close(fd);
+#else
+ fclose(fd);
+#endif
if ((content[0] == ' ') || (content[0] == '-') ||
- ((content[0] >= 'A') && (content[0] <= 'Z')) ||
- ((content[0] >= 'a') && (content[0] <= 'z')))
- ret = xmlParseSGMLCatalog(content, filename);
+ ((content[0] >= 'A') && (content[0] <= 'Z')) ||
+ ((content[0] >= 'a') && (content[0] <= 'z')))
+ ret = xmlParseSGMLCatalog(content, filename);
else {
- xmlCatalogEntryPtr catal, tmp;
- /* TODO: allow to switch the default preference */
- catal = xmlParseXMLCatalog(content, XML_CATA_PREFER_PUBLIC, filename);
- if (catal != NULL) {
- if (xmlDefaultXMLCatalogList == NULL)
- xmlDefaultXMLCatalogList = catal;
- else {
- tmp = xmlDefaultXMLCatalogList;
- while (tmp->next != NULL)
- tmp = tmp->next;
- tmp->next = catal;
- }
- ret = 0;
- } else
- ret = -1;
+ xmlCatalogEntryPtr catal, tmp;
+
+ /* TODO: allow to switch the default preference */
+ catal =
+ xmlParseXMLCatalog(content, XML_CATA_PREFER_PUBLIC, filename);
+ if (catal != NULL) {
+ if (xmlDefaultXMLCatalogList == NULL)
+ xmlDefaultXMLCatalogList = catal;
+ else {
+ tmp = xmlDefaultXMLCatalogList;
+ while (tmp->next != NULL)
+ tmp = tmp->next;
+ tmp->next = catal;
+ }
+ ret = 0;
+ } else
+ ret = -1;
}
xmlFree(content);
catalNr--;
- return(ret);
+ return (ret);
}
/**