1 #include "RS_XML.h"
2 #include "Utils.h"
3 
4 #ifdef FROM_GNOME_XML_DIR
5 #include <gnome-xml/parser.h>
6 #else
7 #include <libxml/parser.h>
8 #endif
9 
10 SEXP
R_getXMLFeatures()11 R_getXMLFeatures()
12 {
13 
14 #ifdef HAVE_XML_HAS_FEATURE
15 
16     int features[] = {
17            XML_WITH_THREAD,
18            XML_WITH_TREE,
19            XML_WITH_OUTPUT,
20            XML_WITH_PUSH,
21            XML_WITH_READER,
22            XML_WITH_PATTERN,
23            XML_WITH_WRITER,
24            XML_WITH_SAX1,
25            XML_WITH_FTP,
26            XML_WITH_HTTP,
27            XML_WITH_VALID,
28            XML_WITH_HTML,
29            XML_WITH_LEGACY,
30            XML_WITH_C14N,
31            XML_WITH_CATALOG,
32            XML_WITH_XPATH,
33            XML_WITH_XPTR,
34            XML_WITH_XINCLUDE,
35            XML_WITH_ICONV,
36            XML_WITH_ISO8859X,
37            XML_WITH_UNICODE,
38            XML_WITH_REGEXP,
39            XML_WITH_AUTOMATA,
40            XML_WITH_EXPR,
41            XML_WITH_SCHEMAS,
42            XML_WITH_SCHEMATRON,
43            XML_WITH_MODULES,
44            XML_WITH_DEBUG,
45            XML_WITH_DEBUG_MEM,
46            XML_WITH_DEBUG_RUN,
47 #ifdef HAVE_XML_WITH_ZLIB
48            XML_WITH_ZLIB
49 #else
50            -1
51 #endif
52    };
53 
54     const char * const names[] = {
55            "THREAD",
56            "TREE",
57            "OUTPUT",
58            "PUSH",
59            "READER",
60            "PATTERN",
61            "WRITER",
62            "SAX1",
63            "FTP",
64            "HTTP",
65            "VALID",
66            "HTML",
67            "LEGACY",
68            "C14N",
69            "CATALOG",
70            "XPATH",
71            "XPTR",
72            "XINCLUDE",
73            "ICONV",
74            "ISO8859X",
75            "UNICODE",
76            "REGEXP",
77            "AUTOMATA",
78            "EXPR",
79            "SCHEMAS",
80            "SCHEMATRON",
81            "MODULES",
82            "DEBUG",
83            "DEBUG_MEM",
84            "DEBUG_RUN",
85            "ZLIB"
86      };
87 
88     SEXP ans, rnames;
89     int n = sizeof(features)/sizeof(features[0]), i;
90 
91     PROTECT(ans = allocVector(LGLSXP, n));
92     PROTECT(rnames = allocVector(STRSXP, n));
93     for(i = 0; i < n; i++)  {
94         if(features[i] > -1)
95 	   LOGICAL(ans)[i] = xmlHasFeature(features[i]);
96         else
97  	   LOGICAL(ans)[i] = NA_LOGICAL;
98 	SET_STRING_ELT(rnames, i, mkChar(names[i]));
99     }
100     SET_NAMES(ans, rnames);
101     UNPROTECT(2);
102 
103     return(ans);
104 #else
105     return(allocVector(STRSXP, 0));
106 #endif
107 }
108