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