Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(496)

Side by Side Diff: third_party/libxml/src/catalog.c

Issue 1193533007: Upgrade to libxml 2.9.2 and libxslt 1.1.28 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: no iconv Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/libxml/src/c14n.c ('k') | third_party/libxml/src/chvalid.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /** 1 /**
2 * catalog.c: set of generic Catalog related routines 2 * catalog.c: set of generic Catalog related routines
3 * 3 *
4 * Reference: SGML Open Technical Resolution TR9401:1997. 4 * Reference: SGML Open Technical Resolution TR9401:1997.
5 * http://www.jclark.com/sp/catalog.htm 5 * http://www.jclark.com/sp/catalog.htm
6 * 6 *
7 * XML Catalogs Working Draft 06 August 2001 7 * XML Catalogs Working Draft 06 August 2001
8 * http://www.oasis-open.org/committees/entity/spec-2001-08-06.html 8 * http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
9 * 9 *
10 * See Copyright for the status of this software. 10 * See Copyright for the status of this software.
11 * 11 *
12 * Daniel.Veillard@imag.fr 12 * Daniel.Veillard@imag.fr
(...skipping 21 matching lines...) Expand all
34 #include <string.h> 34 #include <string.h>
35 #include <libxml/xmlmemory.h> 35 #include <libxml/xmlmemory.h>
36 #include <libxml/hash.h> 36 #include <libxml/hash.h>
37 #include <libxml/uri.h> 37 #include <libxml/uri.h>
38 #include <libxml/parserInternals.h> 38 #include <libxml/parserInternals.h>
39 #include <libxml/catalog.h> 39 #include <libxml/catalog.h>
40 #include <libxml/xmlerror.h> 40 #include <libxml/xmlerror.h>
41 #include <libxml/threads.h> 41 #include <libxml/threads.h>
42 #include <libxml/globals.h> 42 #include <libxml/globals.h>
43 43
44 #include "buf.h"
45
44 #define MAX_DELEGATE 50 46 #define MAX_DELEGATE 50
45 #define MAX_CATAL_DEPTH 50 47 #define MAX_CATAL_DEPTH 50
46 48
47 #ifdef _WIN32 49 #ifdef _WIN32
48 # define PATH_SEAPARATOR ';' 50 # define PATH_SEAPARATOR ';'
49 #else 51 #else
50 # define PATH_SEAPARATOR ':' 52 # define PATH_SEAPARATOR ':'
51 #endif 53 #endif
52 54
53 /** 55 /**
54 * TODO: 56 * TODO:
55 * 57 *
56 * macro to flag unimplemented blocks 58 * macro to flag unimplemented blocks
57 * XML_CATALOG_PREFER user env to select between system/public prefered 59 * XML_CATALOG_PREFER user env to select between system/public prefered
58 * option. C.f. Richard Tobin <richard@cogsci.ed.ac.uk> 60 * option. C.f. Richard Tobin <richard@cogsci.ed.ac.uk>
59 *> Just FYI, I am using an environment variable XML_CATALOG_PREFER with 61 *> Just FYI, I am using an environment variable XML_CATALOG_PREFER with
60 *> values "system" and "public". I have made the default be "system" to 62 *> values "system" and "public". I have made the default be "system" to
61 *> match yours. 63 *> match yours.
62 */ 64 */
63 #define TODO » » » » » » » » \ 65 #define TODO» » » » » » » » \
64 xmlGenericError(xmlGenericErrorContext, \ 66 xmlGenericError(xmlGenericErrorContext, \
65 "Unimplemented block at %s:%d\n", \ 67 "Unimplemented block at %s:%d\n", \
66 __FILE__, __LINE__); 68 __FILE__, __LINE__);
67 69
68 #define XML_URN_PUBID "urn:publicid:" 70 #define XML_URN_PUBID "urn:publicid:"
69 #define XML_CATAL_BREAK ((xmlChar *) -1) 71 #define XML_CATAL_BREAK ((xmlChar *) -1)
70 #ifndef XML_XML_DEFAULT_CATALOG 72 #ifndef XML_XML_DEFAULT_CATALOG
71 #define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog" 73 #define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog"
72 #endif 74 #endif
73 #ifndef XML_SGML_DEFAULT_CATALOG 75 #ifndef XML_SGML_DEFAULT_CATALOG
74 #define XML_SGML_DEFAULT_CATALOG "file:///etc/sgml/catalog" 76 #define XML_SGML_DEFAULT_CATALOG "file:///etc/sgml/catalog"
75 #endif 77 #endif
76 78
77 #if defined(_WIN32) && defined(_MSC_VER) 79 #if defined(_WIN32) && defined(_MSC_VER)
78 #undef XML_XML_DEFAULT_CATALOG 80 #undef XML_XML_DEFAULT_CATALOG
79 static char XML_XML_DEFAULT_CATALOG[256] = "file:///etc/xml/catalog"; 81 static char XML_XML_DEFAULT_CATALOG[256] = "file:///etc/xml/catalog";
80 #if defined(_WIN32_WCE) 82 #if defined(_WIN32_WCE)
81 /* Windows CE don't have a A variant */ 83 /* Windows CE don't have a A variant */
82 #define GetModuleHandleA GetModuleHandle 84 #define GetModuleHandleA GetModuleHandle
83 #define GetModuleFileNameA GetModuleFileName 85 #define GetModuleFileNameA GetModuleFileName
84 #else 86 #else
87 #if !defined(_WINDOWS_)
85 void* __stdcall GetModuleHandleA(const char*); 88 void* __stdcall GetModuleHandleA(const char*);
86 unsigned long __stdcall GetModuleFileNameA(void*, char*, unsigned long); 89 unsigned long __stdcall GetModuleFileNameA(void*, char*, unsigned long);
87 #endif 90 #endif
88 #endif 91 #endif
92 #endif
89 93
90 static xmlChar *xmlCatalogNormalizePublic(const xmlChar *pubID); 94 static xmlChar *xmlCatalogNormalizePublic(const xmlChar *pubID);
91 static int xmlExpandCatalog(xmlCatalogPtr catal, const char *filename); 95 static int xmlExpandCatalog(xmlCatalogPtr catal, const char *filename);
92 96
93 /************************************************************************ 97 /************************************************************************
94 * * 98 * *
95 * Types, all private * 99 * Types, all private *
96 * * 100 * *
97 ************************************************************************/ 101 ************************************************************************/
98 102
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 */ 203 */
200 static xmlRMutexPtr xmlCatalogMutex = NULL; 204 static xmlRMutexPtr xmlCatalogMutex = NULL;
201 205
202 /* 206 /*
203 * Whether the catalog support was initialized. 207 * Whether the catalog support was initialized.
204 */ 208 */
205 static int xmlCatalogInitialized = 0; 209 static int xmlCatalogInitialized = 0;
206 210
207 /************************************************************************ 211 /************************************************************************
208 * * 212 * *
209 * » » » Catalog error handlers» » » » * 213 *» » » Catalog error handlers» » » » *
210 * * 214 * *
211 ************************************************************************/ 215 ************************************************************************/
212 216
213 /** 217 /**
214 * xmlCatalogErrMemory: 218 * xmlCatalogErrMemory:
215 * @extra: extra informations 219 * @extra: extra informations
216 * 220 *
217 * Handle an out of memory condition 221 * Handle an out of memory condition
218 */ 222 */
219 static void 223 static void
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 * Allocation and Freeing * 256 * Allocation and Freeing *
253 * * 257 * *
254 ************************************************************************/ 258 ************************************************************************/
255 259
256 /** 260 /**
257 * xmlNewCatalogEntry: 261 * xmlNewCatalogEntry:
258 * @type: type of entry 262 * @type: type of entry
259 * @name: name of the entry 263 * @name: name of the entry
260 * @value: value of the entry 264 * @value: value of the entry
261 * @prefer: the PUBLIC vs. SYSTEM current preference value 265 * @prefer: the PUBLIC vs. SYSTEM current preference value
262 * @group: for members of a group, the group entry 266 * @group: for members of a group, the group entry
263 * 267 *
264 * create a new Catalog entry, this type is shared both by XML and 268 * create a new Catalog entry, this type is shared both by XML and
265 * SGML catalogs, but the acceptable types values differs. 269 * SGML catalogs, but the acceptable types values differs.
266 * 270 *
267 * Returns the xmlCatalogEntryPtr or NULL in case of error 271 * Returns the xmlCatalogEntryPtr or NULL in case of error
268 */ 272 */
269 static xmlCatalogEntryPtr 273 static xmlCatalogEntryPtr
270 xmlNewCatalogEntry(xmlCatalogEntryType type, const xmlChar *name, 274 xmlNewCatalogEntry(xmlCatalogEntryType type, const xmlChar *name,
271 const xmlChar *value, const xmlChar *URL, xmlCatalogPrefer prefer, 275 const xmlChar *value, const xmlChar *URL, xmlCatalogPrefer prefer,
272 xmlCatalogEntryPtr group) { 276 xmlCatalogEntryPtr group) {
273 xmlCatalogEntryPtr ret; 277 xmlCatalogEntryPtr ret;
274 xmlChar *normid = NULL; 278 xmlChar *normid = NULL;
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 } 396 }
393 catal->dealloc = 0; 397 catal->dealloc = 0;
394 xmlFreeCatalogEntry(catal); 398 xmlFreeCatalogEntry(catal);
395 } 399 }
396 400
397 /** 401 /**
398 * xmlCreateNewCatalog: 402 * xmlCreateNewCatalog:
399 * @type: type of catalog 403 * @type: type of catalog
400 * @prefer: the PUBLIC vs. SYSTEM current preference value 404 * @prefer: the PUBLIC vs. SYSTEM current preference value
401 * 405 *
402 * create a new Catalog, this type is shared both by XML and 406 * create a new Catalog, this type is shared both by XML and
403 * SGML catalogs, but the acceptable types values differs. 407 * SGML catalogs, but the acceptable types values differs.
404 * 408 *
405 * Returns the xmlCatalogPtr or NULL in case of error 409 * Returns the xmlCatalogPtr or NULL in case of error
406 */ 410 */
407 static xmlCatalogPtr 411 static xmlCatalogPtr
408 xmlCreateNewCatalog(xmlCatalogType type, xmlCatalogPrefer prefer) { 412 xmlCreateNewCatalog(xmlCatalogType type, xmlCatalogPrefer prefer) {
409 xmlCatalogPtr ret; 413 xmlCatalogPtr ret;
410 414
411 ret = (xmlCatalogPtr) xmlMalloc(sizeof(xmlCatalog)); 415 ret = (xmlCatalogPtr) xmlMalloc(sizeof(xmlCatalog));
412 if (ret == NULL) { 416 if (ret == NULL) {
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 case XML_CATA_NONE: 564 case XML_CATA_NONE:
561 break; 565 break;
562 case XML_CATA_GROUP: 566 case XML_CATA_GROUP:
563 node = xmlNewDocNode(doc, ns, BAD_CAST "group", NULL); 567 node = xmlNewDocNode(doc, ns, BAD_CAST "group", NULL);
564 xmlSetProp(node, BAD_CAST "id", cur->name); 568 xmlSetProp(node, BAD_CAST "id", cur->name);
565 if (cur->value != NULL) { 569 if (cur->value != NULL) {
566 xmlNsPtr xns; 570 xmlNsPtr xns;
567 xns = xmlSearchNsByHref(doc, node, XML_XML_NAMESPACE); 571 xns = xmlSearchNsByHref(doc, node, XML_XML_NAMESPACE);
568 if (xns != NULL) 572 if (xns != NULL)
569 xmlSetNsProp(node, xns, BAD_CAST "base", 573 xmlSetNsProp(node, xns, BAD_CAST "base",
570 » » » » » cur->value); 574 » » » » » cur->value);
571 } 575 }
572 switch (cur->prefer) { 576 switch (cur->prefer) {
573 case XML_CATA_PREFER_NONE: 577 case XML_CATA_PREFER_NONE:
574 break; 578 break;
575 case XML_CATA_PREFER_PUBLIC: 579 case XML_CATA_PREFER_PUBLIC:
576 xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "public "); 580 xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "public ");
577 break; 581 break;
578 case XML_CATA_PREFER_SYSTEM: 582 case XML_CATA_PREFER_SYSTEM:
579 xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "system "); 583 xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "system ");
580 break; 584 break;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 catalog = xmlNewDocNode(doc, ns, BAD_CAST "catalog", NULL); 682 catalog = xmlNewDocNode(doc, ns, BAD_CAST "catalog", NULL);
679 if (catalog == NULL) { 683 if (catalog == NULL) {
680 xmlFreeNs(ns); 684 xmlFreeNs(ns);
681 xmlFreeDoc(doc); 685 xmlFreeDoc(doc);
682 return(-1); 686 return(-1);
683 } 687 }
684 catalog->nsDef = ns; 688 catalog->nsDef = ns;
685 xmlAddChild((xmlNodePtr) doc, catalog); 689 xmlAddChild((xmlNodePtr) doc, catalog);
686 690
687 xmlDumpXMLCatalogNode(catal, catalog, doc, ns, NULL); 691 xmlDumpXMLCatalogNode(catal, catalog, doc, ns, NULL);
688 692
689 /* 693 /*
690 * reserialize it 694 * reserialize it
691 */ 695 */
692 buf = xmlOutputBufferCreateFile(out, NULL); 696 buf = xmlOutputBufferCreateFile(out, NULL);
693 if (buf == NULL) { 697 if (buf == NULL) {
694 xmlFreeDoc(doc); 698 xmlFreeDoc(doc);
695 return(-1); 699 return(-1);
696 } 700 }
697 ret = xmlSaveFormatFileTo(buf, doc, NULL, 1); 701 ret = xmlSaveFormatFileTo(buf, doc, NULL, 1);
698 702
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
815 * by the caller. 819 * by the caller.
816 */ 820 */
817 static xmlChar * 821 static xmlChar *
818 xmlCatalogUnWrapURN(const xmlChar *urn) { 822 xmlCatalogUnWrapURN(const xmlChar *urn) {
819 xmlChar result[2000]; 823 xmlChar result[2000];
820 unsigned int i = 0; 824 unsigned int i = 0;
821 825
822 if (xmlStrncmp(urn, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) 826 if (xmlStrncmp(urn, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1))
823 return(NULL); 827 return(NULL);
824 urn += sizeof(XML_URN_PUBID) - 1; 828 urn += sizeof(XML_URN_PUBID) - 1;
825 829
826 while (*urn != 0) { 830 while (*urn != 0) {
827 if (i > sizeof(result) - 4) 831 if (i > sizeof(result) - 4)
828 break; 832 break;
829 if (*urn == '+') { 833 if (*urn == '+') {
830 result[i++] = ' '; 834 result[i++] = ' ';
831 urn++; 835 urn++;
832 } else if (*urn == ':') { 836 } else if (*urn == ':') {
833 result[i++] = '/'; 837 result[i++] = '/';
834 result[i++] = '/'; 838 result[i++] = '/';
835 urn++; 839 urn++;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
905 } 909 }
906 910
907 inputStream = xmlNewInputStream(ctxt); 911 inputStream = xmlNewInputStream(ctxt);
908 if (inputStream == NULL) { 912 if (inputStream == NULL) {
909 xmlFreeParserCtxt(ctxt); 913 xmlFreeParserCtxt(ctxt);
910 return(NULL); 914 return(NULL);
911 } 915 }
912 916
913 inputStream->filename = (char *) xmlCanonicPath((const xmlChar *)filename); 917 inputStream->filename = (char *) xmlCanonicPath((const xmlChar *)filename);
914 inputStream->buf = buf; 918 inputStream->buf = buf;
915 inputStream->base = inputStream->buf->buffer->content; 919 xmlBufResetInput(buf->buffer, inputStream);
916 inputStream->cur = inputStream->buf->buffer->content;
917 inputStream->end =
918 » &inputStream->buf->buffer->content[inputStream->buf->buffer->use];
919 920
920 inputPush(ctxt, inputStream); 921 inputPush(ctxt, inputStream);
921 if ((ctxt->directory == NULL) && (directory == NULL)) 922 if ((ctxt->directory == NULL) && (directory == NULL))
922 directory = xmlParserGetDirectory(filename); 923 directory = xmlParserGetDirectory(filename);
923 if ((ctxt->directory == NULL) && (directory != NULL)) 924 if ((ctxt->directory == NULL) && (directory != NULL))
924 ctxt->directory = directory; 925 ctxt->directory = directory;
925 ctxt->valid = 0; 926 ctxt->valid = 0;
926 ctxt->validate = 0; 927 ctxt->validate = 0;
927 ctxt->loadsubset = 0; 928 ctxt->loadsubset = 0;
928 ctxt->pedantic = 0; 929 ctxt->pedantic = 0;
929 ctxt->dictNames = 1; 930 ctxt->dictNames = 1;
930 931
931 xmlParseDocument(ctxt); 932 xmlParseDocument(ctxt);
932 933
933 if (ctxt->wellFormed) 934 if (ctxt->wellFormed)
934 ret = ctxt->myDoc; 935 ret = ctxt->myDoc;
935 else { 936 else {
936 ret = NULL; 937 ret = NULL;
937 xmlFreeDoc(ctxt->myDoc); 938 xmlFreeDoc(ctxt->myDoc);
938 ctxt->myDoc = NULL; 939 ctxt->myDoc = NULL;
939 } 940 }
940 xmlFreeParserCtxt(ctxt); 941 xmlFreeParserCtxt(ctxt);
941 942
942 return(ret); 943 return(ret);
943 } 944 }
944 945
945 /** 946 /**
946 * xmlLoadFileContent: 947 * xmlLoadFileContent:
947 * @filename: a file path 948 * @filename: a file path
948 * 949 *
949 * Load a file content into memory. 950 * Load a file content into memory.
950 * 951 *
951 * Returns a pointer to the 0 terminated string or NULL in case of error 952 * Returns a pointer to the 0 terminated string or NULL in case of error
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
983 return (NULL); 984 return (NULL);
984 } 985 }
985 #ifdef HAVE_STAT 986 #ifdef HAVE_STAT
986 size = info.st_size; 987 size = info.st_size;
987 #else 988 #else
988 if (fseek(fd, 0, SEEK_END) || (size = ftell(fd)) == EOF || fseek(fd, 0, SEEK _SET)) { /* File operations denied? ok, just close and return failure */ 989 if (fseek(fd, 0, SEEK_END) || (size = ftell(fd)) == EOF || fseek(fd, 0, SEEK _SET)) { /* File operations denied? ok, just close and return failure */
989 fclose(fd); 990 fclose(fd);
990 return (NULL); 991 return (NULL);
991 } 992 }
992 #endif 993 #endif
993 content = xmlMallocAtomic(size + 10); 994 content = (xmlChar*)xmlMallocAtomic(size + 10);
994 if (content == NULL) { 995 if (content == NULL) {
995 xmlCatalogErrMemory("allocating catalog data"); 996 xmlCatalogErrMemory("allocating catalog data");
997 #ifdef HAVE_STAT
998 close(fd);
999 #else
1000 fclose(fd);
1001 #endif
996 return (NULL); 1002 return (NULL);
997 } 1003 }
998 #ifdef HAVE_STAT 1004 #ifdef HAVE_STAT
999 len = read(fd, content, size); 1005 len = read(fd, content, size);
1006 close(fd);
1000 #else 1007 #else
1001 len = fread(content, 1, size, fd); 1008 len = fread(content, 1, size, fd);
1009 fclose(fd);
1002 #endif 1010 #endif
1003 if (len < 0) { 1011 if (len < 0) {
1004 xmlFree(content); 1012 xmlFree(content);
1005 return (NULL); 1013 return (NULL);
1006 } 1014 }
1007 #ifdef HAVE_STAT
1008 close(fd);
1009 #else
1010 fclose(fd);
1011 #endif
1012 content[len] = 0; 1015 content[len] = 0;
1013 1016
1014 return(content); 1017 return(content);
1015 } 1018 }
1016 1019
1017 /** 1020 /**
1018 * xmlCatalogNormalizePublic: 1021 * xmlCatalogNormalizePublic:
1019 * @pubID: the public ID string 1022 * @pubID: the public ID string
1020 * 1023 *
1021 * Normalizes the Public Identifier 1024 * Normalizes the Public Identifier
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
1324 /* TODO: sort the list according to REWRITE lengths and prefer value */ 1327 /* TODO: sort the list according to REWRITE lengths and prefer value */
1325 } 1328 }
1326 1329
1327 /** 1330 /**
1328 * xmlParseXMLCatalogFile: 1331 * xmlParseXMLCatalogFile:
1329 * @prefer: the PUBLIC vs. SYSTEM current preference value 1332 * @prefer: the PUBLIC vs. SYSTEM current preference value
1330 * @filename: the filename for the catalog 1333 * @filename: the filename for the catalog
1331 * 1334 *
1332 * Parses the catalog file to extract the XML tree and then analyze the 1335 * Parses the catalog file to extract the XML tree and then analyze the
1333 * tree to build a list of Catalog entries corresponding to this catalog 1336 * tree to build a list of Catalog entries corresponding to this catalog
1334 * 1337 *
1335 * Returns the resulting Catalog entries list 1338 * Returns the resulting Catalog entries list
1336 */ 1339 */
1337 static xmlCatalogEntryPtr 1340 static xmlCatalogEntryPtr
1338 xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename) { 1341 xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename) {
1339 xmlDocPtr doc; 1342 xmlDocPtr doc;
1340 xmlNodePtr cur; 1343 xmlNodePtr cur;
1341 xmlChar *prop; 1344 xmlChar *prop;
1342 xmlCatalogEntryPtr parent = NULL; 1345 xmlCatalogEntryPtr parent = NULL;
1343 1346
1344 if (filename == NULL) 1347 if (filename == NULL)
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1392 } 1395 }
1393 xmlFreeDoc(doc); 1396 xmlFreeDoc(doc);
1394 return(parent); 1397 return(parent);
1395 } 1398 }
1396 1399
1397 /** 1400 /**
1398 * xmlFetchXMLCatalogFile: 1401 * xmlFetchXMLCatalogFile:
1399 * @catal: an existing but incomplete catalog entry 1402 * @catal: an existing but incomplete catalog entry
1400 * 1403 *
1401 * Fetch and parse the subcatalog referenced by an entry 1404 * Fetch and parse the subcatalog referenced by an entry
1402 * 1405 *
1403 * Returns 0 in case of success, -1 otherwise 1406 * Returns 0 in case of success, -1 otherwise
1404 */ 1407 */
1405 static int 1408 static int
1406 xmlFetchXMLCatalogFile(xmlCatalogEntryPtr catal) { 1409 xmlFetchXMLCatalogFile(xmlCatalogEntryPtr catal) {
1407 xmlCatalogEntryPtr doc; 1410 xmlCatalogEntryPtr doc;
1408 1411
1409 if (catal == NULL) 1412 if (catal == NULL)
1410 return(-1); 1413 return(-1);
1411 if (catal->URL == NULL) 1414 if (catal->URL == NULL)
1412 return(-1); 1415 return(-1);
1413 if (catal->children != NULL)
1414 return(-1);
1415 1416
1416 /* 1417 /*
1417 * lock the whole catalog for modification 1418 * lock the whole catalog for modification
1418 */ 1419 */
1419 xmlRMutexLock(xmlCatalogMutex); 1420 xmlRMutexLock(xmlCatalogMutex);
1420 if (catal->children != NULL) { 1421 if (catal->children != NULL) {
1421 /* Okay someone else did it in the meantime */ 1422 /* Okay someone else did it in the meantime */
1422 xmlRMutexUnlock(xmlCatalogMutex); 1423 xmlRMutexUnlock(xmlCatalogMutex);
1423 return(0); 1424 return(0);
1424 } 1425 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1493 * 1494 *
1494 * Returns 0 if successful, -1 otherwise 1495 * Returns 0 if successful, -1 otherwise
1495 */ 1496 */
1496 static int 1497 static int
1497 xmlAddXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *type, 1498 xmlAddXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *type,
1498 const xmlChar *orig, const xmlChar *replace) { 1499 const xmlChar *orig, const xmlChar *replace) {
1499 xmlCatalogEntryPtr cur; 1500 xmlCatalogEntryPtr cur;
1500 xmlCatalogEntryType typ; 1501 xmlCatalogEntryType typ;
1501 int doregister = 0; 1502 int doregister = 0;
1502 1503
1503 if ((catal == NULL) || 1504 if ((catal == NULL) ||
1504 ((catal->type != XML_CATA_CATALOG) && 1505 ((catal->type != XML_CATA_CATALOG) &&
1505 (catal->type != XML_CATA_BROKEN_CATALOG))) 1506 (catal->type != XML_CATA_BROKEN_CATALOG)))
1506 return(-1); 1507 return(-1);
1507 if (catal->children == NULL) { 1508 if (catal->children == NULL) {
1508 xmlFetchXMLCatalogFile(catal); 1509 xmlFetchXMLCatalogFile(catal);
1509 } 1510 }
1510 if (catal->children == NULL) 1511 if (catal->children == NULL)
1511 doregister = 1; 1512 doregister = 1;
1512 1513
1513 typ = xmlGetXMLCatalogEntryType(type); 1514 typ = xmlGetXMLCatalogEntryType(type);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1546 xmlGenericError(xmlGenericErrorContext, 1547 xmlGenericError(xmlGenericErrorContext,
1547 "Adding element %s to catalog\n", type); 1548 "Adding element %s to catalog\n", type);
1548 if (cur == NULL) 1549 if (cur == NULL)
1549 catal->children = xmlNewCatalogEntry(typ, orig, replace, 1550 catal->children = xmlNewCatalogEntry(typ, orig, replace,
1550 NULL, catal->prefer, NULL); 1551 NULL, catal->prefer, NULL);
1551 else 1552 else
1552 cur->next = xmlNewCatalogEntry(typ, orig, replace, 1553 cur->next = xmlNewCatalogEntry(typ, orig, replace,
1553 NULL, catal->prefer, NULL); 1554 NULL, catal->prefer, NULL);
1554 if (doregister) { 1555 if (doregister) {
1555 catal->type = XML_CATA_CATALOG; 1556 catal->type = XML_CATA_CATALOG;
1556 » cur = xmlHashLookup(xmlCatalogXMLFiles, catal->URL); 1557 » cur = (xmlCatalogEntryPtr)xmlHashLookup(xmlCatalogXMLFiles, catal->URL);
1557 if (cur != NULL) 1558 if (cur != NULL)
1558 cur->children = catal->children; 1559 cur->children = catal->children;
1559 } 1560 }
1560 1561
1561 return(0); 1562 return(0);
1562 } 1563 }
1563 1564
1564 /** 1565 /**
1565 * xmlDelXMLCatalog: 1566 * xmlDelXMLCatalog:
1566 * @catal: top of an XML catalog 1567 * @catal: top of an XML catalog
1567 * @value: the value to remove from the catalog 1568 * @value: the value to remove from the catalog
1568 * 1569 *
1569 * Remove entries in the XML catalog where the value or the URI 1570 * Remove entries in the XML catalog where the value or the URI
1570 * is equal to @value 1571 * is equal to @value
1571 * 1572 *
1572 * Returns the number of entries removed if successful, -1 otherwise 1573 * Returns the number of entries removed if successful, -1 otherwise
1573 */ 1574 */
1574 static int 1575 static int
1575 xmlDelXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *value) { 1576 xmlDelXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *value) {
1576 xmlCatalogEntryPtr cur; 1577 xmlCatalogEntryPtr cur;
1577 int ret = 0; 1578 int ret = 0;
1578 1579
1579 if ((catal == NULL) || 1580 if ((catal == NULL) ||
1580 ((catal->type != XML_CATA_CATALOG) && 1581 ((catal->type != XML_CATA_CATALOG) &&
1581 (catal->type != XML_CATA_BROKEN_CATALOG))) 1582 (catal->type != XML_CATA_BROKEN_CATALOG)))
1582 return(-1); 1583 return(-1);
1583 if (value == NULL) 1584 if (value == NULL)
1584 return(-1); 1585 return(-1);
1585 if (catal->children == NULL) { 1586 if (catal->children == NULL) {
1586 xmlFetchXMLCatalogFile(catal); 1587 xmlFetchXMLCatalogFile(catal);
1587 } 1588 }
1588 1589
1589 /* 1590 /*
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
1784 1785
1785 for (i = 0;i < nbList;i++) 1786 for (i = 0;i < nbList;i++)
1786 if (xmlStrEqual(cur->URL, delegates[i])) 1787 if (xmlStrEqual(cur->URL, delegates[i]))
1787 break; 1788 break;
1788 if (i < nbList) { 1789 if (i < nbList) {
1789 cur = cur->next; 1790 cur = cur->next;
1790 continue; 1791 continue;
1791 } 1792 }
1792 if (nbList < MAX_DELEGATE) 1793 if (nbList < MAX_DELEGATE)
1793 delegates[nbList++] = cur->URL; 1794 delegates[nbList++] = cur->URL;
1794 » » » 1795
1795 if (cur->children == NULL) { 1796 if (cur->children == NULL) {
1796 xmlFetchXMLCatalogFile(cur); 1797 xmlFetchXMLCatalogFile(cur);
1797 } 1798 }
1798 if (cur->children != NULL) { 1799 if (cur->children != NULL) {
1799 if (xmlDebugCatalogs) 1800 if (xmlDebugCatalogs)
1800 xmlGenericError(xmlGenericErrorContext, 1801 xmlGenericError(xmlGenericErrorContext,
1801 "Trying public delegate %s\n", cur->URL); 1802 "Trying public delegate %s\n", cur->URL);
1802 ret = xmlCatalogListXMLResolve( 1803 ret = xmlCatalogListXMLResolve(
1803 cur->children, pubID, NULL); 1804 cur->children, pubID, NULL);
1804 if (ret != NULL) { 1805 if (ret != NULL) {
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
1997 * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html 1998 * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
1998 * 1999 *
1999 * Returns the URI of the resource or NULL if not found 2000 * Returns the URI of the resource or NULL if not found
2000 */ 2001 */
2001 static xmlChar * 2002 static xmlChar *
2002 xmlCatalogListXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID, 2003 xmlCatalogListXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
2003 const xmlChar *sysID) { 2004 const xmlChar *sysID) {
2004 xmlChar *ret = NULL; 2005 xmlChar *ret = NULL;
2005 xmlChar *urnID = NULL; 2006 xmlChar *urnID = NULL;
2006 xmlChar *normid; 2007 xmlChar *normid;
2007 2008
2008 if (catal == NULL) 2009 if (catal == NULL)
2009 return(NULL); 2010 return(NULL);
2010 if ((pubID == NULL) && (sysID == NULL)) 2011 if ((pubID == NULL) && (sysID == NULL))
2011 return(NULL); 2012 return(NULL);
2012 2013
2013 normid = xmlCatalogNormalizePublic(pubID); 2014 normid = xmlCatalogNormalizePublic(pubID);
2014 if (normid != NULL) 2015 if (normid != NULL)
2015 pubID = (*normid != 0 ? normid : NULL); 2016 pubID = (*normid != 0 ? normid : NULL);
2016 2017
2017 if (!xmlStrncmp(pubID, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) { 2018 if (!xmlStrncmp(pubID, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) {
2018 urnID = xmlCatalogUnWrapURN(pubID); 2019 urnID = xmlCatalogUnWrapURN(pubID);
2019 if (xmlDebugCatalogs) { 2020 if (xmlDebugCatalogs) {
2020 if (urnID == NULL) 2021 if (urnID == NULL)
2021 xmlGenericError(xmlGenericErrorContext, 2022 xmlGenericError(xmlGenericErrorContext,
2022 "Public URN ID %s expanded to NULL\n", pubID); 2023 "Public URN ID %s expanded to NULL\n", pubID);
2023 else 2024 else
2024 xmlGenericError(xmlGenericErrorContext, 2025 xmlGenericError(xmlGenericErrorContext,
2025 "Public URN ID expanded to %s\n", urnID); 2026 "Public URN ID expanded to %s\n", urnID);
2026 } 2027 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
2086 * 2087 *
2087 * Implements (or tries to) 7.2. URI Resolution 2088 * Implements (or tries to) 7.2. URI Resolution
2088 * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html 2089 * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
2089 * 2090 *
2090 * Returns the URI of the resource or NULL if not found 2091 * Returns the URI of the resource or NULL if not found
2091 */ 2092 */
2092 static xmlChar * 2093 static xmlChar *
2093 xmlCatalogListXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) { 2094 xmlCatalogListXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) {
2094 xmlChar *ret = NULL; 2095 xmlChar *ret = NULL;
2095 xmlChar *urnID = NULL; 2096 xmlChar *urnID = NULL;
2096 2097
2097 if (catal == NULL) 2098 if (catal == NULL)
2098 return(NULL); 2099 return(NULL);
2099 if (URI == NULL) 2100 if (URI == NULL)
2100 return(NULL); 2101 return(NULL);
2101 2102
2102 if (!xmlStrncmp(URI, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) { 2103 if (!xmlStrncmp(URI, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) {
2103 urnID = xmlCatalogUnWrapURN(URI); 2104 urnID = xmlCatalogUnWrapURN(URI);
2104 if (xmlDebugCatalogs) { 2105 if (xmlDebugCatalogs) {
2105 if (urnID == NULL) 2106 if (urnID == NULL)
2106 xmlGenericError(xmlGenericErrorContext, 2107 xmlGenericError(xmlGenericErrorContext,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2146 /** 2147 /**
2147 * xmlParseSGMLCatalogComment: 2148 * xmlParseSGMLCatalogComment:
2148 * @cur: the current character 2149 * @cur: the current character
2149 * 2150 *
2150 * Skip a comment in an SGML catalog 2151 * Skip a comment in an SGML catalog
2151 * 2152 *
2152 * Returns new current character 2153 * Returns new current character
2153 */ 2154 */
2154 static const xmlChar * 2155 static const xmlChar *
2155 xmlParseSGMLCatalogComment(const xmlChar *cur) { 2156 xmlParseSGMLCatalogComment(const xmlChar *cur) {
2156 if ((cur[0] != '-') || (cur[1] != '-')) 2157 if ((cur[0] != '-') || (cur[1] != '-'))
2157 return(cur); 2158 return(cur);
2158 SKIP(2); 2159 SKIP(2);
2159 while ((cur[0] != 0) && ((cur[0] != '-') || ((cur[1] != '-')))) 2160 while ((cur[0] != 0) && ((cur[0] != '-') || ((cur[1] != '-'))))
2160 NEXT; 2161 NEXT;
2161 if (cur[0] == 0) { 2162 if (cur[0] == 0) {
2162 return(NULL); 2163 return(NULL);
2163 } 2164 }
2164 return(cur + 2); 2165 return(cur + 2);
2165 } 2166 }
2166 2167
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after
2681 xmlChar *first; 2682 xmlChar *first;
2682 xmlCatalogPtr catal; 2683 xmlCatalogPtr catal;
2683 int ret; 2684 int ret;
2684 2685
2685 content = xmlLoadFileContent(filename); 2686 content = xmlLoadFileContent(filename);
2686 if (content == NULL) 2687 if (content == NULL)
2687 return(NULL); 2688 return(NULL);
2688 2689
2689 2690
2690 first = content; 2691 first = content;
2691 2692
2692 while ((*first != 0) && (*first != '-') && (*first != '<') && 2693 while ((*first != 0) && (*first != '-') && (*first != '<') &&
2693 (!(((*first >= 'A') && (*first <= 'Z')) || 2694 (!(((*first >= 'A') && (*first <= 'Z')) ||
2694 ((*first >= 'a') && (*first <= 'z'))))) 2695 ((*first >= 'a') && (*first <= 'z')))))
2695 first++; 2696 first++;
2696 2697
2697 if (*first != '<') { 2698 if (*first != '<') {
2698 catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, xmlCatalogDefaultPref er); 2699 catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, xmlCatalogDefaultPref er);
2699 if (catal == NULL) { 2700 if (catal == NULL) {
2700 xmlFree(content); 2701 xmlFree(content);
2701 return(NULL); 2702 return(NULL);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
2776 * 2777 *
2777 * Returns the resource if found or NULL otherwise, the value returned 2778 * Returns the resource if found or NULL otherwise, the value returned
2778 * must be freed by the caller. 2779 * must be freed by the caller.
2779 */ 2780 */
2780 xmlChar * 2781 xmlChar *
2781 xmlACatalogResolveSystem(xmlCatalogPtr catal, const xmlChar *sysID) { 2782 xmlACatalogResolveSystem(xmlCatalogPtr catal, const xmlChar *sysID) {
2782 xmlChar *ret = NULL; 2783 xmlChar *ret = NULL;
2783 2784
2784 if ((sysID == NULL) || (catal == NULL)) 2785 if ((sysID == NULL) || (catal == NULL))
2785 return(NULL); 2786 return(NULL);
2786 2787
2787 if (xmlDebugCatalogs) 2788 if (xmlDebugCatalogs)
2788 xmlGenericError(xmlGenericErrorContext, 2789 xmlGenericError(xmlGenericErrorContext,
2789 "Resolve sysID %s\n", sysID); 2790 "Resolve sysID %s\n", sysID);
2790 2791
2791 if (catal->type == XML_XML_CATALOG_TYPE) { 2792 if (catal->type == XML_XML_CATALOG_TYPE) {
2792 ret = xmlCatalogListXMLResolve(catal->xml, NULL, sysID); 2793 ret = xmlCatalogListXMLResolve(catal->xml, NULL, sysID);
2793 if (ret == XML_CATAL_BREAK) 2794 if (ret == XML_CATAL_BREAK)
2794 ret = NULL; 2795 ret = NULL;
2795 } else { 2796 } else {
2796 const xmlChar *sgml; 2797 const xmlChar *sgml;
(...skipping 14 matching lines...) Expand all
2811 * 2812 *
2812 * Returns the local resource if found or NULL otherwise, the value returned 2813 * Returns the local resource if found or NULL otherwise, the value returned
2813 * must be freed by the caller. 2814 * must be freed by the caller.
2814 */ 2815 */
2815 xmlChar * 2816 xmlChar *
2816 xmlACatalogResolvePublic(xmlCatalogPtr catal, const xmlChar *pubID) { 2817 xmlACatalogResolvePublic(xmlCatalogPtr catal, const xmlChar *pubID) {
2817 xmlChar *ret = NULL; 2818 xmlChar *ret = NULL;
2818 2819
2819 if ((pubID == NULL) || (catal == NULL)) 2820 if ((pubID == NULL) || (catal == NULL))
2820 return(NULL); 2821 return(NULL);
2821 2822
2822 if (xmlDebugCatalogs) 2823 if (xmlDebugCatalogs)
2823 xmlGenericError(xmlGenericErrorContext, 2824 xmlGenericError(xmlGenericErrorContext,
2824 "Resolve pubID %s\n", pubID); 2825 "Resolve pubID %s\n", pubID);
2825 2826
2826 if (catal->type == XML_XML_CATALOG_TYPE) { 2827 if (catal->type == XML_XML_CATALOG_TYPE) {
2827 ret = xmlCatalogListXMLResolve(catal->xml, pubID, NULL); 2828 ret = xmlCatalogListXMLResolve(catal->xml, pubID, NULL);
2828 if (ret == XML_CATAL_BREAK) 2829 if (ret == XML_CATAL_BREAK)
2829 ret = NULL; 2830 ret = NULL;
2830 } else { 2831 } else {
2831 const xmlChar *sgml; 2832 const xmlChar *sgml;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
2930 void 2931 void
2931 xmlACatalogDump(xmlCatalogPtr catal, FILE *out) { 2932 xmlACatalogDump(xmlCatalogPtr catal, FILE *out) {
2932 if ((out == NULL) || (catal == NULL)) 2933 if ((out == NULL) || (catal == NULL))
2933 return; 2934 return;
2934 2935
2935 if (catal->type == XML_XML_CATALOG_TYPE) { 2936 if (catal->type == XML_XML_CATALOG_TYPE) {
2936 xmlDumpXMLCatalog(out, catal->xml); 2937 xmlDumpXMLCatalog(out, catal->xml);
2937 } else { 2938 } else {
2938 xmlHashScan(catal->sgml, 2939 xmlHashScan(catal->sgml,
2939 (xmlHashScanner) xmlCatalogDumpEntry, out); 2940 (xmlHashScanner) xmlCatalogDumpEntry, out);
2940 } 2941 }
2941 } 2942 }
2942 #endif /* LIBXML_OUTPUT_ENABLED */ 2943 #endif /* LIBXML_OUTPUT_ENABLED */
2943 2944
2944 /** 2945 /**
2945 * xmlACatalogAdd: 2946 * xmlACatalogAdd:
2946 * @catal: a Catalog 2947 * @catal: a Catalog
2947 * @type: the type of record to add to the catalog 2948 * @type: the type of record to add to the catalog
2948 * @orig: the system, public or prefix to match 2949 * @orig: the system, public or prefix to match
2949 * @replace: the replacement value for the match 2950 * @replace: the replacement value for the match
2950 * 2951 *
2951 * Add an entry in the catalog, it may overwrite existing but 2952 * Add an entry in the catalog, it may overwrite existing but
2952 * different entries. 2953 * different entries.
2953 * 2954 *
2954 * Returns 0 if successful, -1 otherwise 2955 * Returns 0 if successful, -1 otherwise
2955 */ 2956 */
2956 int 2957 int
2957 xmlACatalogAdd(xmlCatalogPtr catal, const xmlChar * type, 2958 xmlACatalogAdd(xmlCatalogPtr catal, const xmlChar * type,
2958 const xmlChar * orig, const xmlChar * replace) 2959 const xmlChar * orig, const xmlChar * replace)
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2997 if ((catal == NULL) || (value == NULL)) 2998 if ((catal == NULL) || (value == NULL))
2998 return(-1); 2999 return(-1);
2999 3000
3000 if (catal->type == XML_XML_CATALOG_TYPE) { 3001 if (catal->type == XML_XML_CATALOG_TYPE) {
3001 res = xmlDelXMLCatalog(catal->xml, value); 3002 res = xmlDelXMLCatalog(catal->xml, value);
3002 } else { 3003 } else {
3003 res = xmlHashRemoveEntry(catal->sgml, value, 3004 res = xmlHashRemoveEntry(catal->sgml, value,
3004 (xmlHashDeallocator) xmlFreeCatalogEntry); 3005 (xmlHashDeallocator) xmlFreeCatalogEntry);
3005 if (res == 0) 3006 if (res == 0)
3006 res = 1; 3007 res = 1;
3007 } 3008 }
3008 return(res); 3009 return(res);
3009 } 3010 }
3010 3011
3011 /** 3012 /**
3012 * xmlNewCatalog: 3013 * xmlNewCatalog:
3013 * @sgml: should this create an SGML catalog 3014 * @sgml: should this create an SGML catalog
3014 * 3015 *
3015 * create a new Catalog. 3016 * create a new Catalog.
3016 * 3017 *
3017 * Returns the xmlCatalogPtr or NULL in case of error 3018 * Returns the xmlCatalogPtr or NULL in case of error
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
3056 } else { 3057 } else {
3057 int res; 3058 int res;
3058 3059
3059 if (catal->sgml == NULL) 3060 if (catal->sgml == NULL)
3060 return(1); 3061 return(1);
3061 res = xmlHashSize(catal->sgml); 3062 res = xmlHashSize(catal->sgml);
3062 if (res == 0) 3063 if (res == 0)
3063 return(1); 3064 return(1);
3064 if (res < 0) 3065 if (res < 0)
3065 return(-1); 3066 return(-1);
3066 } 3067 }
3067 return(0); 3068 return(0);
3068 } 3069 }
3069 3070
3070 /************************************************************************ 3071 /************************************************************************
3071 * * 3072 * *
3072 * Public interfaces manipulating the global shared default catalog * 3073 * Public interfaces manipulating the global shared default catalog *
3073 * * 3074 * *
3074 ************************************************************************/ 3075 ************************************************************************/
3075 3076
3076 /** 3077 /**
3077 * xmlInitializeCatalogData: 3078 * xmlInitializeCatalogData:
3078 * 3079 *
3079 * Do the catalog initialization only of global data, doesn't try to load 3080 * Do the catalog initialization only of global data, doesn't try to load
3080 * any catalog actually. 3081 * any catalog actually.
3081 * this function is not thread safe, catalog initialization should 3082 * this function is not thread safe, catalog initialization should
3082 * preferably be done once at startup 3083 * preferably be done once at startup
3083 */ 3084 */
3084 static void 3085 static void
3085 xmlInitializeCatalogData(void) { 3086 xmlInitializeCatalogData(void) {
3086 if (xmlCatalogInitialized != 0) 3087 if (xmlCatalogInitialized != 0)
3087 return; 3088 return;
3088 3089
3089 if (getenv("XML_DEBUG_CATALOG")) 3090 if (getenv("XML_DEBUG_CATALOG"))
3090 xmlDebugCatalogs = 1; 3091 xmlDebugCatalogs = 1;
3091 xmlCatalogMutex = xmlNewRMutex(); 3092 xmlCatalogMutex = xmlNewRMutex();
3092 3093
3093 xmlCatalogInitialized = 1; 3094 xmlCatalogInitialized = 1;
3094 } 3095 }
3095 /** 3096 /**
3096 * xmlInitializeCatalog: 3097 * xmlInitializeCatalog:
3097 * 3098 *
3098 * Do the catalog initialization. 3099 * Do the catalog initialization.
3099 * this function is not thread safe, catalog initialization should 3100 * this function is not thread safe, catalog initialization should
3100 * preferably be done once at startup 3101 * preferably be done once at startup
3101 */ 3102 */
3102 void 3103 void
3103 xmlInitializeCatalog(void) { 3104 xmlInitializeCatalog(void) {
3104 if (xmlCatalogInitialized != 0) 3105 if (xmlCatalogInitialized != 0)
3105 return; 3106 return;
3106 3107
3107 xmlInitializeCatalogData(); 3108 xmlInitializeCatalogData();
3108 xmlRMutexLock(xmlCatalogMutex); 3109 xmlRMutexLock(xmlCatalogMutex);
3109 3110
3110 if (getenv("XML_DEBUG_CATALOG")) 3111 if (getenv("XML_DEBUG_CATALOG"))
3111 xmlDebugCatalogs = 1; 3112 xmlDebugCatalogs = 1;
3112 3113
3113 if (xmlDefaultCatalog == NULL) { 3114 if (xmlDefaultCatalog == NULL) {
3114 const char *catalogs; 3115 const char *catalogs;
3115 char *path; 3116 char *path;
3116 const char *cur, *paths; 3117 const char *cur, *paths;
3117 xmlCatalogPtr catal; 3118 xmlCatalogPtr catal;
3118 xmlCatalogEntryPtr *nextent; 3119 xmlCatalogEntryPtr *nextent;
3119 3120
3120 catalogs = (const char *) getenv("XML_CATALOG_FILES"); 3121 catalogs = (const char *) getenv("XML_CATALOG_FILES");
3121 if (catalogs == NULL) 3122 if (catalogs == NULL)
3122 #if defined(_WIN32) && defined(_MSC_VER) 3123 #if defined(_WIN32) && defined(_MSC_VER)
3123 { 3124 {
3124 void* hmodule; 3125 void* hmodule;
3125 hmodule = GetModuleHandleA("libxml2.dll"); 3126 hmodule = GetModuleHandleA("libxml2.dll");
3126 if (hmodule == NULL) 3127 if (hmodule == NULL)
3127 hmodule = GetModuleHandleA(NULL); 3128 hmodule = GetModuleHandleA(NULL);
3128 if (hmodule != NULL) { 3129 if (hmodule != NULL) {
3129 char buf[256]; 3130 char buf[256];
3130 unsigned long len = GetModuleFileNameA(hmodule, buf, 255 ); 3131 unsigned long len = GetModuleFileNameA(hmodule, buf, 255 );
3131 if (len != 0) { 3132 if (len != 0) {
3132 char* p = &(buf[len]); 3133 char* p = &(buf[len]);
3133 » » » » while (*p != '\\' && p > buf) 3134 » » » » while (*p != '\\' && p > buf)
3134 p--; 3135 p--;
3135 if (p != buf) { 3136 if (p != buf) {
3136 xmlChar* uri; 3137 xmlChar* uri;
3137 strncpy(p, "\\..\\etc\\catalog", 255 - ( p - buf)); 3138 strncpy(p, "\\..\\etc\\catalog", 255 - ( p - buf));
3138 » » » » » uri = xmlCanonicPath(buf); 3139 » » » » » uri = xmlCanonicPath((const xmlChar*)buf );
3139 if (uri != NULL) { 3140 if (uri != NULL) {
3140 strncpy(XML_XML_DEFAULT_CATALOG, uri, 255); 3141 strncpy(XML_XML_DEFAULT_CATALOG, uri, 255);
3141 xmlFree(uri); 3142 xmlFree(uri);
3142 } 3143 }
3143 } 3144 }
3144 } 3145 }
3145 } 3146 }
3146 catalogs = XML_XML_DEFAULT_CATALOG; 3147 catalogs = XML_XML_DEFAULT_CATALOG;
3147 } 3148 }
3148 #else 3149 #else
3149 catalogs = XML_XML_DEFAULT_CATALOG; 3150 catalogs = XML_XML_DEFAULT_CATALOG;
3150 #endif 3151 #endif
3151 3152
3152 » catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, 3153 » catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE,
3153 xmlCatalogDefaultPrefer); 3154 xmlCatalogDefaultPrefer);
3154 if (catal != NULL) { 3155 if (catal != NULL) {
3155 » /* the XML_CATALOG_FILES envvar is allowed to contain a 3156 » /* the XML_CATALOG_FILES envvar is allowed to contain a
3156 space-separated list of entries. */ 3157 space-separated list of entries. */
3157 cur = catalogs; 3158 cur = catalogs;
3158 nextent = &catal->xml; 3159 nextent = &catal->xml;
3159 while (*cur != '\0') { 3160 while (*cur != '\0') {
3160 » » while (xmlIsBlank_ch(*cur)) 3161 » » while (xmlIsBlank_ch(*cur))
3161 cur++; 3162 cur++;
3162 if (*cur != 0) { 3163 if (*cur != 0) {
3163 paths = cur; 3164 paths = cur;
3164 while ((*cur != 0) && (!xmlIsBlank_ch(*cur))) 3165 while ((*cur != 0) && (!xmlIsBlank_ch(*cur)))
3165 cur++; 3166 cur++;
3166 path = (char *) xmlStrndup((const xmlChar *)paths, cur - pat hs); 3167 path = (char *) xmlStrndup((const xmlChar *)paths, cur - pat hs);
3167 if (path != NULL) { 3168 if (path != NULL) {
3168 *nextent = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, 3169 *nextent = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
3169 NULL, BAD_CAST path, xmlCatalogDefaultPrefer, NU LL); 3170 NULL, BAD_CAST path, xmlCatalogDefaultPrefer, NU LL);
3170 if (*nextent != NULL) 3171 if (*nextent != NULL)
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
3243 3244
3244 cur = pathss; 3245 cur = pathss;
3245 while (*cur != 0) { 3246 while (*cur != 0) {
3246 while (xmlIsBlank_ch(*cur)) cur++; 3247 while (xmlIsBlank_ch(*cur)) cur++;
3247 if (*cur != 0) { 3248 if (*cur != 0) {
3248 paths = cur; 3249 paths = cur;
3249 while ((*cur != 0) && (*cur != PATH_SEAPARATOR) && (!xmlIsBlank_ch(* cur))) 3250 while ((*cur != 0) && (*cur != PATH_SEAPARATOR) && (!xmlIsBlank_ch(* cur)))
3250 cur++; 3251 cur++;
3251 path = xmlStrndup((const xmlChar *)paths, cur - paths); 3252 path = xmlStrndup((const xmlChar *)paths, cur - paths);
3252 #ifdef _WIN32 3253 #ifdef _WIN32
3253 iLen = strlen(path); 3254 iLen = strlen((const char*)path);
3254 for(i = 0; i < iLen; i++) { 3255 for(i = 0; i < iLen; i++) {
3255 if(path[i] == '\\') { 3256 if(path[i] == '\\') {
3256 path[i] = '/'; 3257 path[i] = '/';
3257 } 3258 }
3258 } 3259 }
3259 #endif 3260 #endif
3260 if (path != NULL) { 3261 if (path != NULL) {
3261 xmlLoadCatalog((const char *) path); 3262 xmlLoadCatalog((const char *) path);
3262 xmlFree(path); 3263 xmlFree(path);
3263 } 3264 }
(...skipping 11 matching lines...) Expand all
3275 void 3276 void
3276 xmlCatalogCleanup(void) { 3277 xmlCatalogCleanup(void) {
3277 if (xmlCatalogInitialized == 0) 3278 if (xmlCatalogInitialized == 0)
3278 return; 3279 return;
3279 3280
3280 xmlRMutexLock(xmlCatalogMutex); 3281 xmlRMutexLock(xmlCatalogMutex);
3281 if (xmlDebugCatalogs) 3282 if (xmlDebugCatalogs)
3282 xmlGenericError(xmlGenericErrorContext, 3283 xmlGenericError(xmlGenericErrorContext,
3283 "Catalogs cleanup\n"); 3284 "Catalogs cleanup\n");
3284 if (xmlCatalogXMLFiles != NULL) 3285 if (xmlCatalogXMLFiles != NULL)
3285 » xmlHashFree(xmlCatalogXMLFiles, 3286 » xmlHashFree(xmlCatalogXMLFiles,
3286 (xmlHashDeallocator)xmlFreeCatalogHashEntryList); 3287 (xmlHashDeallocator)xmlFreeCatalogHashEntryList);
3287 xmlCatalogXMLFiles = NULL; 3288 xmlCatalogXMLFiles = NULL;
3288 if (xmlDefaultCatalog != NULL) 3289 if (xmlDefaultCatalog != NULL)
3289 xmlFreeCatalog(xmlDefaultCatalog); 3290 xmlFreeCatalog(xmlDefaultCatalog);
3290 xmlDefaultCatalog = NULL; 3291 xmlDefaultCatalog = NULL;
3291 xmlDebugCatalogs = 0; 3292 xmlDebugCatalogs = 0;
3292 xmlCatalogInitialized = 0; 3293 xmlCatalogInitialized = 0;
3293 xmlRMutexUnlock(xmlCatalogMutex); 3294 xmlRMutexUnlock(xmlCatalogMutex);
3294 xmlFreeRMutex(xmlCatalogMutex); 3295 xmlFreeRMutex(xmlCatalogMutex);
3295 } 3296 }
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
3390 if (!xmlCatalogInitialized) 3391 if (!xmlCatalogInitialized)
3391 xmlInitializeCatalog(); 3392 xmlInitializeCatalog();
3392 3393
3393 xmlACatalogDump(xmlDefaultCatalog, out); 3394 xmlACatalogDump(xmlDefaultCatalog, out);
3394 } 3395 }
3395 #endif /* LIBXML_OUTPUT_ENABLED */ 3396 #endif /* LIBXML_OUTPUT_ENABLED */
3396 3397
3397 /** 3398 /**
3398 * xmlCatalogAdd: 3399 * xmlCatalogAdd:
3399 * @type: the type of record to add to the catalog 3400 * @type: the type of record to add to the catalog
3400 * @orig: the system, public or prefix to match 3401 * @orig: the system, public or prefix to match
3401 * @replace: the replacement value for the match 3402 * @replace: the replacement value for the match
3402 * 3403 *
3403 * Add an entry in the catalog, it may overwrite existing but 3404 * Add an entry in the catalog, it may overwrite existing but
3404 * different entries. 3405 * different entries.
3405 * If called before any other catalog routine, allows to override the 3406 * If called before any other catalog routine, allows to override the
3406 * default shared catalog put in place by xmlInitializeCatalog(); 3407 * default shared catalog put in place by xmlInitializeCatalog();
3407 * 3408 *
3408 * Returns 0 if successful, -1 otherwise 3409 * Returns 0 if successful, -1 otherwise
3409 */ 3410 */
3410 int 3411 int
(...skipping 10 matching lines...) Expand all
3421 */ 3422 */
3422 if ((xmlDefaultCatalog == NULL) && 3423 if ((xmlDefaultCatalog == NULL) &&
3423 (xmlStrEqual(type, BAD_CAST "catalog"))) { 3424 (xmlStrEqual(type, BAD_CAST "catalog"))) {
3424 xmlDefaultCatalog = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, 3425 xmlDefaultCatalog = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE,
3425 xmlCatalogDefaultPrefer); 3426 xmlCatalogDefaultPrefer);
3426 xmlDefaultCatalog->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, 3427 xmlDefaultCatalog->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
3427 orig, NULL, xmlCatalogDefaultPrefer, NULL); 3428 orig, NULL, xmlCatalogDefaultPrefer, NULL);
3428 3429
3429 xmlRMutexUnlock(xmlCatalogMutex); 3430 xmlRMutexUnlock(xmlCatalogMutex);
3430 return(0); 3431 return(0);
3431 } 3432 }
3432 3433
3433 res = xmlACatalogAdd(xmlDefaultCatalog, type, orig, replace); 3434 res = xmlACatalogAdd(xmlDefaultCatalog, type, orig, replace);
3434 xmlRMutexUnlock(xmlCatalogMutex); 3435 xmlRMutexUnlock(xmlCatalogMutex);
3435 return(res); 3436 return(res);
3436 } 3437 }
3437 3438
3438 /** 3439 /**
3439 * xmlCatalogRemove: 3440 * xmlCatalogRemove:
3440 * @value: the value to remove 3441 * @value: the value to remove
3441 * 3442 *
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
3547 if (xmlDebugCatalogs) { 3548 if (xmlDebugCatalogs) {
3548 switch (prefer) { 3549 switch (prefer) {
3549 case XML_CATA_PREFER_PUBLIC: 3550 case XML_CATA_PREFER_PUBLIC:
3550 xmlGenericError(xmlGenericErrorContext, 3551 xmlGenericError(xmlGenericErrorContext,
3551 "Setting catalog preference to PUBLIC\n"); 3552 "Setting catalog preference to PUBLIC\n");
3552 break; 3553 break;
3553 case XML_CATA_PREFER_SYSTEM: 3554 case XML_CATA_PREFER_SYSTEM:
3554 xmlGenericError(xmlGenericErrorContext, 3555 xmlGenericError(xmlGenericErrorContext,
3555 "Setting catalog preference to SYSTEM\n"); 3556 "Setting catalog preference to SYSTEM\n");
3556 break; 3557 break;
3557 » case XML_CATA_PREFER_NONE: 3558 » default:
3558 » » break; 3559 » » return(ret);
3559 } 3560 }
3560 } 3561 }
3561 xmlCatalogDefaultPrefer = prefer; 3562 xmlCatalogDefaultPrefer = prefer;
3562 return(ret); 3563 return(ret);
3563 } 3564 }
3564 3565
3565 /** 3566 /**
3566 * xmlCatalogSetDebug: 3567 * xmlCatalogSetDebug:
3567 * @level: the debug level of catalogs required 3568 * @level: the debug level of catalogs required
3568 * 3569 *
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
3609 3610
3610 /** 3611 /**
3611 * xmlCatalogAddLocal: 3612 * xmlCatalogAddLocal:
3612 * @catalogs: a document's list of catalogs 3613 * @catalogs: a document's list of catalogs
3613 * @URL: the URL to a new local catalog 3614 * @URL: the URL to a new local catalog
3614 * 3615 *
3615 * Add the new entry to the catalog list 3616 * Add the new entry to the catalog list
3616 * 3617 *
3617 * Returns the updated list 3618 * Returns the updated list
3618 */ 3619 */
3619 void *» 3620 void *
3620 xmlCatalogAddLocal(void *catalogs, const xmlChar *URL) { 3621 xmlCatalogAddLocal(void *catalogs, const xmlChar *URL) {
3621 xmlCatalogEntryPtr catal, add; 3622 xmlCatalogEntryPtr catal, add;
3622 3623
3623 if (!xmlCatalogInitialized) 3624 if (!xmlCatalogInitialized)
3624 xmlInitializeCatalog(); 3625 xmlInitializeCatalog();
3625 3626
3626 if (URL == NULL) 3627 if (URL == NULL)
3627 return(catalogs); 3628 return(catalogs);
3628 3629
3629 if (xmlDebugCatalogs) 3630 if (xmlDebugCatalogs)
3630 xmlGenericError(xmlGenericErrorContext, 3631 xmlGenericError(xmlGenericErrorContext,
3631 "Adding document catalog %s\n", URL); 3632 "Adding document catalog %s\n", URL);
3632 3633
3633 add = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, URL, NULL, 3634 add = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, URL, NULL,
3634 xmlCatalogDefaultPrefer, NULL); 3635 xmlCatalogDefaultPrefer, NULL);
3635 if (add == NULL) 3636 if (add == NULL)
3636 return(catalogs); 3637 return(catalogs);
3637 3638
3638 catal = (xmlCatalogEntryPtr) catalogs; 3639 catal = (xmlCatalogEntryPtr) catalogs;
3639 if (catal == NULL) 3640 if (catal == NULL)
3640 return((void *) add); 3641 return((void *) add);
3641 3642
3642 while (catal->next != NULL) 3643 while (catal->next != NULL)
3643 catal = catal->next; 3644 catal = catal->next;
3644 catal->next = add; 3645 catal->next = add;
3645 return(catalogs); 3646 return(catalogs);
3646 } 3647 }
3647 3648
3648 /** 3649 /**
3649 * xmlCatalogLocalResolve: 3650 * xmlCatalogLocalResolve:
3650 * @catalogs: a document's list of catalogs 3651 * @catalogs: a document's list of catalogs
3651 * @pubID: the public ID string 3652 * @pubID: the public ID string
3652 * @sysID: the system ID string 3653 * @sysID: the system ID string
3653 * 3654 *
3654 * Do a complete resolution lookup of an External Identifier using a 3655 * Do a complete resolution lookup of an External Identifier using a
3655 * document's private catalog list 3656 * document's private catalog list
3656 * 3657 *
3657 * Returns the URI of the resource or NULL if not found, it must be freed 3658 * Returns the URI of the resource or NULL if not found, it must be freed
3658 * by the caller. 3659 * by the caller.
3659 */ 3660 */
3660 xmlChar * 3661 xmlChar *
3661 xmlCatalogLocalResolve(void *catalogs, const xmlChar *pubID, 3662 xmlCatalogLocalResolve(void *catalogs, const xmlChar *pubID,
3662 const xmlChar *sysID) { 3663 const xmlChar *sysID) {
3663 xmlCatalogEntryPtr catal; 3664 xmlCatalogEntryPtr catal;
3664 xmlChar *ret; 3665 xmlChar *ret;
(...skipping 24 matching lines...) Expand all
3689 if ((ret != NULL) && (ret != XML_CATAL_BREAK)) 3690 if ((ret != NULL) && (ret != XML_CATAL_BREAK))
3690 return(ret); 3691 return(ret);
3691 return(NULL); 3692 return(NULL);
3692 } 3693 }
3693 3694
3694 /** 3695 /**
3695 * xmlCatalogLocalResolveURI: 3696 * xmlCatalogLocalResolveURI:
3696 * @catalogs: a document's list of catalogs 3697 * @catalogs: a document's list of catalogs
3697 * @URI: the URI 3698 * @URI: the URI
3698 * 3699 *
3699 * Do a complete resolution lookup of an URI using a 3700 * Do a complete resolution lookup of an URI using a
3700 * document's private catalog list 3701 * document's private catalog list
3701 * 3702 *
3702 * Returns the URI of the resource or NULL if not found, it must be freed 3703 * Returns the URI of the resource or NULL if not found, it must be freed
3703 * by the caller. 3704 * by the caller.
3704 */ 3705 */
3705 xmlChar * 3706 xmlChar *
3706 xmlCatalogLocalResolveURI(void *catalogs, const xmlChar *URI) { 3707 xmlCatalogLocalResolveURI(void *catalogs, const xmlChar *URI) {
3707 xmlCatalogEntryPtr catal; 3708 xmlCatalogEntryPtr catal;
3708 xmlChar *ret; 3709 xmlChar *ret;
3709 3710
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
3750 xmlInitializeCatalog(); 3751 xmlInitializeCatalog();
3751 3752
3752 if (msg == 0) { 3753 if (msg == 0) {
3753 xmlGenericError(xmlGenericErrorContext, 3754 xmlGenericError(xmlGenericErrorContext,
3754 "Use of deprecated xmlCatalogGetSystem() call\n"); 3755 "Use of deprecated xmlCatalogGetSystem() call\n");
3755 msg++; 3756 msg++;
3756 } 3757 }
3757 3758
3758 if (sysID == NULL) 3759 if (sysID == NULL)
3759 return(NULL); 3760 return(NULL);
3760 3761
3761 /* 3762 /*
3762 * Check first the XML catalogs 3763 * Check first the XML catalogs
3763 */ 3764 */
3764 if (xmlDefaultCatalog != NULL) { 3765 if (xmlDefaultCatalog != NULL) {
3765 ret = xmlCatalogListXMLResolve(xmlDefaultCatalog->xml, NULL, sysID); 3766 ret = xmlCatalogListXMLResolve(xmlDefaultCatalog->xml, NULL, sysID);
3766 if ((ret != NULL) && (ret != XML_CATAL_BREAK)) { 3767 if ((ret != NULL) && (ret != XML_CATAL_BREAK)) {
3767 snprintf((char *) result, sizeof(result) - 1, "%s", (char *) ret); 3768 snprintf((char *) result, sizeof(result) - 1, "%s", (char *) ret);
3768 result[sizeof(result) - 1] = 0; 3769 result[sizeof(result) - 1] = 0;
3769 return(result); 3770 return(result);
3770 } 3771 }
(...skipping 23 matching lines...) Expand all
3794 xmlInitializeCatalog(); 3795 xmlInitializeCatalog();
3795 3796
3796 if (msg == 0) { 3797 if (msg == 0) {
3797 xmlGenericError(xmlGenericErrorContext, 3798 xmlGenericError(xmlGenericErrorContext,
3798 "Use of deprecated xmlCatalogGetPublic() call\n"); 3799 "Use of deprecated xmlCatalogGetPublic() call\n");
3799 msg++; 3800 msg++;
3800 } 3801 }
3801 3802
3802 if (pubID == NULL) 3803 if (pubID == NULL)
3803 return(NULL); 3804 return(NULL);
3804 3805
3805 /* 3806 /*
3806 * Check first the XML catalogs 3807 * Check first the XML catalogs
3807 */ 3808 */
3808 if (xmlDefaultCatalog != NULL) { 3809 if (xmlDefaultCatalog != NULL) {
3809 ret = xmlCatalogListXMLResolve(xmlDefaultCatalog->xml, pubID, NULL); 3810 ret = xmlCatalogListXMLResolve(xmlDefaultCatalog->xml, pubID, NULL);
3810 if ((ret != NULL) && (ret != XML_CATAL_BREAK)) { 3811 if ((ret != NULL) && (ret != XML_CATAL_BREAK)) {
3811 snprintf((char *) result, sizeof(result) - 1, "%s", (char *) ret); 3812 snprintf((char *) result, sizeof(result) - 1, "%s", (char *) ret);
3812 result[sizeof(result) - 1] = 0; 3813 result[sizeof(result) - 1] = 0;
3813 return(result); 3814 return(result);
3814 } 3815 }
3815 } 3816 }
3816 3817
3817 if (xmlDefaultCatalog != NULL) 3818 if (xmlDefaultCatalog != NULL)
3818 return(xmlCatalogGetSGMLPublic(xmlDefaultCatalog->sgml, pubID)); 3819 return(xmlCatalogGetSGMLPublic(xmlDefaultCatalog->sgml, pubID));
3819 return(NULL); 3820 return(NULL);
3820 } 3821 }
3821 3822
3822 #define bottom_catalog 3823 #define bottom_catalog
3823 #include "elfgcchack.h" 3824 #include "elfgcchack.h"
3824 #endif /* LIBXML_CATALOG_ENABLED */ 3825 #endif /* LIBXML_CATALOG_ENABLED */
OLDNEW
« no previous file with comments | « third_party/libxml/src/c14n.c ('k') | third_party/libxml/src/chvalid.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698