1 #include "Utils.h"  /* For isBlank() */
2 
3 #include <libxml/catalog.h>
4 
5 
6 USER_OBJECT_
R_xmlCatalogResolve(USER_OBJECT_ r_id,USER_OBJECT_ type,USER_OBJECT_ debug)7 R_xmlCatalogResolve(USER_OBJECT_ r_id, USER_OBJECT_ type, USER_OBJECT_ debug)
8 {
9     xmlChar *id;
10     SEXP r_ans = R_NilValue;
11     xmlChar* ans = NULL;
12     int debugLevel = -1;
13     int n, i;
14 
15     debugLevel = xmlCatalogSetDebug(LOGICAL(debug)[0]);
16 
17     n = GET_LENGTH(r_id);
18     PROTECT(r_ans = NEW_CHARACTER(n));
19 
20     for(i = 0; i < n; i++) {
21        id = CHAR_TO_XMLCHAR(CHAR_DEREF(STRING_ELT(r_id, i)));
22 
23        switch(INTEGER(type)[i]) {
24        case 1:
25           ans = xmlCatalogResolveURI(id);
26 	  break;
27        case 2:
28 	  ans = xmlCatalogResolvePublic(id);
29 	  break;
30        case 3:
31 	  ans = xmlCatalogResolveSystem(id);
32 	  break;
33        default:
34           break;
35        }
36 
37        if(ans) {
38           SET_STRING_ELT(r_ans, i, mkChar(XMLCHAR_TO_CHAR(ans)));
39    	  xmlFree(ans);
40        } else {
41  	 SET_STRING_ELT(r_ans, i, NA_STRING);
42        }
43     }
44 
45     UNPROTECT(1);
46 
47     xmlCatalogSetDebug(debugLevel);
48 
49     return(r_ans);
50 }
51 
52 
53 SEXP
RS_XML_loadCatalog(SEXP catalogs)54 RS_XML_loadCatalog(SEXP catalogs)
55 {
56     int i, n;
57     SEXP ans;
58     n = GET_LENGTH(catalogs);
59     ans = NEW_LOGICAL(n);
60     for(i = 0; i < n ; i++) {
61 	LOGICAL(ans)[i] = (xmlLoadCatalog(CHAR(STRING_ELT(catalogs, i))) == 0);
62     }
63     return(ans);
64 }
65 
66 SEXP
RS_XML_clearCatalog()67 RS_XML_clearCatalog()
68 {
69     xmlCatalogCleanup();
70     return(ScalarLogical(1));
71 }
72 
73 SEXP
RS_XML_catalogAdd(SEXP orig,SEXP replace,SEXP type)74 RS_XML_catalogAdd(SEXP orig, SEXP replace, SEXP type)
75 {
76     int i, n;
77     SEXP ans;
78 
79     n =  LENGTH(orig);
80     ans = NEW_LOGICAL(n);
81     for(i = 0; i < n ; i++) {
82 	LOGICAL(ans)[i] = (xmlCatalogAdd(CHAR_TO_XMLCHAR(CHAR(STRING_ELT(type, i))),
83                                          CHAR_TO_XMLCHAR(CHAR(STRING_ELT(orig, i))),
84 					 CHAR_TO_XMLCHAR(CHAR(STRING_ELT(replace, i)))) == 0);
85     }
86 
87     return(ans);
88 }
89 
90 SEXP
RS_XML_catalogDump(SEXP fileName)91 RS_XML_catalogDump(SEXP fileName)
92 {
93     FILE *out;
94     out = fopen(CHAR(STRING_ELT(fileName, 0)), "w");
95     if(!out) {
96 	Rf_error("Can't open file %s for write access", CHAR(STRING_ELT(fileName, 0)) );
97     }
98 
99     xmlCatalogDump(out);
100     return(ScalarLogical(TRUE));
101 }
102 
103 void
R_xmlInitializeCatalog()104 R_xmlInitializeCatalog()
105 {
106     xmlInitializeCatalog();
107 }
108