1 /*
2  * See Copyright for the license status of this software.
3  */
4 
5 #ifndef UTILS_H
6 #define UTILS_H
7 
8 #include "RS_XML.h"
9 #include "RSCommon.h"
10 
11 #define XMLCHAR_TO_CHAR(val)  ((char *) val)
12 #define CHAR_TO_XMLCHAR(val)  ((xmlChar *) val)
13 
14 int isBlank(const char *str);
15 char *trim(char *str);
16 
17 #include <libxml/parser.h>
18 
19   /* name of the R class identifying a function that wants the xmlParserCtxt as the first argument. */
20 #define XML_PARSE_CONTEXT_FUNCTION "XMLParserContextFunction"
21 
22 #define XML_PARSER_CONTEXT_TYPE_NAME "XMLParserContext"
23 
24 USER_OBJECT_ RS_XML(invokeFunction)(USER_OBJECT_ fun, USER_OBJECT_ opArgs, USER_OBJECT_ state, xmlParserCtxtPtr ctx);
25 USER_OBJECT_ RS_XML(findFunction)(const char *opName, USER_OBJECT_ functions);
26 
27 void RS_XML(SetNames)(int n, const char *cnames[], USER_OBJECT_ ans);
28 int RS_XML(SetClassName)(const char *name, USER_OBJECT_ target);
29 
30 SEXP R_makeRefObject(void *ref, const char *className);
31 
32 #ifndef SET_CLASS_NAME
33 #define SET_CLASS_NAME(localClassName, target)  RS_XML(SetClassName)((localClassName), (target))
34 #endif
35 
36 #ifdef LIBXML2
37 #ifdef FROM_GNOME_XML_DIR
38 #include <gnome-xml/hash.h>
39 #else
40 #include <libxml/hash.h>
41 #endif
42 
43 int xmlHashSize(xmlHashTablePtr table);
44 #endif
45 
46 
47 void RSXML_setErrorHandlers(void);
48 
49 
50 USER_OBJECT_ RS_XML(RecursiveApply)(USER_OBJECT_ top, USER_OBJECT_ func, USER_OBJECT_ klasses);
51 USER_OBJECT_ RS_XML(HtmlParseTree)(USER_OBJECT_ fileName, USER_OBJECT_ converterFunctions,
52 				   USER_OBJECT_ skipBlankLines, USER_OBJECT_ replaceEntities,
53 				   USER_OBJECT_ asText, USER_OBJECT_ trim, USER_OBJECT_ isURL);
54 
55 USER_OBJECT_ RS_XML(getDTD)(USER_OBJECT_ dtdFileName, USER_OBJECT_ externalId,
56 			    USER_OBJECT_ asText, USER_OBJECT_ isURL, USER_OBJECT_ errorFun);
57 USER_OBJECT_ RS_XML(libxmlVersion)();
58 
59 
60 USER_OBJECT_
61 RS_XML(Parse)(USER_OBJECT_ fileName, USER_OBJECT_ handlers, USER_OBJECT_ endElementHandlers, USER_OBJECT_ addContext,
62                USER_OBJECT_ ignoreBlanks,  USER_OBJECT_ useTagName, USER_OBJECT_ asText,
63                  USER_OBJECT_ trim, USER_OBJECT_ useExpat, USER_OBJECT_ stateObject,
64                   USER_OBJECT_ replaceEntities, USER_OBJECT_ validate, USER_OBJECT_ saxVersion,
65     	           USER_OBJECT_ branches, USER_OBJECT_ useDotNames, USER_OBJECT_ errorFun,
66 	            USER_OBJECT_ manageMemory, USER_OBJECT_ r_encoding);
67 /*
68 USER_OBJECT_ RS_XML(Parse)(USER_OBJECT_ fileName, USER_OBJECT_ handlers, USER_OBJECT_ addContext,
69 			   USER_OBJECT_ ignoreBlanks,  USER_OBJECT_ useTagName, USER_OBJECT_ asText,
70 			   USER_OBJECT_ trim, USER_OBJECT_ useExpat, USER_OBJECT_ stateObject,
71 			   USER_OBJECT_ replaceEntities, USER_OBJECT_ validate);
72 */
73 
74 USER_OBJECT_
75 RS_XML(ParseTree)(USER_OBJECT_ fileName, USER_OBJECT_ converterFunctions,
76 		  USER_OBJECT_ skipBlankLines, USER_OBJECT_ replaceEntities,
77 		  USER_OBJECT_ asText, USER_OBJECT_ trim, USER_OBJECT_ validate,
78 		  USER_OBJECT_ getDTD, USER_OBJECT_ isURL,
79 		  USER_OBJECT_ addNamespaceAttributes, USER_OBJECT_ useInternalNodes,
80 		  USER_OBJECT_ s_useHTML, USER_OBJECT_ isSchema, USER_OBJECT_ fullNamespaceInfo, USER_OBJECT_ r_encoding,
81                   USER_OBJECT_ useDotNames, USER_OBJECT_ xinclude, USER_OBJECT_ errorFun,
82                   USER_OBJECT_ manageMemory, USER_OBJECT_ r_parserOptions, USER_OBJECT_ r_rootFirst);
83 
84 USER_OBJECT_ R_newXMLDtd(USER_OBJECT_ sdoc, USER_OBJECT_ sname, USER_OBJECT_ sexternalID, USER_OBJECT_ ssysID, USER_OBJECT_ manageMemory);
85 		 USER_OBJECT_ R_newXMLDoc(USER_OBJECT_ dtd, USER_OBJECT_ namespaces, USER_OBJECT_ isHTML);
86 
87 USER_OBJECT_ R_newXMLNode(USER_OBJECT_ name, USER_OBJECT_ attrs, USER_OBJECT_ nameSpace, USER_OBJECT_ sdoc, USER_OBJECT_ namespaceDefinitions, USER_OBJECT_ manageMemory);
88 USER_OBJECT_ R_newXMLTextNode(USER_OBJECT_ value, USER_OBJECT_ sdoc, USER_OBJECT_ manageMemory);
89 USER_OBJECT_ R_xmlNewComment(USER_OBJECT_ str, USER_OBJECT_ sdoc, USER_OBJECT_ manageMemory);
90 USER_OBJECT_ R_newXMLCDataNode(USER_OBJECT_ sdoc, USER_OBJECT_ value, USER_OBJECT_ manageMemory);
91 USER_OBJECT_ R_newXMLPINode(USER_OBJECT_ sdoc, USER_OBJECT_ name, USER_OBJECT_ content, USER_OBJECT_ manageMemory);
92 USER_OBJECT_ R_xmlNewNs(USER_OBJECT_ sdoc, USER_OBJECT_ shref, USER_OBJECT_ sprefix);
93 USER_OBJECT_ R_xmlSetNs(USER_OBJECT_ s_node, USER_OBJECT_ s_ns, USER_OBJECT_ append);
94 USER_OBJECT_ R_insertXMLNode(USER_OBJECT_ node, USER_OBJECT_ parent, USER_OBJECT_ r_at, USER_OBJECT_ shallow) ;
95 USER_OBJECT_ R_saveXMLDOM(USER_OBJECT_ sdoc, USER_OBJECT_ sfileName, USER_OBJECT_ compression, USER_OBJECT_ sindent,
96 			  USER_OBJECT_ prefix, USER_OBJECT_ r_encoding);
97 
98 
99 USER_OBJECT_ RS_XML_xmlNodeNumChildren(USER_OBJECT_ snode);
100 
101 USER_OBJECT_ R_createXMLNodeRef(xmlNodePtr node, USER_OBJECT_ finalize);
102 USER_OBJECT_ R_createXMLDocRef(xmlDocPtr doc);
103 
104 USER_OBJECT_ R_xmlCatalogResolve(SEXP r_id, SEXP type, USER_OBJECT_ debug);
105 
106 USER_OBJECT_ RS_XML_setDoc(USER_OBJECT_ snode, USER_OBJECT_ sdoc);
107 USER_OBJECT_ RS_XML_unsetDoc(USER_OBJECT_ snode, USER_OBJECT_ unlink, USER_OBJECT_ r_parent, USER_OBJECT_ recursive);
108 
109 		 USER_OBJECT_ RS_XML_printXMLNode(USER_OBJECT_ node, USER_OBJECT_ level, USER_OBJECT_ format, USER_OBJECT_ indent, USER_OBJECT_ r_encoding, USER_OBJECT_ r_encoding_int);
110 
111 USER_OBJECT_ RS_XML_dumpHTMLDoc(USER_OBJECT_ r_node, USER_OBJECT_ format, USER_OBJECT_ r_encoding, USER_OBJECT_ indent, USER_OBJECT_ outFile);
112 
113 USER_OBJECT_ RS_XML_removeChildren(USER_OBJECT_ s_node, USER_OBJECT_ kids, USER_OBJECT_ freeNode);
114 
115 USER_OBJECT_ RS_XML_clone(USER_OBJECT_ obj, USER_OBJECT_ recursive, USER_OBJECT_ addFinalizer);
116 
117 USER_OBJECT_ R_xmlRootNode(USER_OBJECT_ sdoc, USER_OBJECT_ skipDtd, USER_OBJECT_ manageMemory);
118 SEXP RS_XML_xpathEval(SEXP sdoc, SEXP r_node, SEXP path, SEXP namespaces, SEXP fun, SEXP charEncoding,
119 		      SEXP manageMemory, SEXP xpathFuns, SEXP anonFuns);
120 
121 USER_OBJECT_ RS_XML_xmlNodeChildrenReferences(USER_OBJECT_ snode, USER_OBJECT_ r_addNames, USER_OBJECT_ manageMemory);
122 
123 
124 USER_OBJECT_ RS_XML(internalNodeNamespaceDefinitions)(USER_OBJECT_ r_node, USER_OBJECT_ recursive);
125 
126 USER_OBJECT_ RS_XML(getDefaultValiditySetting)(USER_OBJECT_ val);
127 
128 SEXP RS_XML_freeDoc(SEXP ref);
129 SEXP RS_XML_setRootNode(USER_OBJECT_ r_doc, USER_OBJECT_ r_node);
130 USER_OBJECT_ R_getNodeChildByIndex(USER_OBJECT_ snode, USER_OBJECT_ r_index, USER_OBJECT_ manageMemory);
131 SEXP RS_XML_setDocEl(SEXP r_node, SEXP r_doc);
132 USER_OBJECT_ RS_XML_isDescendantOf(USER_OBJECT_ r_node, USER_OBJECT_ r_top, USER_OBJECT_ strict);
133 SEXP RS_XML_getStructuredErrorHandler();
134 SEXP RS_XML_setStructuredErrorHandler(SEXP els);
135 SEXP R_convertDOMToHashTree(SEXP rnode, SEXP env, SEXP childrenEnv, SEXP parentEnv);
136 SEXP R_parseURI(SEXP r_uri);
137 SEXP R_getXMLFeatures();
138 SEXP R_xmlReadMemory(SEXP r_txt, SEXP len, SEXP r_encoding, SEXP r_options, SEXP r_base);
139 SEXP R_xmlReadFile(SEXP r_filename, SEXP r_encoding, SEXP r_options);
140 USER_OBJECT_ R_libxmlTypeTable_names(USER_OBJECT_ table, USER_OBJECT_ s_elType) ;
141 USER_OBJECT_ R_libxmlTypeTable_lookup(USER_OBJECT_ table, USER_OBJECT_ name, USER_OBJECT_ s_elType);
142 SEXP RS_XML_xmlSchemaValidateDoc(SEXP r_schema, SEXP r_doc, SEXP r_options, SEXP r_errorHandlers);
143 SEXP R_XML_indexOfChild(SEXP r_node);
144 SEXP RS_XML_xmlStopParser(SEXP r_context);
145 SEXP R_clearNodeMemoryManagement(SEXP r_node);
146 SEXP R_XMLInternalDocument_free(SEXP sdoc);
147 SEXP R_addXMLInternalDocument_finalizer(SEXP sdoc, SEXP fun);
148 USER_OBJECT_ R_createXMLNode(USER_OBJECT_ snode, USER_OBJECT_ handlers, USER_OBJECT_ r_trim, USER_OBJECT_ r_skipBlankLines);
149 USER_OBJECT_ RS_XML_xmlNodeName(USER_OBJECT_ snode);
150 USER_OBJECT_ RS_XML_xmlNodeNamespace(USER_OBJECT_ snode);
151 USER_OBJECT_ RS_XML_xmlNodeAttributes(USER_OBJECT_ snode, USER_OBJECT_ addNamespaces, USER_OBJECT_ addNamespaceURLs);
152 SEXP R_xmlNodeValue(SEXP node, SEXP raw, SEXP r_encoding);
153 SEXP R_setXMLInternalTextNode_value(SEXP node, SEXP value);
154 USER_OBJECT_ RS_XML_xmlNodeParent(USER_OBJECT_ snode, USER_OBJECT_ manageMemory);
155 USER_OBJECT_ R_getXMLNsRef(USER_OBJECT_ r_node);
156 SEXP R_setXMLInternalTextNode_noenc(SEXP node);
157 SEXP R_isNodeChildOfAt(SEXP rkid, SEXP rnode, SEXP rat);
158 SEXP R_findXIncludeStartNodes(SEXP r_root, SEXP manageMemory);
159 SEXP RS_XML_removeAllNodeNamespaces(SEXP s_node);
160 SEXP RS_XML_removeNodeNamespaces(SEXP s_node, SEXP r_ns);
161 SEXP R_matchNodesInList(SEXP r_nodes, SEXP r_target, SEXP r_nomatch);
162 USER_OBJECT_ RS_XML_copyNodesToDoc(USER_OBJECT_ s_node, USER_OBJECT_ s_doc, USER_OBJECT_ manageMemory);
163 USER_OBJECT_ RS_XML_getDocumentName(USER_OBJECT_ sdoc);
164 USER_OBJECT_ RS_XML_xmlXIncludeProcessFlags(USER_OBJECT_ r_doc, USER_OBJECT_ r_flags);
165 USER_OBJECT_ RS_XML_xmlXIncludeProcessTreeFlags(USER_OBJECT_ r_node, USER_OBJECT_ r_flags);
166 USER_OBJECT_ RS_XML(internalNodeNamespaceDefinitions)(USER_OBJECT_ r_node, USER_OBJECT_ recursive);
167 
168 
169 Rboolean R_isInstanceOf(USER_OBJECT_ obj, const char *klass);
170 USER_OBJECT_ RS_XML_addNodeAttributes(USER_OBJECT_ s_node, USER_OBJECT_ attrs);
171 USER_OBJECT_ RS_XML_removeNodeAttributes(USER_OBJECT_ s_node, USER_OBJECT_ attrs, USER_OBJECT_ asNamespace);
172 USER_OBJECT_ RS_XML_getNsList(USER_OBJECT_ s_node, USER_OBJECT_ asRef);
173 
174 USER_OBJECT_ RS_XML_setNodeName(USER_OBJECT_ s_node, USER_OBJECT_ s_name);
175 USER_OBJECT_ R_xmlNsAsCharacter(USER_OBJECT_ s_ns);
176 
177 
178 USER_OBJECT_ R_createXMLNsRef(xmlNsPtr ns);
179 USER_OBJECT_ RS_XML_getNextSibling(USER_OBJECT_ node, USER_OBJECT_ s_prev, USER_OBJECT_ manageMemory);
180 
181 USER_OBJECT_ R_getXMLNodeDocument(USER_OBJECT_ s_node);
182 USER_OBJECT_ RS_XML_createDocFromNode(USER_OBJECT_ s_node);
183 
184 SEXP R_removeInternalNode(SEXP r_node, SEXP r_free);
185 
186 USER_OBJECT_ RS_XML_replaceXMLNode(USER_OBJECT_ r_old, USER_OBJECT_ r_new, USER_OBJECT_ manageMemory);
187 
188 
189 USER_OBJECT_ RS_XML_xmlAddSiblingAt(USER_OBJECT_ r_to, USER_OBJECT_ r_node, USER_OBJECT_ r_before, USER_OBJECT_ manageMemory);
190 
191 SEXP RS_XML_clearCatalog();
192 SEXP RS_XML_loadCatalog(SEXP catalogs);
193 SEXP RS_XML_catalogAdd(SEXP orig, SEXP replace, SEXP type);
194 SEXP RS_XML_catalogDump(SEXP fileName);
195 
196 void R_xmlFreeDoc(SEXP ref);
197 
198 USER_OBJECT_ RS_XML_setDocumentName(USER_OBJECT_ sdoc, USER_OBJECT_ sname);
199 
200 USER_OBJECT_ RS_XML_setKeepBlanksDefault(USER_OBJECT_ val);
201 
202 
203 SEXP RS_XML_setNS(SEXP s_node, SEXP r_ns);
204 
205 
206 SEXP stop(const char *className, const char *msg, ...);
207 SEXP RSXML_structuredStop(SEXP errorFun, xmlErrorPtr err);
208 
209 void R_xmlStructuredErrorHandler(void *data, xmlErrorPtr err);
210 
211 
212 SEXP R_getDocEncoding(SEXP r_doc);
213 SEXP R_getLineNumber(SEXP r_node);
214 
215 SEXP R_addXMLNodeFinalizer(SEXP r_node);
216 
217 
218 extern int R_numXMLDocs, R_numXMLDocsFreed;
219 
220 SEXP CreateCharSexpWithEncoding(const xmlChar *encoding, const xmlChar *str);
221 
222 #define DECL_ENCODING_FROM_NODE(node)   const xmlChar *encoding = node->doc ? node->doc->encoding : NULL;
223 #define DECL_ENCODING_FROM_DOC(doc)   const xmlChar *encoding = doc->encoding;
224 #define DECL_ENCODING_FROM_EVENT_PARSER(parserData)   const xmlChar *encoding = parserData->ctx->encoding;
225 
226 #define R_USE_XML_ENCODING 1
227 
228 #ifdef R_USE_XML_ENCODING
229 #undef COPY_TO_USER_STRING
230 //#warning "Redefining COPY_TO_USER_STRING to use encoding from XML parser"
231 /*
232 #define COPY_TO_USER_STRING(x)  CreateCharSexpWithEncoding(encoding, CHAR_TO_XMLCHAR (x))
233 */
234 // #define COPY_TO_USER_STRING(x)  mkChar(CHAR_TO_XMLCHAR (x))
235 #define COPY_TO_USER_STRING(x)  mkChar((const char *) (x))
236 #define ENC_COPY_TO_USER_STRING(x)  CreateCharSexpWithEncoding(encoding, CHAR_TO_XMLCHAR (x))
237 #endif
238 
239 
240 #include <R_ext/Utils.h>
241 #define R_CHECK_INTERRUPTS R_CheckUserInterrupt();
242 
243 
244 //#include "NodeGC.h"
245 
246 
247 SEXP R_createXMLNodeRefDirect(xmlNodePtr node, int addFinalizer);
248 int R_XML_getManageMemory(USER_OBJECT_ user, xmlDocPtr doc, xmlNodePtr node);
249 
250 USER_OBJECT_ R_convertXMLNsRef(SEXP r_ns);
251 
252 USER_OBJECT_ R_replaceNodeWithChildren(USER_OBJECT_ r_node);
253 
254 #endif
255 
256