Rev 7986 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
#include "Utils.h" /* For isBlank() */#include <libxml/catalog.h>USER_OBJECT_R_xmlCatalogResolve(USER_OBJECT_ r_id, USER_OBJECT_ type, USER_OBJECT_ debug){xmlChar *id;SEXP r_ans = R_NilValue;xmlChar* ans = NULL;int debugLevel = -1;int n, i;debugLevel = xmlCatalogSetDebug(LOGICAL(debug)[0]);n = GET_LENGTH(r_id);PROTECT(r_ans = NEW_CHARACTER(n));for(i = 0; i < n; i++) {id = CHAR_TO_XMLCHAR(CHAR_DEREF(STRING_ELT(r_id, i)));switch(INTEGER(type)[i]) {case 1:ans = xmlCatalogResolveURI(id);break;case 2:ans = xmlCatalogResolvePublic(id);break;case 3:ans = xmlCatalogResolveSystem(id);break;default:break;}if(ans) {SET_STRING_ELT(r_ans, i, mkChar(XMLCHAR_TO_CHAR(ans)));xmlFree(ans);} else {SET_STRING_ELT(r_ans, i, NA_STRING);}}UNPROTECT(1);xmlCatalogSetDebug(debugLevel);return(r_ans);}SEXPRS_XML_loadCatalog(SEXP catalogs){int i, n;SEXP ans;n = GET_LENGTH(catalogs);ans = NEW_LOGICAL(n);for(i = 0; i < n ; i++) {LOGICAL(ans)[i] = (xmlLoadCatalog(CHAR(STRING_ELT(catalogs, i))) == 0);}return(ans);}SEXPRS_XML_clearCatalog(void){xmlCatalogCleanup();return(ScalarLogical(1));}SEXPRS_XML_catalogAdd(SEXP orig, SEXP replace, SEXP type){int i, n;SEXP ans;n = LENGTH(orig);ans = NEW_LOGICAL(n);for(i = 0; i < n ; i++) {LOGICAL(ans)[i] = (xmlCatalogAdd(CHAR_TO_XMLCHAR(CHAR(STRING_ELT(type, i))),CHAR_TO_XMLCHAR(CHAR(STRING_ELT(orig, i))),CHAR_TO_XMLCHAR(CHAR(STRING_ELT(replace, i)))) == 0);}return(ans);}SEXPRS_XML_catalogDump(SEXP fileName){FILE *out;out = fopen(CHAR(STRING_ELT(fileName, 0)), "w");if(!out) {Rf_error("Can't open file %s for write access", CHAR(STRING_ELT(fileName, 0)) );}xmlCatalogDump(out);return(ScalarLogical(TRUE));}voidR_xmlInitializeCatalog(void){xmlInitializeCatalog();}