File: Rcatalog.c

package info (click to toggle)
r-cran-xml 3.98-1.5-1
  • links: PTS
  • area: main
  • in suites: stretch
  • size: 9,464 kB
  • ctags: 636
  • sloc: xml: 79,579; ansic: 6,518; asm: 644; sh: 16; makefile: 1
file content (108 lines) | stat: -rw-r--r-- 2,130 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#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);
}


SEXP
RS_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);
}

SEXP
RS_XML_clearCatalog()
{
    xmlCatalogCleanup();
    return(ScalarLogical(1));
}

SEXP 
RS_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);
}

SEXP
RS_XML_catalogDump(SEXP fileName)
{
    FILE *out;
    out = fopen(CHAR(STRING_ELT(fileName, 0)), "w");
    if(!out) {
	PROBLEM "Can't open file %s for write access", CHAR(STRING_ELT(fileName, 0))
	    ERROR;
    }

    xmlCatalogDump(out);
    return(ScalarLogical(TRUE));
}

void
R_xmlInitializeCatalog()
{
    xmlInitializeCatalog();
}