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