From 5b11a523ed45b7953d029c57d5e59dea7a5a9ef1 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Mon, 4 Sep 2023 07:51:57 +0000 Subject: [PATCH 01/25] `use_cpp11()` --- DESCRIPTION | 2 ++ R/xml2-package.R | 1 + 2 files changed, 3 insertions(+) diff --git a/DESCRIPTION b/DESCRIPTION index 956c046a..cf15f0a4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -74,3 +74,5 @@ Collate: 'xml_write.R' 'zzz.R' Config/testthat/edition: 3 +LinkingTo: + cpp11 diff --git a/R/xml2-package.R b/R/xml2-package.R index 97c07e14..9d8bb937 100644 --- a/R/xml2-package.R +++ b/R/xml2-package.R @@ -5,5 +5,6 @@ #' @import rlang #' @importFrom glue glue #' @importFrom lifecycle deprecated +#' @useDynLib xml2, .registration = TRUE ## usethis namespace: end NULL From 1fd06ac35b9f2e56df38469f7bec5db24eb58f4e Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Mon, 4 Sep 2023 07:52:59 +0000 Subject: [PATCH 02/25] Use cpp11 register mechanism --- DESCRIPTION | 1 + R/as_xml_document.R | 2 +- R/cpp11.R | 253 +++++++++++++ R/init.R | 8 +- R/xml_attr.R | 8 +- R/xml_children.R | 16 +- R/xml_document.R | 8 +- R/xml_find.R | 12 +- R/xml_modify.R | 44 +-- R/xml_name.R | 4 +- R/xml_namespaces.R | 2 +- R/xml_node.R | 2 +- R/xml_nodeset.R | 2 +- R/xml_parse.R | 12 +- R/xml_path.R | 2 +- R/xml_schema.R | 2 +- R/xml_text.R | 8 +- R/xml_type.R | 4 +- R/xml_url.R | 14 +- R/xml_write.R | 12 +- inst/include/xml2_types.h | 6 +- src/connection.cpp | 4 +- src/connection.h | 2 + src/cpp11.cpp | 523 +++++++++++++++++++++++++++ src/init.c | 149 -------- src/xml2_doc.cpp | 20 +- src/xml2_init.cpp | 6 +- src/xml2_namespace.cpp | 10 +- src/xml2_node.cpp | 68 ++-- src/xml2_output.cpp | 16 +- src/xml2_schema.cpp | 4 +- src/xml2_url.cpp | 12 +- src/xml2_utils.h | 2 + src/xml2_xpath.cpp | 4 +- tests/testthat/test-xml_modify.R | 4 +- tests/testthat/test-xml_namespaces.R | 4 +- 36 files changed, 952 insertions(+), 298 deletions(-) create mode 100644 R/cpp11.R create mode 100644 src/cpp11.cpp delete mode 100644 src/init.c diff --git a/DESCRIPTION b/DESCRIPTION index cf15f0a4..20736e93 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -42,6 +42,7 @@ SystemRequirements: libxml2: libxml2-dev (deb), libxml2-devel (rpm) Collate: 'S4.R' 'as_list.R' + 'cpp11.R' 'xml_parse.R' 'as_xml_document.R' 'classes.R' diff --git a/R/as_xml_document.R b/R/as_xml_document.R index 2b147c32..fad529fb 100644 --- a/R/as_xml_document.R +++ b/R/as_xml_document.R @@ -46,7 +46,7 @@ as_xml_document.list <- function(x, ...) { add_node <- function(x, parent, tag = NULL) { if (is.atomic(x)) { - return(.Call(node_new_text, parent$node, as.character(x))) + return(node_new_text(parent$node, as.character(x))) } if (!is.null(tag)) { parent <- xml_add_child(parent, tag) diff --git a/R/cpp11.R b/R/cpp11.R new file mode 100644 index 00000000..c68ceef9 --- /dev/null +++ b/R/cpp11.R @@ -0,0 +1,253 @@ +# Generated by cpp11: do not edit by hand + +read_connection_ <- function(con_sxp, read_size_sxp) { + .Call(`_xml2_read_connection_`, con_sxp, read_size_sxp) +} + +xml_parse_options_ <- function() { + .Call(`_xml2_xml_parse_options_`) +} + +doc_parse_file <- function(path_sxp, encoding_sxp, as_html_sxp, options_sxp) { + .Call(`_xml2_doc_parse_file`, path_sxp, encoding_sxp, as_html_sxp, options_sxp) +} + +doc_parse_raw <- function(x, encoding_sxp, base_url_sxp, as_html_sxp, options_sxp) { + .Call(`_xml2_doc_parse_raw`, x, encoding_sxp, base_url_sxp, as_html_sxp, options_sxp) +} + +doc_root <- function(x) { + .Call(`_xml2_doc_root`, x) +} + +doc_has_root <- function(x_sxp) { + .Call(`_xml2_doc_has_root`, x_sxp) +} + +doc_url <- function(doc_sxp) { + .Call(`_xml2_doc_url`, doc_sxp) +} + +doc_new <- function(version_sxp, encoding_sxp) { + .Call(`_xml2_doc_new`, version_sxp, encoding_sxp) +} + +doc_set_root <- function(doc_sxp, root_sxp) { + .Call(`_xml2_doc_set_root`, doc_sxp, root_sxp) +} + +doc_is_html <- function(doc_sxp) { + .Call(`_xml2_doc_is_html`, doc_sxp) +} + +init_libxml2 <- function() { + .Call(`_xml2_init_libxml2`) +} + +libxml2_version_ <- function() { + .Call(`_xml2_libxml2_version_`) +} + +unique_ns <- function(ns) { + .Call(`_xml2_unique_ns`, ns) +} + +doc_namespaces <- function(doc_sxp) { + .Call(`_xml2_doc_namespaces`, doc_sxp) +} + +ns_lookup_uri <- function(doc_sxp, node_sxp, uri_sxp) { + .Call(`_xml2_ns_lookup_uri`, doc_sxp, node_sxp, uri_sxp) +} + +ns_lookup <- function(doc_sxp, node_sxp, prefix_sxp) { + .Call(`_xml2_ns_lookup`, doc_sxp, node_sxp, prefix_sxp) +} + +node_name <- function(node_sxp, nsMap) { + .Call(`_xml2_node_name`, node_sxp, nsMap) +} + +node_set_name <- function(node_sxp, value) { + .Call(`_xml2_node_set_name`, node_sxp, value) +} + +node_text <- function(node_sxp) { + .Call(`_xml2_node_text`, node_sxp) +} + +node_attr <- function(node_sxp, name_sxp, missing_sxp, nsMap_sxp) { + .Call(`_xml2_node_attr`, node_sxp, name_sxp, missing_sxp, nsMap_sxp) +} + +node_attrs <- function(node_sxp, nsMap_sxp) { + .Call(`_xml2_node_attrs`, node_sxp, nsMap_sxp) +} + +node_set_attr <- function(node_sxp, name_sxp, value, nsMap) { + .Call(`_xml2_node_set_attr`, node_sxp, name_sxp, value, nsMap) +} + +node_remove_attr <- function(node_sxp, name_sxp, nsMap) { + .Call(`_xml2_node_remove_attr`, node_sxp, name_sxp, nsMap) +} + +node_children <- function(node_sxp, only_node_sxp) { + .Call(`_xml2_node_children`, node_sxp, only_node_sxp) +} + +node_length <- function(node_sxp, only_node_sxp) { + .Call(`_xml2_node_length`, node_sxp, only_node_sxp) +} + +node_has_children <- function(node_sxp, only_node_sxp) { + .Call(`_xml2_node_has_children`, node_sxp, only_node_sxp) +} + +node_parents <- function(node_sxp) { + .Call(`_xml2_node_parents`, node_sxp) +} + +node_siblings <- function(node_sxp, only_node_sxp) { + .Call(`_xml2_node_siblings`, node_sxp, only_node_sxp) +} + +node_parent <- function(node_sxp) { + .Call(`_xml2_node_parent`, node_sxp) +} + +node_path <- function(node_sxp) { + .Call(`_xml2_node_path`, node_sxp) +} + +nodes_duplicated <- function(nodes) { + .Call(`_xml2_nodes_duplicated`, nodes) +} + +node_type <- function(node_sxp) { + .Call(`_xml2_node_type`, node_sxp) +} + +node_copy <- function(node_sxp) { + .Call(`_xml2_node_copy`, node_sxp) +} + +node_set_content <- function(node_sxp, content) { + .Call(`_xml2_node_set_content`, node_sxp, content) +} + +node_append_content <- function(node_sxp, content) { + .Call(`_xml2_node_append_content`, node_sxp, content) +} + +node_new_text <- function(node_sxp, content) { + .Call(`_xml2_node_new_text`, node_sxp, content) +} + +node_append_child <- function(parent_sxp, cur_sxp) { + .Call(`_xml2_node_append_child`, parent_sxp, cur_sxp) +} + +node_prepend_child <- function(parent_sxp, cur_sxp) { + .Call(`_xml2_node_prepend_child`, parent_sxp, cur_sxp) +} + +node_prepend_sibling <- function(cur_sxp, elem_sxp) { + .Call(`_xml2_node_prepend_sibling`, cur_sxp, elem_sxp) +} + +node_append_sibling <- function(cur_sxp, elem_sxp) { + .Call(`_xml2_node_append_sibling`, cur_sxp, elem_sxp) +} + +node_replace <- function(old_sxp, cur_sxp) { + .Call(`_xml2_node_replace`, old_sxp, cur_sxp) +} + +node_remove <- function(node_sxp, free_sxp) { + .Call(`_xml2_node_remove`, node_sxp, free_sxp) +} + +node_new <- function(name) { + .Call(`_xml2_node_new`, name) +} + +node_cdata_new <- function(doc_sxp, content_sxp) { + .Call(`_xml2_node_cdata_new`, doc_sxp, content_sxp) +} + +node_comment_new <- function(content) { + .Call(`_xml2_node_comment_new`, content) +} + +node_new_ns <- function(name, ns_sxp) { + .Call(`_xml2_node_new_ns`, name, ns_sxp) +} + +node_set_namespace_uri <- function(doc_sxp, node_sxp, uri) { + .Call(`_xml2_node_set_namespace_uri`, doc_sxp, node_sxp, uri) +} + +node_set_namespace_prefix <- function(doc_sxp, node_sxp, prefix_sxp) { + .Call(`_xml2_node_set_namespace_prefix`, doc_sxp, node_sxp, prefix_sxp) +} + +node_new_dtd <- function(doc_sxp, name_sxp, eid_sxp, sid_sxp) { + .Call(`_xml2_node_new_dtd`, doc_sxp, name_sxp, eid_sxp, sid_sxp) +} + +xml_save_options_ <- function() { + .Call(`_xml2_xml_save_options_`) +} + +doc_write_file <- function(doc_sxp, path_sxp, encoding_sxp, options_sxp) { + .Call(`_xml2_doc_write_file`, doc_sxp, path_sxp, encoding_sxp, options_sxp) +} + +doc_write_connection <- function(doc_sxp, connection, encoding_sxp, options_sxp) { + .Call(`_xml2_doc_write_connection`, doc_sxp, connection, encoding_sxp, options_sxp) +} + +doc_write_character <- function(doc_sxp, encoding_sxp, options_sxp) { + .Call(`_xml2_doc_write_character`, doc_sxp, encoding_sxp, options_sxp) +} + +node_write_file <- function(node_sxp, path_sxp, encoding_sxp, options_sxp) { + .Call(`_xml2_node_write_file`, node_sxp, path_sxp, encoding_sxp, options_sxp) +} + +node_write_connection <- function(node_sxp, connection, encoding_sxp, options_sxp) { + .Call(`_xml2_node_write_connection`, node_sxp, connection, encoding_sxp, options_sxp) +} + +node_write_character <- function(node_sxp, encoding_sxp, options_sxp) { + .Call(`_xml2_node_write_character`, node_sxp, encoding_sxp, options_sxp) +} + +doc_validate <- function(doc_sxp, schema_sxp) { + .Call(`_xml2_doc_validate`, doc_sxp, schema_sxp) +} + +url_absolute_ <- function(x_sxp, base_sxp) { + .Call(`_xml2_url_absolute_`, x_sxp, base_sxp) +} + +url_relative_ <- function(x_sxp, base_sxp) { + .Call(`_xml2_url_relative_`, x_sxp, base_sxp) +} + +url_parse_ <- function(x_sxp) { + .Call(`_xml2_url_parse_`, x_sxp) +} + +url_escape_ <- function(x_sxp, reserved_sxp) { + .Call(`_xml2_url_escape_`, x_sxp, reserved_sxp) +} + +url_unescape_ <- function(x_sxp) { + .Call(`_xml2_url_unescape_`, x_sxp) +} + +xpath_search <- function(node_sxp, doc_sxp, xpath_sxp, nsMap_sxp, num_results_sxp) { + .Call(`_xml2_xpath_search`, node_sxp, doc_sxp, xpath_sxp, nsMap_sxp, num_results_sxp) +} diff --git a/R/init.R b/R/init.R index b137315b..39b3157b 100644 --- a/R/init.R +++ b/R/init.R @@ -1,15 +1,15 @@ .onLoad <- function(lib, pkg) { - .Call(init_libxml2) + init_libxml2() } libxml2_version <- function() { - as.numeric_version(.Call(libxml2_version_)) + as.numeric_version(libxml2_version_()) } xml_parse_options <- function() { - .Call(xml_parse_options_) + xml_parse_options_() } xml_save_options <- function() { - .Call(xml_save_options_) + xml_save_options_() } diff --git a/R/xml_attr.R b/R/xml_attr.R index 1f2a2fca..da3a123b 100644 --- a/R/xml_attr.R +++ b/R/xml_attr.R @@ -71,7 +71,7 @@ xml_attr.xml_missing <- function(x, attr, ns = character(), default = NA_charact #' @export xml_attr.xml_node <- function(x, attr, ns = character(), default = NA_character_) { - .Call(node_attr, x$node, attr, as.character(default), ns) + node_attr(x$node, attr, as.character(default), ns) } #' @export @@ -106,7 +106,7 @@ xml_attrs.xml_missing <- function(x, ns = character()) { #' @export xml_attrs.xml_node <- function(x, ns = character()) { - .Call(node_attrs, x$node, nsMap = ns) + node_attrs(x$node, nsMap_sxp = ns) } #' @export @@ -124,10 +124,10 @@ xml_attrs.xml_nodeset <- function(x, ns = character()) { #' @export `xml_attr<-.xml_node` <- function(x, attr, ns = character(), value) { if (is.null(value)) { - .Call(node_remove_attr, x$node, attr, ns) + node_remove_attr(x$node, attr, ns) } else { value <- as.character(value) - .Call(node_set_attr, x$node, attr, value, ns) + node_set_attr(x$node, attr, value, ns) } x } diff --git a/R/xml_children.R b/R/xml_children.R index 56f424a7..0ee34211 100644 --- a/R/xml_children.R +++ b/R/xml_children.R @@ -38,7 +38,7 @@ #' xml_child(x, 2) #' xml_child(x, "baz") xml_children <- function(x) { - nodeset_apply(x, function(x) .Call(node_children, x, TRUE)) + nodeset_apply(x, function(x) node_children(x, TRUE)) } #' @export @@ -60,19 +60,19 @@ xml_child <- function(x, search = 1, ns = xml_ns(x)) { #' @export #' @rdname xml_children xml_contents <- function(x) { - nodeset_apply(x, function(x) .Call(node_children, x, FALSE)) + nodeset_apply(x, function(x) node_children(x, FALSE)) } #' @export #' @rdname xml_children xml_parents <- function(x) { - nodeset_apply(x, function(x) .Call(node_parents, x)) + nodeset_apply(x, function(x) node_parents(x)) } #' @export #' @rdname xml_children xml_siblings <- function(x) { - nodeset_apply(x, function(x) .Call(node_siblings, x, TRUE)) + nodeset_apply(x, function(x) node_siblings(x, TRUE)) } #' @export @@ -88,12 +88,12 @@ xml_parent.xml_missing <- function(x) { #' @export xml_parent.xml_node <- function(x) { - xml_node(.Call(node_parent, x$node), x$doc) + xml_node(node_parent(x$node), x$doc) } #' @export xml_parent.xml_nodeset <- function(x) { - nodeset_apply(x, function(x) .Call(node_parent, x)) + nodeset_apply(x, function(x) node_parent(x)) } @@ -110,7 +110,7 @@ xml_length.xml_missing <- function(x, only_elements = TRUE) { #' @export xml_length.xml_node <- function(x, only_elements = TRUE) { - .Call(node_length, x$node, only_elements) + node_length(x$node, only_elements) } #' @export @@ -134,7 +134,7 @@ xml_root <- function(x) { return(xml_root(x[[1]])) } } - if (!.Call(doc_has_root, x$doc)) { + if (!doc_has_root(x$doc)) { xml_missing() } else { xml_document(x$doc) diff --git a/R/xml_document.R b/R/xml_document.R index 527524bc..f15fc590 100644 --- a/R/xml_document.R +++ b/R/xml_document.R @@ -1,6 +1,6 @@ xml_document <- function(doc) { - if (.Call(doc_has_root, doc)) { - x <- xml_node(.Call(doc_root, doc), doc) + if (doc_has_root(doc)) { + x <- xml_node(doc_root(doc), doc) class(x) <- c("xml_document", class(x)) x } else { @@ -14,7 +14,7 @@ doc_type <- function(x) { if (is.null(x$doc)) { return("xml") } - if (.Call(doc_is_html, x$doc)) { + if (doc_is_html(x$doc)) { "html" } else { "xml" @@ -34,5 +34,5 @@ print.xml_document <- function(x, width = getOption("width"), max_n = 20, ...) { #' @export as.character.xml_document <- function(x, ..., options = "format", encoding = "UTF-8") { options <- parse_options(options, xml_save_options()) - .Call(doc_write_character, x$doc, encoding, options) + doc_write_character(x$doc, encoding, options) } diff --git a/R/xml_find.R b/R/xml_find.R index 4dac21cb..84ce7d8a 100644 --- a/R/xml_find.R +++ b/R/xml_find.R @@ -85,7 +85,7 @@ xml_find_all.xml_missing <- function(x, xpath, ns = xml_ns(x), ...) { #' @export xml_find_all.xml_node <- function(x, xpath, ns = xml_ns(x), ...) { - nodes <- .Call(xpath_search, x$node, x$doc, xpath, ns, Inf) + nodes <- xpath_search(x$node, x$doc, xpath, ns, Inf) xml_nodeset(nodes) } @@ -98,7 +98,7 @@ xml_find_all.xml_nodeset <- function(x, xpath, ns = xml_ns(x), flatten = TRUE, . return(xml_nodeset()) } - res <- lapply(x, function(x) .Call(xpath_search, x$node, x$doc, xpath, ns, Inf)) + res <- lapply(x, function(x) xpath_search(x$node, x$doc, xpath, ns, Inf)) if (isTRUE(flatten)) { return(xml_nodeset(unlist(recursive = FALSE, res))) @@ -121,7 +121,7 @@ xml_find_first.xml_missing <- function(x, xpath, ns = xml_ns(x)) { #' @export xml_find_first.xml_node <- function(x, xpath, ns = xml_ns(x)) { - res <- .Call(xpath_search, x$node, x$doc, xpath, ns, 1) + res <- xpath_search(x$node, x$doc, xpath, ns, 1) if (length(res) == 1) { res[[1]] } else { @@ -155,7 +155,7 @@ xml_find_num <- function(x, xpath, ns = xml_ns(x)) { #' @export xml_find_num.xml_node <- function(x, xpath, ns = xml_ns(x)) { - res <- .Call(xpath_search, x$node, x$doc, xpath, ns, Inf) + res <- xpath_search(x$node, x$doc, xpath, ns, Inf) if (is.numeric(res) && is.nan(res)) { return(res) } @@ -186,7 +186,7 @@ xml_find_chr <- function(x, xpath, ns = xml_ns(x)) { #' @export xml_find_chr.xml_node <- function(x, xpath, ns = xml_ns(x)) { - res <- .Call(xpath_search, x$node, x$doc, xpath, ns, Inf) + res <- xpath_search(x$node, x$doc, xpath, ns, Inf) check_string(res, arg = I(paste0("Element at path `", xpath, "`"))) res } @@ -213,7 +213,7 @@ xml_find_lgl <- function(x, xpath, ns = xml_ns(x)) { #' @export xml_find_lgl.xml_node <- function(x, xpath, ns = xml_ns(x)) { - res <- .Call(xpath_search, x$node, x$doc, xpath, ns, Inf) + res <- xpath_search(x$node, x$doc, xpath, ns, Inf) check_bool(res, arg = I(paste0("Element at path `", xpath, "`"))) res } diff --git a/R/xml_modify.R b/R/xml_modify.R index 7411f836..fb28346f 100644 --- a/R/xml_modify.R +++ b/R/xml_modify.R @@ -29,7 +29,7 @@ xml_replace <- function(.x, .value, ..., .copy = TRUE) { xml_replace.xml_node <- function(.x, .value, ..., .copy = TRUE) { node <- create_node(.value, .parent = .x, .copy = .copy, ...) - .x$node <- .Call(node_replace, .x$node, node$node) + .x$node <- node_replace(.x$node, node$node) node } @@ -65,8 +65,8 @@ xml_add_sibling.xml_node <- function(.x, .value, ..., .where = c("after", "befor node <- create_node(.value, .parent = .x, .copy = .copy, ...) .x$node <- switch(.where, - before = .Call(node_prepend_sibling, .x$node, node$node), - after = .Call(node_append_sibling, .x$node, node$node) + before = node_prepend_sibling(.x$node, node$node), + after = node_append_sibling(.x$node, node$node) ) invisible(.x) @@ -97,21 +97,21 @@ xml_add_sibling.xml_missing <- function(.x, .value, ..., .where = c("after", "be create_node <- function(.value, ..., .parent, .copy) { if (inherits(.value, "xml_node")) { if (isTRUE(.copy)) { - .value$node <- .Call(node_copy, .value$node) + .value$node <- node_copy(.value$node) } return(.value) } if (inherits(.value, "xml_cdata")) { - return(xml_node(.Call(node_cdata_new, .parent$doc, .value), doc = .parent$doc)) + return(xml_node(node_cdata_new(.parent$doc, .value), doc = .parent$doc)) } if (inherits(.value, "xml_comment")) { - return(xml_node(.Call(node_comment_new, .value), doc = .parent$doc)) + return(xml_node(node_comment_new(.value), doc = .parent$doc)) } if (inherits(.value, "xml_dtd")) { - .Call(node_new_dtd, .parent$doc, .value$name, .value$external_id, .value$system_id) + node_new_dtd(.parent$doc, .value$name, .value$external_id, .value$system_id) return() } @@ -119,10 +119,10 @@ create_node <- function(.value, ..., .parent, .copy) { parts <- strsplit(.value, ":")[[1]] if (length(parts) == 2 && !is.null(.parent$node)) { - namespace <- .Call(ns_lookup, .parent$doc, .parent$node, parts[[1]]) - node <- list(node = .Call(node_new_ns, parts[[2]], namespace), doc = .parent$doc) + namespace <- ns_lookup(.parent$doc, .parent$node, parts[[1]]) + node <- list(node = node_new_ns(parts[[2]], namespace), doc = .parent$doc) } else { - node <- list(node = .Call(node_new, .value), doc = .parent$doc) + node <- list(node = node_new(.value), doc = .parent$doc) } class(node) <- "xml_node" @@ -145,17 +145,17 @@ xml_add_child.xml_node <- function(.x, .value, ..., .where = length(xml_children node <- create_node(.value, .parent = .x, .copy = .copy, ...) if (.where == 0L) { - if (.Call(node_has_children, .x$node, TRUE)) { - .Call(node_prepend_child, .x$node, node$node) + if (node_has_children(.x$node, TRUE)) { + node_prepend_child(.x$node, node$node) } else { - .Call(node_append_child, .x$node, node$node) + node_append_child(.x$node, node$node) } } else { num_children <- length(xml_children(.x)) if (.where >= num_children) { - .Call(node_append_child, .x$node, node$node) + node_append_child(.x$node, node$node) } else { - .Call(node_append_sibling, xml_child(.x, search = .where)$node, node$node) + node_append_sibling(xml_child(.x, search = .where)$node, node$node) } } @@ -169,10 +169,10 @@ xml_add_child.xml_document <- function(.x, .value, ..., .where = length(xml_chil } else { node <- create_node(.value, .parent = .x, .copy = .copy, ...) if (!is.null(node)) { - if (!.Call(doc_has_root, .x$doc)) { - .Call(doc_set_root, .x$doc, node$node) + if (!doc_has_root(.x$doc)) { + doc_set_root(.x$doc, node$node) } - .Call(node_append_child, .Call(doc_root, .x$doc), node$node) + node_append_child(doc_root(.x$doc), node$node) } invisible(xml_document(.x$doc)) } @@ -240,7 +240,7 @@ xml_remove <- function(.x, free = FALSE) { #' @export xml_remove.xml_node <- function(.x, free = FALSE) { - .Call(node_remove, .x$node, free) + node_remove(.x$node, free) invisible(.x) } @@ -272,9 +272,9 @@ xml_set_namespace <- function(.x, prefix = "", uri = "") { stopifnot(inherits(.x, "xml_node")) if (nzchar(uri)) { - .Call(node_set_namespace_uri, .x$doc, .x$node, uri) + node_set_namespace_uri(.x$doc, .x$node, uri) } else { - .Call(node_set_namespace_prefix, .x$doc, .x$node, prefix) + node_set_namespace_prefix(.x$doc, .x$node, prefix) } invisible(.x) } @@ -292,7 +292,7 @@ xml_set_namespace <- function(.x, prefix = "", uri = "") { #' @export # TODO: jimhester 2016-12-16 Deprecate this in the future? xml_new_document <- function(version = "1.0", encoding = "UTF-8") { - doc <- .Call(doc_new, version, encoding) + doc <- doc_new(version, encoding) out <- list(doc = doc) class(out) <- "xml_document" out diff --git a/R/xml_name.R b/R/xml_name.R index a849be90..bc185420 100644 --- a/R/xml_name.R +++ b/R/xml_name.R @@ -33,7 +33,7 @@ xml_name.xml_nodeset <- function(x, ns = character()) { #' @export xml_name.xml_node <- function(x, ns = character()) { - .Call(node_name, x$node, ns) + node_name(x$node, ns) } #' Modify the (tag) name of an element @@ -47,7 +47,7 @@ xml_name.xml_node <- function(x, ns = character()) { #' @export `xml_name<-.xml_node` <- function(x, ns = character(), value) { - .Call(node_set_name, x$node, value) + node_set_name(x$node, value) x } diff --git a/R/xml_namespaces.R b/R/xml_namespaces.R index 78c289c7..de9b77e2 100644 --- a/R/xml_namespaces.R +++ b/R/xml_namespaces.R @@ -48,7 +48,7 @@ xml_ns.xml_document <- function(x) { stopifnot(inherits(x, "xml_document")) doc <- x$doc - x <- .Call(doc_namespaces, doc) + x <- doc_namespaces(doc) # Number default namespaces is_default <- names(x) == "" diff --git a/R/xml_node.R b/R/xml_node.R index aedaad13..91631afc 100644 --- a/R/xml_node.R +++ b/R/xml_node.R @@ -13,7 +13,7 @@ xml_node <- function(node = NULL, doc = NULL) { #' @export as.character.xml_node <- function(x, ..., options = "format", encoding = "UTF-8") { options <- parse_options(options, xml_save_options()) - .Call(node_write_character, x$node, encoding, options) + node_write_character(x$node, encoding, options) } #' @export diff --git a/R/xml_nodeset.R b/R/xml_nodeset.R index f899d9dd..16192137 100644 --- a/R/xml_nodeset.R +++ b/R/xml_nodeset.R @@ -1,6 +1,6 @@ xml_nodeset <- function(nodes = list(), deduplicate = TRUE) { if (isTRUE(deduplicate)) { - nodes <- nodes[!.Call(nodes_duplicated, nodes)] + nodes <- nodes[!nodes_duplicated(nodes)] } class(nodes) <- "xml_nodeset" nodes diff --git a/R/xml_parse.R b/R/xml_parse.R index faa92e05..b2448b51 100644 --- a/R/xml_parse.R +++ b/R/xml_parse.R @@ -117,9 +117,11 @@ read_xml.character <- function(x, base_url = x, options = options ) } else { - doc <- .Call(doc_parse_file, con, - encoding = encoding, as_html = as_html, - options = options + doc <- doc_parse_file( + con, + encoding_sxp = encoding, + as_html_sxp = as_html, + options_sxp = options ) xml_document(doc) } @@ -136,7 +138,7 @@ read_xml.raw <- function(x, options = "NOBLANKS") { options <- parse_options(options, xml_parse_options()) - doc <- .Call(doc_parse_raw, x, encoding, base_url, as_html, options) + doc <- doc_parse_raw(x, encoding, base_url, as_html, options) xml_document(doc) } @@ -157,7 +159,7 @@ read_xml.connection <- function(x, on.exit(close(x)) } - raw <- .Call(read_connection_, x, n) + raw <- read_connection_(x, n) read_xml.raw(raw, encoding = encoding, base_url = base_url, as_html = as_html, options = options diff --git a/R/xml_path.R b/R/xml_path.R index 79f34d9e..973c6d11 100644 --- a/R/xml_path.R +++ b/R/xml_path.R @@ -20,7 +20,7 @@ xml_path.xml_missing <- function(x) { #' @export xml_path.xml_node <- function(x) { - .Call(node_path, x$node) + node_path(x$node) } #' @export diff --git a/R/xml_schema.R b/R/xml_schema.R index 75c92a31..84a934fb 100644 --- a/R/xml_schema.R +++ b/R/xml_schema.R @@ -17,5 +17,5 @@ xml_validate <- function(x, schema) { #' @export xml_validate.xml_document <- function(x, schema) { stopifnot(inherits(schema, "xml_document")) - .Call(doc_validate, x$doc, schema$doc) + doc_validate(x$doc, schema$doc) } diff --git a/R/xml_text.R b/R/xml_text.R index 0aad2974..4689f2df 100644 --- a/R/xml_text.R +++ b/R/xml_text.R @@ -32,7 +32,7 @@ xml_text.xml_missing <- function(x, trim = FALSE) { #' @export xml_text.xml_node <- function(x, trim = FALSE) { - res <- .Call(node_text, x$node) + res <- node_text(x$node) if (isTRUE(trim)) { res <- sub("^[[:space:]\u00a0]+", "", res) res <- sub("[[:space:]\u00a0]+$", "", res) @@ -71,12 +71,12 @@ xml_text.xml_nodeset <- function(x, trim = FALSE) { if (xml_type(x) != "text") { text_child <- xml_find_first(x, ".//text()[1]", ns = character()) if (inherits(text_child, "xml_missing")) { - .Call(node_append_content, x$node, value) + node_append_content(x$node, value) } else { - .Call(node_set_content, text_child$node, value) + node_set_content(text_child$node, value) } } else { - .Call(node_set_content, x$node, value) + node_set_content(x$node, value) } x diff --git a/R/xml_type.R b/R/xml_type.R index f957d759..5fdaabe3 100644 --- a/R/xml_type.R +++ b/R/xml_type.R @@ -17,12 +17,12 @@ xml_type.xml_missing <- function(x) { #' @export xml_type.xml_node <- function(x) { - xmlElementType[.Call(node_type, x$node)] + xmlElementType[node_type(x$node)] } #' @export xml_type.xml_nodeset <- function(x) { - types <- vapply(x, function(x) .Call(node_type, x$node), integer(1)) + types <- vapply(x, function(x) node_type(x$node), integer(1)) xmlElementType[types] } diff --git a/R/xml_url.R b/R/xml_url.R index 8ee6cb0a..e5c3f96e 100644 --- a/R/xml_url.R +++ b/R/xml_url.R @@ -23,12 +23,12 @@ xml_url.xml_missing <- function(x) { #' @export xml_url.xml_node <- function(x) { - .Call(doc_url, x$doc) + doc_url(x$doc) } #' @export xml_url.xml_nodeset <- function(x) { - vapply(x, function(x) .Call(doc_url, x), character(1)) + vapply(x, function(x) doc_url(x), character(1)) } #' Convert between relative and absolute urls. @@ -47,13 +47,13 @@ xml_url.xml_nodeset <- function(x) { #' url_relative("http://hadley.nz/a/c", "http://hadley.nz/a/b/") #' @export url_absolute <- function(x, base) { - .Call(url_absolute_, x, base) + url_absolute_(x, base) } #' @rdname url_absolute #' @export url_relative <- function(x, base) { - .Call(url_relative_, x, base) + url_relative_(x, base) } #' Escape and unescape urls. @@ -68,13 +68,13 @@ url_relative <- function(x, base) { #' url_unescape("a%20b%2fc") #' url_unescape("%C2%B5") url_escape <- function(x, reserved = "") { - .Call(url_escape_, x, reserved) + url_escape_(x, reserved) } #' @rdname url_escape #' @export url_unescape <- function(x) { - .Call(url_unescape_, x) + url_unescape_(x) } #' Parse a url into its component pieces. @@ -89,5 +89,5 @@ url_unescape <- function(x) { #' url_parse("http://had.co.nz:1234/?a=1&b=2") #' url_parse("http://had.co.nz:1234/?a=1&b=2#def") url_parse <- function(x) { - .Call(url_parse_, x) + url_parse_(x) } diff --git a/R/xml_write.R b/R/xml_write.R index 35448f1c..39bd9e95 100644 --- a/R/xml_write.R +++ b/R/xml_write.R @@ -44,10 +44,10 @@ write_xml.xml_document <- function(x, file, ..., options = "format", encoding = open(file, "wb") on.exit(close(file)) } - .Call(doc_write_connection, x$doc, file, encoding, options) + doc_write_connection(x$doc, file, encoding, options) } else { check_string(file) - .Call(doc_write_file, x$doc, file, encoding, options) + doc_write_file(x$doc, file, encoding, options) } invisible() @@ -67,10 +67,10 @@ write_xml.xml_nodeset <- function(x, file, ..., options = "format", encoding = " open(file, "wb") on.exit(close(file)) } - .Call(node_write_connection, x[[1]]$node, file, encoding, options) + node_write_connection(x[[1]]$node, file, encoding, options) } else { check_string(file) - .Call(node_write_file, x[[1]]$node, file, encoding, options) + node_write_file(x[[1]]$node, file, encoding, options) } invisible() @@ -86,10 +86,10 @@ write_xml.xml_node <- function(x, file, ..., options = "format", encoding = "UTF open(file, "wb") on.exit(close(file)) } - .Call(node_write_connection, x$node, file, encoding, options) + node_write_connection(x$node, file, encoding, options) } else { check_string(file) - .Call(node_write_file, x$node, file, encoding, options) + node_write_file(x$node, file, encoding, options) } invisible() diff --git a/inst/include/xml2_types.h b/inst/include/xml2_types.h index c83f18d1..b5c12e32 100644 --- a/inst/include/xml2_types.h +++ b/inst/include/xml2_types.h @@ -1,6 +1,8 @@ #ifndef __XML2_XML2_TYPES__ #define __XML2_XML2_TYPES__ +#include + #include #define R_NO_REMAP #include @@ -21,12 +23,12 @@ template class XPtr { data_ = R_MakeExternalPtr((void *) p, R_NilValue, R_NilValue); R_PreserveObject(data_); } - + XPtr(const XPtr &old) { data_ = old.data_; R_PreserveObject(data_); } - + XPtr& operator=(const XPtr &other) { R_PreserveObject(other.data_); if (data_ != NULL) { diff --git a/src/connection.cpp b/src/connection.cpp index 736ada94..a1a18f4b 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -1,3 +1,5 @@ +#include + #define R_NO_REMAP #include #undef R_NO_REMAP @@ -29,7 +31,7 @@ SEXP write_bin(SEXP data, SEXP con) { // Read data from a connection in chunks and then combine into a single // raw vector. // -// [[export]] +[[cpp11::register]] extern "C" SEXP read_connection_(SEXP con_sxp, SEXP read_size_sxp) { BEGIN_CPP diff --git a/src/connection.h b/src/connection.h index 41b400a4..19e2de68 100644 --- a/src/connection.h +++ b/src/connection.h @@ -1,5 +1,7 @@ #pragma once +#include + #define R_NO_REMAP #include #undef R_NO_REMAP diff --git a/src/cpp11.cpp b/src/cpp11.cpp new file mode 100644 index 00000000..9bc14243 --- /dev/null +++ b/src/cpp11.cpp @@ -0,0 +1,523 @@ +// Generated by cpp11: do not edit by hand +// clang-format off + +#include "xml2_types.h" +#include "cpp11/declarations.hpp" +#include + +// connection.cpp +extern "C" SEXP read_connection_(SEXP con_sxp, SEXP read_size_sxp); +extern "C" SEXP _xml2_read_connection_(SEXP con_sxp, SEXP read_size_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(read_connection_(cpp11::as_cpp>(con_sxp), cpp11::as_cpp>(read_size_sxp))); + END_CPP11 +} +// xml2_doc.cpp +extern "C" SEXP xml_parse_options_(); +extern "C" SEXP _xml2_xml_parse_options_() { + BEGIN_CPP11 + return cpp11::as_sexp(xml_parse_options_()); + END_CPP11 +} +// xml2_doc.cpp +extern "C" SEXP doc_parse_file(SEXP path_sxp, SEXP encoding_sxp, SEXP as_html_sxp, SEXP options_sxp); +extern "C" SEXP _xml2_doc_parse_file(SEXP path_sxp, SEXP encoding_sxp, SEXP as_html_sxp, SEXP options_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(doc_parse_file(cpp11::as_cpp>(path_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(as_html_sxp), cpp11::as_cpp>(options_sxp))); + END_CPP11 +} +// xml2_doc.cpp +extern "C" SEXP doc_parse_raw(SEXP x, SEXP encoding_sxp, SEXP base_url_sxp, SEXP as_html_sxp, SEXP options_sxp); +extern "C" SEXP _xml2_doc_parse_raw(SEXP x, SEXP encoding_sxp, SEXP base_url_sxp, SEXP as_html_sxp, SEXP options_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(doc_parse_raw(cpp11::as_cpp>(x), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(base_url_sxp), cpp11::as_cpp>(as_html_sxp), cpp11::as_cpp>(options_sxp))); + END_CPP11 +} +// xml2_doc.cpp +extern "C" SEXP doc_root(SEXP x); +extern "C" SEXP _xml2_doc_root(SEXP x) { + BEGIN_CPP11 + return cpp11::as_sexp(doc_root(cpp11::as_cpp>(x))); + END_CPP11 +} +// xml2_doc.cpp +extern "C" SEXP doc_has_root(SEXP x_sxp); +extern "C" SEXP _xml2_doc_has_root(SEXP x_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(doc_has_root(cpp11::as_cpp>(x_sxp))); + END_CPP11 +} +// xml2_doc.cpp +extern "C" SEXP doc_url(SEXP doc_sxp); +extern "C" SEXP _xml2_doc_url(SEXP doc_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(doc_url(cpp11::as_cpp>(doc_sxp))); + END_CPP11 +} +// xml2_doc.cpp +extern "C" SEXP doc_new(SEXP version_sxp, SEXP encoding_sxp); +extern "C" SEXP _xml2_doc_new(SEXP version_sxp, SEXP encoding_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(doc_new(cpp11::as_cpp>(version_sxp), cpp11::as_cpp>(encoding_sxp))); + END_CPP11 +} +// xml2_doc.cpp +extern "C" SEXP doc_set_root(SEXP doc_sxp, SEXP root_sxp); +extern "C" SEXP _xml2_doc_set_root(SEXP doc_sxp, SEXP root_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(doc_set_root(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(root_sxp))); + END_CPP11 +} +// xml2_doc.cpp +extern "C" SEXP doc_is_html(SEXP doc_sxp); +extern "C" SEXP _xml2_doc_is_html(SEXP doc_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(doc_is_html(cpp11::as_cpp>(doc_sxp))); + END_CPP11 +} +// xml2_init.cpp +extern "C" SEXP init_libxml2(); +extern "C" SEXP _xml2_init_libxml2() { + BEGIN_CPP11 + return cpp11::as_sexp(init_libxml2()); + END_CPP11 +} +// xml2_init.cpp +extern "C" SEXP libxml2_version_(); +extern "C" SEXP _xml2_libxml2_version_() { + BEGIN_CPP11 + return cpp11::as_sexp(libxml2_version_()); + END_CPP11 +} +// xml2_namespace.cpp +extern "C" SEXP unique_ns(SEXP ns); +extern "C" SEXP _xml2_unique_ns(SEXP ns) { + BEGIN_CPP11 + return cpp11::as_sexp(unique_ns(cpp11::as_cpp>(ns))); + END_CPP11 +} +// xml2_namespace.cpp +extern "C" SEXP doc_namespaces(SEXP doc_sxp); +extern "C" SEXP _xml2_doc_namespaces(SEXP doc_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(doc_namespaces(cpp11::as_cpp>(doc_sxp))); + END_CPP11 +} +// xml2_namespace.cpp +extern "C" SEXP ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp); +extern "C" SEXP _xml2_ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(ns_lookup_uri(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(uri_sxp))); + END_CPP11 +} +// xml2_namespace.cpp +extern "C" SEXP ns_lookup(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp); +extern "C" SEXP _xml2_ns_lookup(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(ns_lookup(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(prefix_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_name(SEXP node_sxp, SEXP nsMap); +extern "C" SEXP _xml2_node_name(SEXP node_sxp, SEXP nsMap) { + BEGIN_CPP11 + return cpp11::as_sexp(node_name(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(nsMap))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_set_name(SEXP node_sxp, SEXP value); +extern "C" SEXP _xml2_node_set_name(SEXP node_sxp, SEXP value) { + BEGIN_CPP11 + return cpp11::as_sexp(node_set_name(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(value))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_text(SEXP node_sxp); +extern "C" SEXP _xml2_node_text(SEXP node_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_text(cpp11::as_cpp>(node_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_attr(SEXP node_sxp, SEXP name_sxp, SEXP missing_sxp, SEXP nsMap_sxp); +extern "C" SEXP _xml2_node_attr(SEXP node_sxp, SEXP name_sxp, SEXP missing_sxp, SEXP nsMap_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_attr(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(missing_sxp), cpp11::as_cpp>(nsMap_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_attrs(SEXP node_sxp, SEXP nsMap_sxp); +extern "C" SEXP _xml2_node_attrs(SEXP node_sxp, SEXP nsMap_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_attrs(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(nsMap_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, SEXP nsMap); +extern "C" SEXP _xml2_node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, SEXP nsMap) { + BEGIN_CPP11 + return cpp11::as_sexp(node_set_attr(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(value), cpp11::as_cpp>(nsMap))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_remove_attr(SEXP node_sxp, SEXP name_sxp, SEXP nsMap); +extern "C" SEXP _xml2_node_remove_attr(SEXP node_sxp, SEXP name_sxp, SEXP nsMap) { + BEGIN_CPP11 + return cpp11::as_sexp(node_remove_attr(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(nsMap))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_children(SEXP node_sxp, SEXP only_node_sxp); +extern "C" SEXP _xml2_node_children(SEXP node_sxp, SEXP only_node_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_children(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_length(SEXP node_sxp, SEXP only_node_sxp); +extern "C" SEXP _xml2_node_length(SEXP node_sxp, SEXP only_node_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_length(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_has_children(SEXP node_sxp, SEXP only_node_sxp); +extern "C" SEXP _xml2_node_has_children(SEXP node_sxp, SEXP only_node_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_has_children(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_parents(SEXP node_sxp); +extern "C" SEXP _xml2_node_parents(SEXP node_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_parents(cpp11::as_cpp>(node_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_siblings(SEXP node_sxp, SEXP only_node_sxp); +extern "C" SEXP _xml2_node_siblings(SEXP node_sxp, SEXP only_node_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_siblings(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_parent(SEXP node_sxp); +extern "C" SEXP _xml2_node_parent(SEXP node_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_parent(cpp11::as_cpp>(node_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_path(SEXP node_sxp); +extern "C" SEXP _xml2_node_path(SEXP node_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_path(cpp11::as_cpp>(node_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP nodes_duplicated(SEXP nodes); +extern "C" SEXP _xml2_nodes_duplicated(SEXP nodes) { + BEGIN_CPP11 + return cpp11::as_sexp(nodes_duplicated(cpp11::as_cpp>(nodes))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_type(SEXP node_sxp); +extern "C" SEXP _xml2_node_type(SEXP node_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_type(cpp11::as_cpp>(node_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_copy(SEXP node_sxp); +extern "C" SEXP _xml2_node_copy(SEXP node_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_copy(cpp11::as_cpp>(node_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_set_content(SEXP node_sxp, SEXP content); +extern "C" SEXP _xml2_node_set_content(SEXP node_sxp, SEXP content) { + BEGIN_CPP11 + return cpp11::as_sexp(node_set_content(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(content))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_append_content(SEXP node_sxp, SEXP content); +extern "C" SEXP _xml2_node_append_content(SEXP node_sxp, SEXP content) { + BEGIN_CPP11 + return cpp11::as_sexp(node_append_content(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(content))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_new_text(SEXP node_sxp, SEXP content); +extern "C" SEXP _xml2_node_new_text(SEXP node_sxp, SEXP content) { + BEGIN_CPP11 + return cpp11::as_sexp(node_new_text(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(content))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_append_child(SEXP parent_sxp, SEXP cur_sxp); +extern "C" SEXP _xml2_node_append_child(SEXP parent_sxp, SEXP cur_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_append_child(cpp11::as_cpp>(parent_sxp), cpp11::as_cpp>(cur_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_prepend_child(SEXP parent_sxp, SEXP cur_sxp); +extern "C" SEXP _xml2_node_prepend_child(SEXP parent_sxp, SEXP cur_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_prepend_child(cpp11::as_cpp>(parent_sxp), cpp11::as_cpp>(cur_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp); +extern "C" SEXP _xml2_node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_prepend_sibling(cpp11::as_cpp>(cur_sxp), cpp11::as_cpp>(elem_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_append_sibling(SEXP cur_sxp, SEXP elem_sxp); +extern "C" SEXP _xml2_node_append_sibling(SEXP cur_sxp, SEXP elem_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_append_sibling(cpp11::as_cpp>(cur_sxp), cpp11::as_cpp>(elem_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_replace(SEXP old_sxp, SEXP cur_sxp); +extern "C" SEXP _xml2_node_replace(SEXP old_sxp, SEXP cur_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_replace(cpp11::as_cpp>(old_sxp), cpp11::as_cpp>(cur_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_remove(SEXP node_sxp, SEXP free_sxp); +extern "C" SEXP _xml2_node_remove(SEXP node_sxp, SEXP free_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_remove(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(free_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_new(SEXP name); +extern "C" SEXP _xml2_node_new(SEXP name) { + BEGIN_CPP11 + return cpp11::as_sexp(node_new(cpp11::as_cpp>(name))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_cdata_new(SEXP doc_sxp, SEXP content_sxp); +extern "C" SEXP _xml2_node_cdata_new(SEXP doc_sxp, SEXP content_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_cdata_new(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(content_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_comment_new(SEXP content); +extern "C" SEXP _xml2_node_comment_new(SEXP content) { + BEGIN_CPP11 + return cpp11::as_sexp(node_comment_new(cpp11::as_cpp>(content))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_new_ns(SEXP name, SEXP ns_sxp); +extern "C" SEXP _xml2_node_new_ns(SEXP name, SEXP ns_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_new_ns(cpp11::as_cpp>(name), cpp11::as_cpp>(ns_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri); +extern "C" SEXP _xml2_node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri) { + BEGIN_CPP11 + return cpp11::as_sexp(node_set_namespace_uri(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(uri))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp); +extern "C" SEXP _xml2_node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_set_namespace_prefix(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(prefix_sxp))); + END_CPP11 +} +// xml2_node.cpp +extern "C" SEXP node_new_dtd(SEXP doc_sxp, SEXP name_sxp, SEXP eid_sxp, SEXP sid_sxp); +extern "C" SEXP _xml2_node_new_dtd(SEXP doc_sxp, SEXP name_sxp, SEXP eid_sxp, SEXP sid_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_new_dtd(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(eid_sxp), cpp11::as_cpp>(sid_sxp))); + END_CPP11 +} +// xml2_output.cpp +extern "C" SEXP xml_save_options_(); +extern "C" SEXP _xml2_xml_save_options_() { + BEGIN_CPP11 + return cpp11::as_sexp(xml_save_options_()); + END_CPP11 +} +// xml2_output.cpp +extern "C" SEXP doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp); +extern "C" SEXP _xml2_doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(doc_write_file(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(path_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); + END_CPP11 +} +// xml2_output.cpp +extern "C" SEXP doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp); +extern "C" SEXP _xml2_doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(doc_write_connection(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(connection), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); + END_CPP11 +} +// xml2_output.cpp +extern "C" SEXP doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP options_sxp); +extern "C" SEXP _xml2_doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP options_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(doc_write_character(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); + END_CPP11 +} +// xml2_output.cpp +extern "C" SEXP node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp); +extern "C" SEXP _xml2_node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_write_file(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(path_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); + END_CPP11 +} +// xml2_output.cpp +extern "C" SEXP node_write_connection(SEXP node_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp); +extern "C" SEXP _xml2_node_write_connection(SEXP node_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_write_connection(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(connection), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); + END_CPP11 +} +// xml2_output.cpp +extern "C" SEXP node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEXP options_sxp); +extern "C" SEXP _xml2_node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEXP options_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(node_write_character(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); + END_CPP11 +} +// xml2_schema.cpp +extern "C" SEXP doc_validate(SEXP doc_sxp, SEXP schema_sxp); +extern "C" SEXP _xml2_doc_validate(SEXP doc_sxp, SEXP schema_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(doc_validate(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(schema_sxp))); + END_CPP11 +} +// xml2_url.cpp +extern "C" SEXP url_absolute_(SEXP x_sxp, SEXP base_sxp); +extern "C" SEXP _xml2_url_absolute_(SEXP x_sxp, SEXP base_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(url_absolute_(cpp11::as_cpp>(x_sxp), cpp11::as_cpp>(base_sxp))); + END_CPP11 +} +// xml2_url.cpp +extern "C" SEXP url_relative_(SEXP x_sxp, SEXP base_sxp); +extern "C" SEXP _xml2_url_relative_(SEXP x_sxp, SEXP base_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(url_relative_(cpp11::as_cpp>(x_sxp), cpp11::as_cpp>(base_sxp))); + END_CPP11 +} +// xml2_url.cpp +extern "C" SEXP url_parse_(SEXP x_sxp); +extern "C" SEXP _xml2_url_parse_(SEXP x_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(url_parse_(cpp11::as_cpp>(x_sxp))); + END_CPP11 +} +// xml2_url.cpp +extern "C" SEXP url_escape_(SEXP x_sxp, SEXP reserved_sxp); +extern "C" SEXP _xml2_url_escape_(SEXP x_sxp, SEXP reserved_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(url_escape_(cpp11::as_cpp>(x_sxp), cpp11::as_cpp>(reserved_sxp))); + END_CPP11 +} +// xml2_url.cpp +extern "C" SEXP url_unescape_(SEXP x_sxp); +extern "C" SEXP _xml2_url_unescape_(SEXP x_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(url_unescape_(cpp11::as_cpp>(x_sxp))); + END_CPP11 +} +// xml2_xpath.cpp +extern "C" SEXP xpath_search(SEXP node_sxp, SEXP doc_sxp, SEXP xpath_sxp, SEXP nsMap_sxp, SEXP num_results_sxp); +extern "C" SEXP _xml2_xpath_search(SEXP node_sxp, SEXP doc_sxp, SEXP xpath_sxp, SEXP nsMap_sxp, SEXP num_results_sxp) { + BEGIN_CPP11 + return cpp11::as_sexp(xpath_search(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(xpath_sxp), cpp11::as_cpp>(nsMap_sxp), cpp11::as_cpp>(num_results_sxp))); + END_CPP11 +} + +extern "C" { +static const R_CallMethodDef CallEntries[] = { + {"_xml2_doc_has_root", (DL_FUNC) &_xml2_doc_has_root, 1}, + {"_xml2_doc_is_html", (DL_FUNC) &_xml2_doc_is_html, 1}, + {"_xml2_doc_namespaces", (DL_FUNC) &_xml2_doc_namespaces, 1}, + {"_xml2_doc_new", (DL_FUNC) &_xml2_doc_new, 2}, + {"_xml2_doc_parse_file", (DL_FUNC) &_xml2_doc_parse_file, 4}, + {"_xml2_doc_parse_raw", (DL_FUNC) &_xml2_doc_parse_raw, 5}, + {"_xml2_doc_root", (DL_FUNC) &_xml2_doc_root, 1}, + {"_xml2_doc_set_root", (DL_FUNC) &_xml2_doc_set_root, 2}, + {"_xml2_doc_url", (DL_FUNC) &_xml2_doc_url, 1}, + {"_xml2_doc_validate", (DL_FUNC) &_xml2_doc_validate, 2}, + {"_xml2_doc_write_character", (DL_FUNC) &_xml2_doc_write_character, 3}, + {"_xml2_doc_write_connection", (DL_FUNC) &_xml2_doc_write_connection, 4}, + {"_xml2_doc_write_file", (DL_FUNC) &_xml2_doc_write_file, 4}, + {"_xml2_init_libxml2", (DL_FUNC) &_xml2_init_libxml2, 0}, + {"_xml2_libxml2_version_", (DL_FUNC) &_xml2_libxml2_version_, 0}, + {"_xml2_node_append_child", (DL_FUNC) &_xml2_node_append_child, 2}, + {"_xml2_node_append_content", (DL_FUNC) &_xml2_node_append_content, 2}, + {"_xml2_node_append_sibling", (DL_FUNC) &_xml2_node_append_sibling, 2}, + {"_xml2_node_attr", (DL_FUNC) &_xml2_node_attr, 4}, + {"_xml2_node_attrs", (DL_FUNC) &_xml2_node_attrs, 2}, + {"_xml2_node_cdata_new", (DL_FUNC) &_xml2_node_cdata_new, 2}, + {"_xml2_node_children", (DL_FUNC) &_xml2_node_children, 2}, + {"_xml2_node_comment_new", (DL_FUNC) &_xml2_node_comment_new, 1}, + {"_xml2_node_copy", (DL_FUNC) &_xml2_node_copy, 1}, + {"_xml2_node_has_children", (DL_FUNC) &_xml2_node_has_children, 2}, + {"_xml2_node_length", (DL_FUNC) &_xml2_node_length, 2}, + {"_xml2_node_name", (DL_FUNC) &_xml2_node_name, 2}, + {"_xml2_node_new", (DL_FUNC) &_xml2_node_new, 1}, + {"_xml2_node_new_dtd", (DL_FUNC) &_xml2_node_new_dtd, 4}, + {"_xml2_node_new_ns", (DL_FUNC) &_xml2_node_new_ns, 2}, + {"_xml2_node_new_text", (DL_FUNC) &_xml2_node_new_text, 2}, + {"_xml2_node_parent", (DL_FUNC) &_xml2_node_parent, 1}, + {"_xml2_node_parents", (DL_FUNC) &_xml2_node_parents, 1}, + {"_xml2_node_path", (DL_FUNC) &_xml2_node_path, 1}, + {"_xml2_node_prepend_child", (DL_FUNC) &_xml2_node_prepend_child, 2}, + {"_xml2_node_prepend_sibling", (DL_FUNC) &_xml2_node_prepend_sibling, 2}, + {"_xml2_node_remove", (DL_FUNC) &_xml2_node_remove, 2}, + {"_xml2_node_remove_attr", (DL_FUNC) &_xml2_node_remove_attr, 3}, + {"_xml2_node_replace", (DL_FUNC) &_xml2_node_replace, 2}, + {"_xml2_node_set_attr", (DL_FUNC) &_xml2_node_set_attr, 4}, + {"_xml2_node_set_content", (DL_FUNC) &_xml2_node_set_content, 2}, + {"_xml2_node_set_name", (DL_FUNC) &_xml2_node_set_name, 2}, + {"_xml2_node_set_namespace_prefix", (DL_FUNC) &_xml2_node_set_namespace_prefix, 3}, + {"_xml2_node_set_namespace_uri", (DL_FUNC) &_xml2_node_set_namespace_uri, 3}, + {"_xml2_node_siblings", (DL_FUNC) &_xml2_node_siblings, 2}, + {"_xml2_node_text", (DL_FUNC) &_xml2_node_text, 1}, + {"_xml2_node_type", (DL_FUNC) &_xml2_node_type, 1}, + {"_xml2_node_write_character", (DL_FUNC) &_xml2_node_write_character, 3}, + {"_xml2_node_write_connection", (DL_FUNC) &_xml2_node_write_connection, 4}, + {"_xml2_node_write_file", (DL_FUNC) &_xml2_node_write_file, 4}, + {"_xml2_nodes_duplicated", (DL_FUNC) &_xml2_nodes_duplicated, 1}, + {"_xml2_ns_lookup", (DL_FUNC) &_xml2_ns_lookup, 3}, + {"_xml2_ns_lookup_uri", (DL_FUNC) &_xml2_ns_lookup_uri, 3}, + {"_xml2_read_connection_", (DL_FUNC) &_xml2_read_connection_, 2}, + {"_xml2_unique_ns", (DL_FUNC) &_xml2_unique_ns, 1}, + {"_xml2_url_absolute_", (DL_FUNC) &_xml2_url_absolute_, 2}, + {"_xml2_url_escape_", (DL_FUNC) &_xml2_url_escape_, 2}, + {"_xml2_url_parse_", (DL_FUNC) &_xml2_url_parse_, 1}, + {"_xml2_url_relative_", (DL_FUNC) &_xml2_url_relative_, 2}, + {"_xml2_url_unescape_", (DL_FUNC) &_xml2_url_unescape_, 1}, + {"_xml2_xml_parse_options_", (DL_FUNC) &_xml2_xml_parse_options_, 0}, + {"_xml2_xml_save_options_", (DL_FUNC) &_xml2_xml_save_options_, 0}, + {"_xml2_xpath_search", (DL_FUNC) &_xml2_xpath_search, 5}, + {NULL, NULL, 0} +}; +} + +extern "C" attribute_visible void R_init_xml2(DllInfo* dll){ + R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); + R_useDynamicSymbols(dll, FALSE); + R_forceSymbols(dll, TRUE); +} diff --git a/src/init.c b/src/init.c deleted file mode 100644 index 9fcecfc0..00000000 --- a/src/init.c +++ /dev/null @@ -1,149 +0,0 @@ -#define R_NO_REMAP -#include -#undef R_NO_REMAP - -#include -#include // for NULL -#include - -/* FIXME: - Check these declarations against the C/Fortran source code. -*/ - -/* .Call calls */ -extern SEXP doc_has_root(SEXP); -extern SEXP doc_is_html(SEXP); -extern SEXP doc_namespaces(SEXP); -extern SEXP doc_new(SEXP, SEXP); -extern SEXP doc_parse_file(SEXP, SEXP, SEXP, SEXP); -extern SEXP doc_parse_raw(SEXP, SEXP, SEXP, SEXP, SEXP); -extern SEXP doc_root(SEXP); -extern SEXP doc_set_root(SEXP, SEXP); -extern SEXP doc_url(SEXP); -extern SEXP doc_validate(SEXP, SEXP); -extern SEXP doc_write_character(SEXP, SEXP, SEXP); -extern SEXP doc_write_connection(SEXP, SEXP, SEXP, SEXP); -extern SEXP doc_write_file(SEXP, SEXP, SEXP, SEXP); -extern SEXP init_libxml2(void); -extern SEXP libxml2_version_(void); -extern SEXP node_append_child(SEXP, SEXP); -extern SEXP node_append_content(SEXP, SEXP); -extern SEXP node_append_sibling(SEXP, SEXP); -extern SEXP node_attr(SEXP, SEXP, SEXP, SEXP); -extern SEXP node_attrs(SEXP, SEXP); -extern SEXP node_cdata_new(SEXP, SEXP); -extern SEXP node_children(SEXP, SEXP); -extern SEXP node_comment_new(SEXP); -extern SEXP node_copy(SEXP); -extern SEXP node_has_children(SEXP, SEXP); -extern SEXP node_length(SEXP, SEXP); -extern SEXP node_name(SEXP, SEXP); -extern SEXP node_new(SEXP); -extern SEXP node_new_dtd(SEXP, SEXP, SEXP, SEXP); -extern SEXP node_new_ns(SEXP, SEXP); -extern SEXP node_new_text(SEXP, SEXP); -extern SEXP node_parent(SEXP); -extern SEXP node_parents(SEXP); -extern SEXP node_path(SEXP); -extern SEXP node_prepend_child(SEXP, SEXP); -extern SEXP node_prepend_sibling(SEXP, SEXP); -extern SEXP node_remove(SEXP, SEXP); -extern SEXP node_remove_attr(SEXP, SEXP, SEXP); -extern SEXP node_replace(SEXP, SEXP); -extern SEXP node_set_attr(SEXP, SEXP, SEXP, SEXP); -extern SEXP node_set_content(SEXP, SEXP); -extern SEXP node_set_name(SEXP, SEXP); -extern SEXP node_set_namespace_prefix(SEXP, SEXP, SEXP); -extern SEXP node_set_namespace_uri(SEXP, SEXP, SEXP); -extern SEXP node_siblings(SEXP, SEXP); -extern SEXP node_text(SEXP); -extern SEXP node_type(SEXP); -extern SEXP node_write_character(SEXP, SEXP, SEXP); -extern SEXP node_write_connection(SEXP, SEXP, SEXP, SEXP); -extern SEXP node_write_file(SEXP, SEXP, SEXP, SEXP); -extern SEXP nodes_duplicated(SEXP); -extern SEXP ns_lookup(SEXP, SEXP, SEXP); -extern SEXP ns_lookup_uri(SEXP, SEXP, SEXP); -extern SEXP read_connection_(SEXP, SEXP); -extern SEXP unique_ns(SEXP); -extern SEXP url_absolute_(SEXP, SEXP); -extern SEXP url_escape_(SEXP, SEXP); -extern SEXP url_parse_(SEXP); -extern SEXP url_relative_(SEXP, SEXP); -extern SEXP url_unescape_(SEXP); -extern SEXP xml_parse_options_(void); -extern SEXP xml_save_options_(void); -extern SEXP xpath_search(SEXP, SEXP, SEXP, SEXP, SEXP); - -static const R_CallMethodDef CallEntries[] = { - {"doc_has_root", (DL_FUNC) &doc_has_root, 1}, - {"doc_is_html", (DL_FUNC) &doc_is_html, 1}, - {"doc_namespaces", (DL_FUNC) &doc_namespaces, 1}, - {"doc_new", (DL_FUNC) &doc_new, 2}, - {"doc_parse_file", (DL_FUNC) &doc_parse_file, 4}, - {"doc_parse_raw", (DL_FUNC) &doc_parse_raw, 5}, - {"doc_root", (DL_FUNC) &doc_root, 1}, - {"doc_set_root", (DL_FUNC) &doc_set_root, 2}, - {"doc_url", (DL_FUNC) &doc_url, 1}, - {"doc_validate", (DL_FUNC) &doc_validate, 2}, - {"doc_write_character", (DL_FUNC) &doc_write_character, 3}, - {"doc_write_connection", (DL_FUNC) &doc_write_connection, 4}, - {"doc_write_file", (DL_FUNC) &doc_write_file, 4}, - {"init_libxml2", (DL_FUNC) &init_libxml2, 0}, - {"libxml2_version_", (DL_FUNC) &libxml2_version_, 0}, - {"node_append_child", (DL_FUNC) &node_append_child, 2}, - {"node_append_content", (DL_FUNC) &node_append_content, 2}, - {"node_append_sibling", (DL_FUNC) &node_append_sibling, 2}, - {"node_attr", (DL_FUNC) &node_attr, 4}, - {"node_attrs", (DL_FUNC) &node_attrs, 2}, - {"node_cdata_new", (DL_FUNC) &node_cdata_new, 2}, - {"node_children", (DL_FUNC) &node_children, 2}, - {"node_comment_new", (DL_FUNC) &node_comment_new, 1}, - {"node_copy", (DL_FUNC) &node_copy, 1}, - {"node_has_children", (DL_FUNC) &node_has_children, 2}, - {"node_length", (DL_FUNC) &node_length, 2}, - {"node_name", (DL_FUNC) &node_name, 2}, - {"node_new", (DL_FUNC) &node_new, 1}, - {"node_new_dtd", (DL_FUNC) &node_new_dtd, 4}, - {"node_new_ns", (DL_FUNC) &node_new_ns, 2}, - {"node_new_text", (DL_FUNC) &node_new_text, 2}, - {"node_parent", (DL_FUNC) &node_parent, 1}, - {"node_parents", (DL_FUNC) &node_parents, 1}, - {"node_path", (DL_FUNC) &node_path, 1}, - {"node_prepend_child", (DL_FUNC) &node_prepend_child, 2}, - {"node_prepend_sibling", (DL_FUNC) &node_prepend_sibling, 2}, - {"node_remove", (DL_FUNC) &node_remove, 2}, - {"node_remove_attr", (DL_FUNC) &node_remove_attr, 3}, - {"node_replace", (DL_FUNC) &node_replace, 2}, - {"node_set_attr", (DL_FUNC) &node_set_attr, 4}, - {"node_set_content", (DL_FUNC) &node_set_content, 2}, - {"node_set_name", (DL_FUNC) &node_set_name, 2}, - {"node_set_namespace_prefix", (DL_FUNC) &node_set_namespace_prefix, 3}, - {"node_set_namespace_uri", (DL_FUNC) &node_set_namespace_uri, 3}, - {"node_siblings", (DL_FUNC) &node_siblings, 2}, - {"node_text", (DL_FUNC) &node_text, 1}, - {"node_type", (DL_FUNC) &node_type, 1}, - {"node_write_character", (DL_FUNC) &node_write_character, 3}, - {"node_write_connection", (DL_FUNC) &node_write_connection, 4}, - {"node_write_file", (DL_FUNC) &node_write_file, 4}, - {"nodes_duplicated", (DL_FUNC) &nodes_duplicated, 1}, - {"ns_lookup", (DL_FUNC) &ns_lookup, 3}, - {"ns_lookup_uri", (DL_FUNC) &ns_lookup_uri, 3}, - {"read_connection_", (DL_FUNC) &read_connection_, 2}, - {"unique_ns", (DL_FUNC) &unique_ns, 1}, - {"url_absolute_", (DL_FUNC) &url_absolute_, 2}, - {"url_escape_", (DL_FUNC) &url_escape_, 2}, - {"url_parse_", (DL_FUNC) &url_parse_, 1}, - {"url_relative_", (DL_FUNC) &url_relative_, 2}, - {"url_unescape_", (DL_FUNC) &url_unescape_, 1}, - {"xml_parse_options_", (DL_FUNC) &xml_parse_options_, 0}, - {"xml_save_options_", (DL_FUNC) &xml_save_options_, 0}, - {"xpath_search", (DL_FUNC) &xpath_search, 5}, - {NULL, NULL, 0} -}; - -void R_init_xml2(DllInfo *dll) -{ - R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); - R_useDynamicSymbols(dll, FALSE); -} diff --git a/src/xml2_doc.cpp b/src/xml2_doc.cpp index 5ff748d3..087de458 100644 --- a/src/xml2_doc.cpp +++ b/src/xml2_doc.cpp @@ -1,3 +1,5 @@ +#include + #define R_NO_REMAP #include #undef R_NO_REMAP @@ -8,7 +10,7 @@ #include "xml2_utils.h" #include -// [[export]] +[[cpp11::register]] extern "C" SEXP xml_parse_options_() { #if defined(LIBXML_VERSION) && (LIBXML_VERSION >= 20700) @@ -181,7 +183,7 @@ extern "C" SEXP xml_parse_options_() { #undef HAS_IGNORE_ENC } -// [[export]] +[[cpp11::register]] extern "C" SEXP doc_parse_file( SEXP path_sxp, SEXP encoding_sxp, @@ -214,7 +216,7 @@ extern "C" SEXP doc_parse_file( return SEXP(XPtrDoc(pDoc)); } -// [[export]] +[[cpp11::register]] extern "C" SEXP doc_parse_raw( SEXP x, SEXP encoding_sxp, @@ -256,7 +258,7 @@ extern "C" SEXP doc_parse_raw( END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP doc_root(SEXP x) { BEGIN_CPP XPtrDoc doc(x); @@ -265,7 +267,7 @@ extern "C" SEXP doc_root(SEXP x) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP doc_has_root(SEXP x_sxp) { BEGIN_CPP XPtrDoc x(x_sxp); @@ -273,7 +275,7 @@ extern "C" SEXP doc_has_root(SEXP x_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP doc_url(SEXP doc_sxp) { BEGIN_CPP @@ -290,7 +292,7 @@ extern "C" SEXP doc_url(SEXP doc_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP doc_new(SEXP version_sxp, SEXP encoding_sxp) { const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); @@ -303,7 +305,7 @@ extern "C" SEXP doc_new(SEXP version_sxp, SEXP encoding_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP doc_set_root(SEXP doc_sxp, SEXP root_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); @@ -313,7 +315,7 @@ extern "C" SEXP doc_set_root(SEXP doc_sxp, SEXP root_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP doc_is_html(SEXP doc_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); diff --git a/src/xml2_init.cpp b/src/xml2_init.cpp index b89c64aa..95b1a201 100644 --- a/src/xml2_init.cpp +++ b/src/xml2_init.cpp @@ -1,3 +1,5 @@ +#include + #define R_NO_REMAP #include #undef R_NO_REMAP @@ -37,7 +39,7 @@ void handleGenericError(void *ctx, const char *fmt, ...) Rf_error(buffer); } -// [[export]] +[[cpp11::register]] extern "C" SEXP init_libxml2() { // Check that header and libs are compatible LIBXML_TEST_VERSION @@ -56,7 +58,7 @@ extern "C" { } -// [[export]] +[[cpp11::register]] extern "C" SEXP libxml2_version_(){ return Rf_mkString(LIBXML_DOTTED_VERSION); } diff --git a/src/xml2_namespace.cpp b/src/xml2_namespace.cpp index 0915c08a..8142962f 100644 --- a/src/xml2_namespace.cpp +++ b/src/xml2_namespace.cpp @@ -1,3 +1,5 @@ +#include + #define R_NO_REMAP #include #undef R_NO_REMAP @@ -7,7 +9,7 @@ #include "xml2_types.h" #include "xml2_utils.h" -// [[export]] +[[cpp11::register]] extern "C" SEXP unique_ns(SEXP ns) { BEGIN_CPP return NsMap(ns).out(); @@ -26,7 +28,7 @@ void cache_namespace(xmlNode* node, NsMap* nsMap) { cache_namespace(cur, nsMap); } -// [[export]] +[[cpp11::register]] extern "C" SEXP doc_namespaces(SEXP doc_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); @@ -40,7 +42,7 @@ extern "C" SEXP doc_namespaces(SEXP doc_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); @@ -55,7 +57,7 @@ extern "C" SEXP ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP ns_lookup(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); diff --git a/src/xml2_node.cpp b/src/xml2_node.cpp index 2f9d50a8..5af5d12b 100644 --- a/src/xml2_node.cpp +++ b/src/xml2_node.cpp @@ -1,3 +1,5 @@ +#include + #define R_NO_REMAP #include #undef R_NO_REMAP @@ -27,7 +29,7 @@ std::string nodeName(T* node, SEXP nsMap) { return prefix + ":" + name; } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_name(SEXP node_sxp, SEXP nsMap) { BEGIN_CPP XPtrNode node(node_sxp); @@ -37,7 +39,7 @@ extern "C" SEXP node_name(SEXP node_sxp, SEXP nsMap) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_set_name(SEXP node_sxp, SEXP value) { BEGIN_CPP XPtrNode node(node_sxp); @@ -48,7 +50,7 @@ extern "C" SEXP node_set_name(SEXP node_sxp, SEXP value) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_text(SEXP node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -82,7 +84,7 @@ const xmlChar* xmlNsDefinition(xmlNodePtr node, const xmlChar* lookup) { return NULL; } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_attr( SEXP node_sxp, SEXP name_sxp, @@ -133,7 +135,7 @@ extern "C" SEXP node_attr( END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_attrs(SEXP node_sxp, SEXP nsMap_sxp) { BEGIN_CPP XPtrNode node_(node_sxp); @@ -324,7 +326,7 @@ void removeNs(xmlNodePtr node, const xmlChar* prefix) { return; } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, SEXP nsMap) { BEGIN_CPP XPtrNode node_(node_sxp); @@ -368,7 +370,7 @@ extern "C" SEXP node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, SEXP nsM END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_remove_attr(SEXP node_sxp, SEXP name_sxp, SEXP nsMap) { BEGIN_CPP XPtrNode node_(node_sxp); @@ -423,7 +425,7 @@ SEXP asList(std::vector nodes) { return out; } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_children(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -443,7 +445,7 @@ extern "C" SEXP node_children(SEXP node_sxp, SEXP only_node_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_length(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP @@ -462,7 +464,7 @@ extern "C" SEXP node_length(SEXP node_sxp, SEXP only_node_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_has_children(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -478,7 +480,7 @@ extern "C" SEXP node_has_children(SEXP node_sxp, SEXP only_node_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_parents(SEXP node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -495,7 +497,7 @@ extern "C" SEXP node_parents(SEXP node_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_siblings(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -523,7 +525,7 @@ extern "C" SEXP node_siblings(SEXP node_sxp, SEXP only_node_sxp) { } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_parent(SEXP node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -536,7 +538,7 @@ extern "C" SEXP node_parent(SEXP node_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_path(SEXP node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -545,7 +547,7 @@ extern "C" SEXP node_path(SEXP node_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP nodes_duplicated(SEXP nodes) { BEGIN_CPP @@ -575,7 +577,7 @@ extern "C" SEXP nodes_duplicated(SEXP nodes) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_type(SEXP node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -584,7 +586,7 @@ extern "C" SEXP node_type(SEXP node_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_copy(SEXP node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -595,7 +597,7 @@ extern "C" SEXP node_copy(SEXP node_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_set_content(SEXP node_sxp, SEXP content) { BEGIN_CPP XPtrNode node(node_sxp); @@ -606,7 +608,7 @@ extern "C" SEXP node_set_content(SEXP node_sxp, SEXP content) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_append_content(SEXP node_sxp, SEXP content) { BEGIN_CPP XPtrNode node(node_sxp); @@ -617,7 +619,7 @@ extern "C" SEXP node_append_content(SEXP node_sxp, SEXP content) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_new_text(SEXP node_sxp, SEXP content) { BEGIN_CPP XPtrNode node(node_sxp); @@ -628,7 +630,7 @@ extern "C" SEXP node_new_text(SEXP node_sxp, SEXP content) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_append_child(SEXP parent_sxp, SEXP cur_sxp) { BEGIN_CPP XPtrNode parent(parent_sxp); @@ -638,7 +640,7 @@ extern "C" SEXP node_append_child(SEXP parent_sxp, SEXP cur_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_prepend_child(SEXP parent_sxp, SEXP cur_sxp) { BEGIN_CPP XPtrNode parent(parent_sxp); @@ -651,7 +653,7 @@ extern "C" SEXP node_prepend_child(SEXP parent_sxp, SEXP cur_sxp) { } // Previous sibling -// [[export]] +[[cpp11::register]] extern "C" SEXP node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp) { BEGIN_CPP XPtrNode cur(cur_sxp); @@ -664,7 +666,7 @@ extern "C" SEXP node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp) { } // Append sibling -// [[export]] +[[cpp11::register]] extern "C" SEXP node_append_sibling(SEXP cur_sxp, SEXP elem_sxp) { BEGIN_CPP XPtrNode cur(cur_sxp); @@ -676,7 +678,7 @@ extern "C" SEXP node_append_sibling(SEXP cur_sxp, SEXP elem_sxp) { } // Replace node -// [[export]] +[[cpp11::register]] extern "C" SEXP node_replace(SEXP old_sxp, SEXP cur_sxp) { BEGIN_CPP XPtrNode old(old_sxp); @@ -687,7 +689,7 @@ extern "C" SEXP node_replace(SEXP old_sxp, SEXP cur_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_remove(SEXP node_sxp, SEXP free_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -702,7 +704,7 @@ extern "C" SEXP node_remove(SEXP node_sxp, SEXP free_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_new(SEXP name) { BEGIN_CPP XPtrNode node(xmlNewNode(NULL, asXmlChar(name))); @@ -711,7 +713,7 @@ extern "C" SEXP node_new(SEXP name) { } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_cdata_new(SEXP doc_sxp, SEXP content_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); @@ -720,7 +722,7 @@ extern "C" SEXP node_cdata_new(SEXP doc_sxp, SEXP content_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_comment_new(SEXP content) { BEGIN_CPP XPtrNode node(xmlNewComment(asXmlChar(content))); @@ -728,7 +730,7 @@ extern "C" SEXP node_comment_new(SEXP content) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_new_ns(SEXP name, SEXP ns_sxp) { BEGIN_CPP XPtrNs ns(ns_sxp); @@ -737,7 +739,7 @@ extern "C" SEXP node_new_ns(SEXP name, SEXP ns_sxp) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri) { BEGIN_CPP XPtrDoc doc(doc_sxp); @@ -751,7 +753,7 @@ extern "C" SEXP node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri) { END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); @@ -770,7 +772,7 @@ extern "C" SEXP node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP pref END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_new_dtd(SEXP doc_sxp, SEXP name_sxp, SEXP eid_sxp, SEXP sid_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); diff --git a/src/xml2_output.cpp b/src/xml2_output.cpp index c0619e23..360efc99 100644 --- a/src/xml2_output.cpp +++ b/src/xml2_output.cpp @@ -1,3 +1,5 @@ +#include + #define R_NO_REMAP #include #undef R_NO_REMAP @@ -43,7 +45,7 @@ typedef struct { int value; } xml_save_def; -// [[export]] +[[cpp11::register]] extern "C" SEXP xml_save_options_() { static const xml_save_def entries[] = { @@ -97,7 +99,7 @@ int xml_write_callback(SEXP con, const char * buffer, int len) { return write_size; } -// [[export]] +[[cpp11::register]] extern "C" SEXP doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP @@ -119,7 +121,7 @@ extern "C" SEXP doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, S END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); @@ -144,7 +146,7 @@ extern "C" SEXP doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encodin END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); @@ -174,7 +176,7 @@ extern "C" SEXP doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP option END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -195,7 +197,7 @@ extern "C" SEXP node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_write_connection(SEXP node_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -219,7 +221,7 @@ extern "C" SEXP node_write_connection(SEXP node_sxp, SEXP connection, SEXP encod END_CPP } -// [[export]] +[[cpp11::register]] extern "C" SEXP node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP XPtrNode node(node_sxp); diff --git a/src/xml2_schema.cpp b/src/xml2_schema.cpp index 345ca502..0f5de518 100644 --- a/src/xml2_schema.cpp +++ b/src/xml2_schema.cpp @@ -1,3 +1,5 @@ +#include + #define R_NO_REMAP #include #undef R_NO_REMAP @@ -16,7 +18,7 @@ void handleSchemaError(void* userData, xmlError* error) { vec->push_back(message); } -// [[export]] +[[cpp11::register]] extern "C" SEXP doc_validate(SEXP doc_sxp, SEXP schema_sxp) { XPtrDoc doc(doc_sxp); diff --git a/src/xml2_url.cpp b/src/xml2_url.cpp index 6f7644ba..73e9e370 100644 --- a/src/xml2_url.cpp +++ b/src/xml2_url.cpp @@ -1,3 +1,5 @@ +#include + #define R_NO_REMAP #include #undef R_NO_REMAP @@ -5,7 +7,7 @@ #include #include "xml2_utils.h" -// [[export]] +[[cpp11::register]] extern "C" SEXP url_absolute_(SEXP x_sxp, SEXP base_sxp) { R_xlen_t n = Rf_xlength(x_sxp); SEXP out = PROTECT(Rf_allocVector(STRSXP, n)); @@ -25,7 +27,7 @@ extern "C" SEXP url_absolute_(SEXP x_sxp, SEXP base_sxp) { return out; } -// [[export]] +[[cpp11::register]] extern "C" SEXP url_relative_(SEXP x_sxp, SEXP base_sxp) { R_xlen_t n = Rf_xlength(x_sxp); SEXP out = PROTECT(Rf_allocVector(STRSXP, n)); @@ -45,7 +47,7 @@ extern "C" SEXP url_relative_(SEXP x_sxp, SEXP base_sxp) { return out; } -// [[export]] +[[cpp11::register]] extern "C" SEXP url_parse_(SEXP x_sxp) { R_xlen_t n = Rf_xlength(x_sxp); @@ -118,7 +120,7 @@ extern "C" SEXP url_parse_(SEXP x_sxp) { return out; } -// [[export]] +[[cpp11::register]] extern "C" SEXP url_escape_(SEXP x_sxp, SEXP reserved_sxp) { R_xlen_t n = Rf_xlength(x_sxp); SEXP out = PROTECT(Rf_allocVector(STRSXP, n)); @@ -138,7 +140,7 @@ extern "C" SEXP url_escape_(SEXP x_sxp, SEXP reserved_sxp) { return out; } -// [[export]] +[[cpp11::register]] extern "C" SEXP url_unescape_(SEXP x_sxp) { R_xlen_t n = Rf_xlength(x_sxp); SEXP out = PROTECT(Rf_allocVector(STRSXP, n)); diff --git a/src/xml2_utils.h b/src/xml2_utils.h index 231b7e38..327ca41a 100644 --- a/src/xml2_utils.h +++ b/src/xml2_utils.h @@ -1,6 +1,8 @@ #ifndef __XML2_XML_UTILS__ #define __XML2_XML_UTILS__ +#include + #define R_NO_REMAP #include #undef R_NO_REMAP diff --git a/src/xml2_xpath.cpp b/src/xml2_xpath.cpp index 6a43b504..24796122 100644 --- a/src/xml2_xpath.cpp +++ b/src/xml2_xpath.cpp @@ -1,3 +1,5 @@ +#include + #define R_NO_REMAP #include #undef R_NO_REMAP @@ -102,7 +104,7 @@ class XmlSeeker { }; -// [[export]] +[[cpp11::register]] extern "C" SEXP xpath_search(SEXP node_sxp, SEXP doc_sxp, SEXP xpath_sxp, SEXP nsMap_sxp, SEXP num_results_sxp) { XPtrNode node(node_sxp); diff --git a/tests/testthat/test-xml_modify.R b/tests/testthat/test-xml_modify.R index 0678684c..fd5c7ff7 100644 --- a/tests/testthat/test-xml_modify.R +++ b/tests/testthat/test-xml_modify.R @@ -4,12 +4,12 @@ test_that("modifying nodes works", { expect_equal(xml_name(node), "x") - .Call(node_set_name, node$node, "y") + node_set_name(node$node, "y") expect_equal(xml_name(node), "y") expect_equal(xml_text(node), "") - .Call(node_set_content, node$node, "test") + node_set_content(node$node, "test") expect_equal(xml_text(node), "test") }) diff --git a/tests/testthat/test-xml_namespaces.R b/tests/testthat/test-xml_namespaces.R index 6ab43f69..3da8d91c 100644 --- a/tests/testthat/test-xml_namespaces.R +++ b/tests/testthat/test-xml_namespaces.R @@ -20,12 +20,12 @@ test_that("aliased prefixes retained", { test_that("unique prefix-url combo unchanged", { x <- c(blah = "http://blah.com", rah = "http://rah.com") - expect_equal(.Call(unique_ns, x), x) + expect_equal(unique_ns(x), x) }) test_that("all prefixs kept", { x <- c(blah = "http://blah.com", rah = "http://blah.com") - expect_equal(names(.Call(unique_ns, x)), c("blah", "rah")) + expect_equal(names(unique_ns(x)), c("blah", "rah")) }) test_that("multiple default namespaces can be stripped", { From 48ab9795f493c918d0ef6b27cae79743d0dedb40 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Mon, 4 Sep 2023 08:57:57 +0000 Subject: [PATCH 03/25] Migrate `xml2_url.cpp` --- src/cpp11.cpp | 20 ++--- src/xml2_url.cpp | 143 +++++++++++++------------------ tests/testthat/_snaps/xml_url.md | 17 ++++ tests/testthat/test-xml_url.R | 21 ++--- 4 files changed, 95 insertions(+), 106 deletions(-) create mode 100644 tests/testthat/_snaps/xml_url.md diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 9bc14243..0017a11c 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -405,38 +405,38 @@ extern "C" SEXP _xml2_doc_validate(SEXP doc_sxp, SEXP schema_sxp) { END_CPP11 } // xml2_url.cpp -extern "C" SEXP url_absolute_(SEXP x_sxp, SEXP base_sxp); +cpp11::strings url_absolute_(cpp11::strings x_sxp, cpp11::strings base_sxp); extern "C" SEXP _xml2_url_absolute_(SEXP x_sxp, SEXP base_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(url_absolute_(cpp11::as_cpp>(x_sxp), cpp11::as_cpp>(base_sxp))); + return cpp11::as_sexp(url_absolute_(cpp11::as_cpp>(x_sxp), cpp11::as_cpp>(base_sxp))); END_CPP11 } // xml2_url.cpp -extern "C" SEXP url_relative_(SEXP x_sxp, SEXP base_sxp); +cpp11::strings url_relative_(cpp11::strings x_sxp, cpp11::strings base_sxp); extern "C" SEXP _xml2_url_relative_(SEXP x_sxp, SEXP base_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(url_relative_(cpp11::as_cpp>(x_sxp), cpp11::as_cpp>(base_sxp))); + return cpp11::as_sexp(url_relative_(cpp11::as_cpp>(x_sxp), cpp11::as_cpp>(base_sxp))); END_CPP11 } // xml2_url.cpp -extern "C" SEXP url_parse_(SEXP x_sxp); +cpp11::data_frame url_parse_(cpp11::strings x_sxp); extern "C" SEXP _xml2_url_parse_(SEXP x_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(url_parse_(cpp11::as_cpp>(x_sxp))); + return cpp11::as_sexp(url_parse_(cpp11::as_cpp>(x_sxp))); END_CPP11 } // xml2_url.cpp -extern "C" SEXP url_escape_(SEXP x_sxp, SEXP reserved_sxp); +cpp11::strings url_escape_(cpp11::strings x_sxp, cpp11::strings reserved_sxp); extern "C" SEXP _xml2_url_escape_(SEXP x_sxp, SEXP reserved_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(url_escape_(cpp11::as_cpp>(x_sxp), cpp11::as_cpp>(reserved_sxp))); + return cpp11::as_sexp(url_escape_(cpp11::as_cpp>(x_sxp), cpp11::as_cpp>(reserved_sxp))); END_CPP11 } // xml2_url.cpp -extern "C" SEXP url_unescape_(SEXP x_sxp); +cpp11::strings url_unescape_(cpp11::strings x_sxp); extern "C" SEXP _xml2_url_unescape_(SEXP x_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(url_unescape_(cpp11::as_cpp>(x_sxp))); + return cpp11::as_sexp(url_unescape_(cpp11::as_cpp>(x_sxp))); END_CPP11 } // xml2_xpath.cpp diff --git a/src/xml2_url.cpp b/src/xml2_url.cpp index 73e9e370..265ad1f5 100644 --- a/src/xml2_url.cpp +++ b/src/xml2_url.cpp @@ -7,72 +7,70 @@ #include #include "xml2_utils.h" -[[cpp11::register]] -extern "C" SEXP url_absolute_(SEXP x_sxp, SEXP base_sxp) { - R_xlen_t n = Rf_xlength(x_sxp); - SEXP out = PROTECT(Rf_allocVector(STRSXP, n)); - - if (Rf_xlength(base_sxp) > 1) { - Rf_error("Base URL must be length 1"); +const xmlChar* to_xml_chr(cpp11::strings x, const char* arg) { + if (x.size() > 1) { + cpp11::stop("%s must be a character vector of length 1", arg); } - const xmlChar* base_uri = (xmlChar*) Rf_translateCharUTF8(STRING_ELT(base_sxp, 0)); + return (xmlChar*) cpp11::as_cpp(x); +} + +[[cpp11::register]] +cpp11::strings url_absolute_(cpp11::strings x_sxp, cpp11::strings base_sxp) { + int n = x_sxp.size(); + cpp11::writable::strings out(n); + + const xmlChar* base_uri = to_xml_chr(base_sxp, "Base URL"); for (int i = 0; i < n; ++i) { - const xmlChar* uri = (xmlChar*) Rf_translateCharUTF8(STRING_ELT(x_sxp, i)); - SET_STRING_ELT(out, i, Xml2String(xmlBuildURI(uri, base_uri)).asRString()); + const xmlChar* uri = (xmlChar*) Rf_translateCharUTF8(x_sxp[i]); + out[i] = Xml2String(xmlBuildURI(uri, base_uri)).asRString(); } - UNPROTECT(1); return out; } [[cpp11::register]] -extern "C" SEXP url_relative_(SEXP x_sxp, SEXP base_sxp) { - R_xlen_t n = Rf_xlength(x_sxp); - SEXP out = PROTECT(Rf_allocVector(STRSXP, n)); - - if (Rf_xlength(base_sxp) > 1) { - Rf_error("Base URL must be length 1"); - } +cpp11::strings url_relative_(cpp11::strings x_sxp, cpp11::strings base_sxp) { + int n = x_sxp.size(); + cpp11::writable::strings out(n); - const xmlChar* base_uri = (xmlChar*) Rf_translateCharUTF8(STRING_ELT(base_sxp, 0)); + const xmlChar* base_uri = to_xml_chr(base_sxp, "Base URL"); for (int i = 0; i < n; ++i) { - const xmlChar* uri = (xmlChar*) Rf_translateCharUTF8(STRING_ELT(x_sxp, i)); - SET_STRING_ELT(out, i, Xml2String(xmlBuildRelativeURI(uri, base_uri)).asRString()); + const xmlChar* uri = (xmlChar*) Rf_translateCharUTF8(x_sxp[i]); + out[i] = Xml2String(xmlBuildRelativeURI(uri, base_uri)).asRString(); } - UNPROTECT(1); return out; } [[cpp11::register]] -extern "C" SEXP url_parse_(SEXP x_sxp) { - R_xlen_t n = Rf_xlength(x_sxp); +cpp11::data_frame url_parse_(cpp11::strings x_sxp) { + int n = x_sxp.size(); - SEXP scheme = PROTECT(Rf_allocVector(STRSXP, n)); - SEXP server = PROTECT(Rf_allocVector(STRSXP, n)); - SEXP user = PROTECT(Rf_allocVector(STRSXP, n)); - SEXP path = PROTECT(Rf_allocVector(STRSXP, n)); - SEXP query = PROTECT(Rf_allocVector(STRSXP, n)); - SEXP fragment = PROTECT(Rf_allocVector(STRSXP, n)); + cpp11::writable::strings scheme(n); + cpp11::writable::strings server(n); + cpp11::writable::strings user(n); + cpp11::writable::strings path(n); + cpp11::writable::strings query(n); + cpp11::writable::strings fragment(n); - SEXP port = PROTECT(Rf_allocVector(INTSXP, n)); + cpp11::writable::integers port(n); for (int i = 0; i < n; ++i) { - const char* raw = Rf_translateCharUTF8(STRING_ELT(x_sxp, i)); + const char* raw = Rf_translateCharUTF8(x_sxp[i]); xmlURI* uri = xmlParseURI(raw); if (uri == NULL) { continue; } - SET_STRING_ELT(scheme, i, Rf_mkChar(uri->scheme == NULL ? "" : uri->scheme)); - SET_STRING_ELT(server, i, Rf_mkChar(uri->server == NULL ? "" : uri->server)); - INTEGER(port)[i] = uri->port == 0 ? NA_INTEGER : uri->port; - SET_STRING_ELT(user, i, Rf_mkChar(uri->user == NULL ? "" : uri->user)); - SET_STRING_ELT(path, i, Rf_mkChar(uri->path == NULL ? "" : uri->path)); - SET_STRING_ELT(fragment, i, Rf_mkChar(uri->fragment == NULL ? "" : uri->fragment)); + scheme[i] = uri->scheme == NULL ? "" : uri->scheme; + server[i] = uri->server == NULL ? "" : uri->server; + port[i] = uri->port == 0 ? NA_INTEGER : uri->port; + user[i] = uri->user == NULL ? "" : uri->user; + path[i] = uri->path == NULL ? "" : uri->path; + fragment[i] = uri->fragment == NULL ? "" : uri->fragment; /* * * * Thu Apr 26 10:36:26 CEST 2007 Daniel Veillard @@ -80,79 +78,56 @@ extern "C" SEXP url_parse_(SEXP x_sxp) { * https://github.com/GNOME/libxml2/commit/a1413b84f7163d57c6251d5f4251186368efd859 */ #if defined(LIBXML_VERSION) && (LIBXML_VERSION >= 20629) - SET_STRING_ELT(query, i, Rf_mkChar(uri->query_raw == NULL ? "" : uri->query_raw)); + query[i] = uri->query_raw == NULL ? "" : uri->query_raw; #else - SET_STRING_ELT(query, i, Rf_mkChar(uri->query == NULL ? "" : uri->query)); + query[i] = uri->query == NULL ? "" : uri->query; #endif xmlFreeURI(uri); } - SEXP out = PROTECT(Rf_allocVector(VECSXP, 7)); - SET_VECTOR_ELT(out, 0, scheme); - SET_VECTOR_ELT(out, 1, server); - SET_VECTOR_ELT(out, 2, port); - SET_VECTOR_ELT(out, 3, user); - SET_VECTOR_ELT(out, 4, path); - SET_VECTOR_ELT(out, 5, query); - SET_VECTOR_ELT(out, 6, fragment); - - SEXP names = PROTECT(Rf_allocVector(STRSXP, 7)); - - SET_STRING_ELT(names, 0, Rf_mkChar("scheme")); - SET_STRING_ELT(names, 1, Rf_mkChar("server")); - SET_STRING_ELT(names, 2, Rf_mkChar("port")); - SET_STRING_ELT(names, 3, Rf_mkChar("user")); - SET_STRING_ELT(names, 4, Rf_mkChar("path")); - SET_STRING_ELT(names, 5, Rf_mkChar("query")); - SET_STRING_ELT(names, 6, Rf_mkChar("fragment")); - - Rf_setAttrib(out, R_ClassSymbol, Rf_mkString("data.frame")); - Rf_setAttrib(out, R_NamesSymbol, names); + using namespace cpp11::literals; - SEXP row_names = PROTECT(Rf_allocVector(INTSXP, 2)); - INTEGER(row_names)[0] = NA_INTEGER; - INTEGER(row_names)[1] = -n; - Rf_setAttrib(out, R_RowNamesSymbol, row_names); - - UNPROTECT(10); + cpp11::writable::data_frame out({ + "scheme"_nm = scheme, + "server"_nm = server, + "port"_nm = port, + "user"_nm = user, + "path"_nm = path, + "query"_nm = query, + "fragment"_nm = fragment, + }); return out; } [[cpp11::register]] -extern "C" SEXP url_escape_(SEXP x_sxp, SEXP reserved_sxp) { - R_xlen_t n = Rf_xlength(x_sxp); - SEXP out = PROTECT(Rf_allocVector(STRSXP, n)); - - if (Rf_xlength(reserved_sxp) != 1) { - Rf_error("`reserved` must be character vector of length 1"); - } +cpp11::strings url_escape_(cpp11::strings x_sxp, cpp11::strings reserved_sxp) { + int n = x_sxp.size(); + cpp11::writable::strings out(n); - xmlChar* xReserved = (xmlChar*) Rf_translateCharUTF8(STRING_ELT(reserved_sxp, 0)); + const xmlChar* xReserved = to_xml_chr(reserved_sxp, "`reserved`"); for (int i = 0; i < n; ++i) { - const xmlChar* xx = (xmlChar*) Rf_translateCharUTF8(STRING_ELT(x_sxp, i)); - SET_STRING_ELT(out, i, Xml2String(xmlURIEscapeStr(xx, xReserved)).asRString()); + const xmlChar* xx = (xmlChar*) Rf_translateCharUTF8(x_sxp[i]); + out[i] = Xml2String(xmlURIEscapeStr(xx, xReserved)).asRString(); } - UNPROTECT(1); return out; } [[cpp11::register]] -extern "C" SEXP url_unescape_(SEXP x_sxp) { - R_xlen_t n = Rf_xlength(x_sxp); - SEXP out = PROTECT(Rf_allocVector(STRSXP, n)); +cpp11::strings url_unescape_(cpp11::strings x_sxp) { + int n = x_sxp.size(); + cpp11::writable::strings out(n); for (int i = 0; i < n; ++i) { - const char* xx = Rf_translateCharUTF8(STRING_ELT(x_sxp, i)); + const char* xx = Rf_translateCharUTF8(x_sxp[i]); char* unescaped = xmlURIUnescapeString(xx, 0, NULL); - SET_STRING_ELT(out, i, (unescaped == NULL) ? NA_STRING : Rf_mkCharCE(unescaped, CE_UTF8)); + out[i] = (unescaped == NULL) ? cpp11::na() : cpp11::r_string(unescaped); xmlFree(unescaped); } - UNPROTECT(1); return out; } diff --git a/tests/testthat/_snaps/xml_url.md b/tests/testthat/_snaps/xml_url.md new file mode 100644 index 00000000..e2e60cf5 --- /dev/null +++ b/tests/testthat/_snaps/xml_url.md @@ -0,0 +1,17 @@ +# url_absolute + + Code + url_absolute(c(".", "..", "/", "/x"), c("http://hadley.nz/a/b/c/d", + "http://foo.bar")) + Condition + Error: + ! Base URL must be a character vector of length 1 + +# url_escape + + Code + url_escape("a b c", reserved = c("a", "b")) + Condition + Error: + ! `reserved` must be a character vector of length 1 + diff --git a/tests/testthat/test-xml_url.R b/tests/testthat/test-xml_url.R index 65253bfb..f796bb3b 100644 --- a/tests/testthat/test-xml_url.R +++ b/tests/testthat/test-xml_url.R @@ -4,10 +4,9 @@ test_that("url_absolute", { c("http://hadley.nz/a/b/c/", "http://hadley.nz/a/b/", "http://hadley.nz/", "http://hadley.nz/x") ) - expect_error( - url_absolute(c(".", "..", "/", "/x"), c("http://hadley.nz/a/b/c/d", "http://foo.bar")), - "Base URL must be length 1" - ) + expect_snapshot(error = TRUE, { + url_absolute(c(".", "..", "/", "/x"), c("http://hadley.nz/a/b/c/d", "http://foo.bar")) + }) }) test_that("url_relative", { @@ -34,10 +33,9 @@ test_that("url_relative", { "../c" ) - expect_error( - url_relative("http://hadley.nz/a/c", c("http://hadley.nz/a/b/c/d", "http://foo.bar")), - "Base URL must be length 1" - ) + expect_snapshot(error = TRUE, { + url_relative("http://hadley.nz/a/c", c("http://hadley.nz/a/b/c/d", "http://foo.bar")) + }) }) test_that("url_parse", { @@ -75,10 +73,9 @@ test_that("url_parse", { }) test_that("url_escape", { - expect_error( - url_escape("a b c", reserved = c("a", "b")), - "`reserved` must be character vector of length 1" - ) + expect_snapshot(error = TRUE, { + url_escape("a b c", reserved = c("a", "b")) + }) expect_equal( url_escape("a b c"), From 992cd017fd4719c09f567fb6e16cff93c85332d6 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Mon, 4 Sep 2023 09:07:28 +0000 Subject: [PATCH 04/25] Replace `extern "C"` by `cpp11::sexp` --- src/connection.cpp | 2 +- src/cpp11.cpp | 116 ++++++++++++++++++++--------------------- src/xml2_doc.cpp | 18 +++---- src/xml2_init.cpp | 4 +- src/xml2_namespace.cpp | 8 +-- src/xml2_node.cpp | 66 +++++++++++------------ src/xml2_output.cpp | 14 ++--- src/xml2_schema.cpp | 2 +- src/xml2_xpath.cpp | 2 +- 9 files changed, 116 insertions(+), 116 deletions(-) diff --git a/src/connection.cpp b/src/connection.cpp index a1a18f4b..7015b98c 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -32,7 +32,7 @@ SEXP write_bin(SEXP data, SEXP con) { // raw vector. // [[cpp11::register]] -extern "C" SEXP read_connection_(SEXP con_sxp, SEXP read_size_sxp) { +cpp11::sexp read_connection_(SEXP con_sxp, SEXP read_size_sxp) { BEGIN_CPP std::vector buffer; diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 0017a11c..b1055e9c 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -6,399 +6,399 @@ #include // connection.cpp -extern "C" SEXP read_connection_(SEXP con_sxp, SEXP read_size_sxp); +cpp11::sexp read_connection_(SEXP con_sxp, SEXP read_size_sxp); extern "C" SEXP _xml2_read_connection_(SEXP con_sxp, SEXP read_size_sxp) { BEGIN_CPP11 return cpp11::as_sexp(read_connection_(cpp11::as_cpp>(con_sxp), cpp11::as_cpp>(read_size_sxp))); END_CPP11 } // xml2_doc.cpp -extern "C" SEXP xml_parse_options_(); +cpp11::sexp xml_parse_options_(); extern "C" SEXP _xml2_xml_parse_options_() { BEGIN_CPP11 return cpp11::as_sexp(xml_parse_options_()); END_CPP11 } // xml2_doc.cpp -extern "C" SEXP doc_parse_file(SEXP path_sxp, SEXP encoding_sxp, SEXP as_html_sxp, SEXP options_sxp); +cpp11::sexp doc_parse_file(SEXP path_sxp, SEXP encoding_sxp, SEXP as_html_sxp, SEXP options_sxp); extern "C" SEXP _xml2_doc_parse_file(SEXP path_sxp, SEXP encoding_sxp, SEXP as_html_sxp, SEXP options_sxp) { BEGIN_CPP11 return cpp11::as_sexp(doc_parse_file(cpp11::as_cpp>(path_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(as_html_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_doc.cpp -extern "C" SEXP doc_parse_raw(SEXP x, SEXP encoding_sxp, SEXP base_url_sxp, SEXP as_html_sxp, SEXP options_sxp); +cpp11::sexp doc_parse_raw(SEXP x, SEXP encoding_sxp, SEXP base_url_sxp, SEXP as_html_sxp, SEXP options_sxp); extern "C" SEXP _xml2_doc_parse_raw(SEXP x, SEXP encoding_sxp, SEXP base_url_sxp, SEXP as_html_sxp, SEXP options_sxp) { BEGIN_CPP11 return cpp11::as_sexp(doc_parse_raw(cpp11::as_cpp>(x), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(base_url_sxp), cpp11::as_cpp>(as_html_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_doc.cpp -extern "C" SEXP doc_root(SEXP x); +cpp11::sexp doc_root(SEXP x); extern "C" SEXP _xml2_doc_root(SEXP x) { BEGIN_CPP11 return cpp11::as_sexp(doc_root(cpp11::as_cpp>(x))); END_CPP11 } // xml2_doc.cpp -extern "C" SEXP doc_has_root(SEXP x_sxp); +cpp11::sexp doc_has_root(SEXP x_sxp); extern "C" SEXP _xml2_doc_has_root(SEXP x_sxp) { BEGIN_CPP11 return cpp11::as_sexp(doc_has_root(cpp11::as_cpp>(x_sxp))); END_CPP11 } // xml2_doc.cpp -extern "C" SEXP doc_url(SEXP doc_sxp); +cpp11::sexp doc_url(SEXP doc_sxp); extern "C" SEXP _xml2_doc_url(SEXP doc_sxp) { BEGIN_CPP11 return cpp11::as_sexp(doc_url(cpp11::as_cpp>(doc_sxp))); END_CPP11 } // xml2_doc.cpp -extern "C" SEXP doc_new(SEXP version_sxp, SEXP encoding_sxp); +cpp11::sexp doc_new(SEXP version_sxp, SEXP encoding_sxp); extern "C" SEXP _xml2_doc_new(SEXP version_sxp, SEXP encoding_sxp) { BEGIN_CPP11 return cpp11::as_sexp(doc_new(cpp11::as_cpp>(version_sxp), cpp11::as_cpp>(encoding_sxp))); END_CPP11 } // xml2_doc.cpp -extern "C" SEXP doc_set_root(SEXP doc_sxp, SEXP root_sxp); +cpp11::sexp doc_set_root(SEXP doc_sxp, SEXP root_sxp); extern "C" SEXP _xml2_doc_set_root(SEXP doc_sxp, SEXP root_sxp) { BEGIN_CPP11 return cpp11::as_sexp(doc_set_root(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(root_sxp))); END_CPP11 } // xml2_doc.cpp -extern "C" SEXP doc_is_html(SEXP doc_sxp); +cpp11::sexp doc_is_html(SEXP doc_sxp); extern "C" SEXP _xml2_doc_is_html(SEXP doc_sxp) { BEGIN_CPP11 return cpp11::as_sexp(doc_is_html(cpp11::as_cpp>(doc_sxp))); END_CPP11 } // xml2_init.cpp -extern "C" SEXP init_libxml2(); +cpp11::sexp init_libxml2(); extern "C" SEXP _xml2_init_libxml2() { BEGIN_CPP11 return cpp11::as_sexp(init_libxml2()); END_CPP11 } // xml2_init.cpp -extern "C" SEXP libxml2_version_(); +cpp11::sexp libxml2_version_(); extern "C" SEXP _xml2_libxml2_version_() { BEGIN_CPP11 return cpp11::as_sexp(libxml2_version_()); END_CPP11 } // xml2_namespace.cpp -extern "C" SEXP unique_ns(SEXP ns); +cpp11::sexp unique_ns(SEXP ns); extern "C" SEXP _xml2_unique_ns(SEXP ns) { BEGIN_CPP11 return cpp11::as_sexp(unique_ns(cpp11::as_cpp>(ns))); END_CPP11 } // xml2_namespace.cpp -extern "C" SEXP doc_namespaces(SEXP doc_sxp); +cpp11::sexp doc_namespaces(SEXP doc_sxp); extern "C" SEXP _xml2_doc_namespaces(SEXP doc_sxp) { BEGIN_CPP11 return cpp11::as_sexp(doc_namespaces(cpp11::as_cpp>(doc_sxp))); END_CPP11 } // xml2_namespace.cpp -extern "C" SEXP ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp); +cpp11::sexp ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp); extern "C" SEXP _xml2_ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp) { BEGIN_CPP11 return cpp11::as_sexp(ns_lookup_uri(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(uri_sxp))); END_CPP11 } // xml2_namespace.cpp -extern "C" SEXP ns_lookup(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp); +cpp11::sexp ns_lookup(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp); extern "C" SEXP _xml2_ns_lookup(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { BEGIN_CPP11 return cpp11::as_sexp(ns_lookup(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(prefix_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_name(SEXP node_sxp, SEXP nsMap); +cpp11::sexp node_name(SEXP node_sxp, SEXP nsMap); extern "C" SEXP _xml2_node_name(SEXP node_sxp, SEXP nsMap) { BEGIN_CPP11 return cpp11::as_sexp(node_name(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(nsMap))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_set_name(SEXP node_sxp, SEXP value); +cpp11::sexp node_set_name(SEXP node_sxp, SEXP value); extern "C" SEXP _xml2_node_set_name(SEXP node_sxp, SEXP value) { BEGIN_CPP11 return cpp11::as_sexp(node_set_name(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(value))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_text(SEXP node_sxp); +cpp11::sexp node_text(SEXP node_sxp); extern "C" SEXP _xml2_node_text(SEXP node_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_text(cpp11::as_cpp>(node_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_attr(SEXP node_sxp, SEXP name_sxp, SEXP missing_sxp, SEXP nsMap_sxp); +cpp11::sexp node_attr(SEXP node_sxp, SEXP name_sxp, SEXP missing_sxp, SEXP nsMap_sxp); extern "C" SEXP _xml2_node_attr(SEXP node_sxp, SEXP name_sxp, SEXP missing_sxp, SEXP nsMap_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_attr(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(missing_sxp), cpp11::as_cpp>(nsMap_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_attrs(SEXP node_sxp, SEXP nsMap_sxp); +cpp11::sexp node_attrs(SEXP node_sxp, SEXP nsMap_sxp); extern "C" SEXP _xml2_node_attrs(SEXP node_sxp, SEXP nsMap_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_attrs(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(nsMap_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, SEXP nsMap); +cpp11::sexp node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, SEXP nsMap); extern "C" SEXP _xml2_node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, SEXP nsMap) { BEGIN_CPP11 return cpp11::as_sexp(node_set_attr(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(value), cpp11::as_cpp>(nsMap))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_remove_attr(SEXP node_sxp, SEXP name_sxp, SEXP nsMap); +cpp11::sexp node_remove_attr(SEXP node_sxp, SEXP name_sxp, SEXP nsMap); extern "C" SEXP _xml2_node_remove_attr(SEXP node_sxp, SEXP name_sxp, SEXP nsMap) { BEGIN_CPP11 return cpp11::as_sexp(node_remove_attr(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(nsMap))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_children(SEXP node_sxp, SEXP only_node_sxp); +cpp11::sexp node_children(SEXP node_sxp, SEXP only_node_sxp); extern "C" SEXP _xml2_node_children(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_children(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_length(SEXP node_sxp, SEXP only_node_sxp); +cpp11::sexp node_length(SEXP node_sxp, SEXP only_node_sxp); extern "C" SEXP _xml2_node_length(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_length(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_has_children(SEXP node_sxp, SEXP only_node_sxp); +cpp11::sexp node_has_children(SEXP node_sxp, SEXP only_node_sxp); extern "C" SEXP _xml2_node_has_children(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_has_children(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_parents(SEXP node_sxp); +cpp11::sexp node_parents(SEXP node_sxp); extern "C" SEXP _xml2_node_parents(SEXP node_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_parents(cpp11::as_cpp>(node_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_siblings(SEXP node_sxp, SEXP only_node_sxp); +cpp11::sexp node_siblings(SEXP node_sxp, SEXP only_node_sxp); extern "C" SEXP _xml2_node_siblings(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_siblings(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_parent(SEXP node_sxp); +cpp11::sexp node_parent(SEXP node_sxp); extern "C" SEXP _xml2_node_parent(SEXP node_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_parent(cpp11::as_cpp>(node_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_path(SEXP node_sxp); +cpp11::sexp node_path(SEXP node_sxp); extern "C" SEXP _xml2_node_path(SEXP node_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_path(cpp11::as_cpp>(node_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP nodes_duplicated(SEXP nodes); +cpp11::sexp nodes_duplicated(SEXP nodes); extern "C" SEXP _xml2_nodes_duplicated(SEXP nodes) { BEGIN_CPP11 return cpp11::as_sexp(nodes_duplicated(cpp11::as_cpp>(nodes))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_type(SEXP node_sxp); +cpp11::sexp node_type(SEXP node_sxp); extern "C" SEXP _xml2_node_type(SEXP node_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_type(cpp11::as_cpp>(node_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_copy(SEXP node_sxp); +cpp11::sexp node_copy(SEXP node_sxp); extern "C" SEXP _xml2_node_copy(SEXP node_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_copy(cpp11::as_cpp>(node_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_set_content(SEXP node_sxp, SEXP content); +cpp11::sexp node_set_content(SEXP node_sxp, SEXP content); extern "C" SEXP _xml2_node_set_content(SEXP node_sxp, SEXP content) { BEGIN_CPP11 return cpp11::as_sexp(node_set_content(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(content))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_append_content(SEXP node_sxp, SEXP content); +cpp11::sexp node_append_content(SEXP node_sxp, SEXP content); extern "C" SEXP _xml2_node_append_content(SEXP node_sxp, SEXP content) { BEGIN_CPP11 return cpp11::as_sexp(node_append_content(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(content))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_new_text(SEXP node_sxp, SEXP content); +cpp11::sexp node_new_text(SEXP node_sxp, SEXP content); extern "C" SEXP _xml2_node_new_text(SEXP node_sxp, SEXP content) { BEGIN_CPP11 return cpp11::as_sexp(node_new_text(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(content))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_append_child(SEXP parent_sxp, SEXP cur_sxp); +cpp11::sexp node_append_child(SEXP parent_sxp, SEXP cur_sxp); extern "C" SEXP _xml2_node_append_child(SEXP parent_sxp, SEXP cur_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_append_child(cpp11::as_cpp>(parent_sxp), cpp11::as_cpp>(cur_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_prepend_child(SEXP parent_sxp, SEXP cur_sxp); +cpp11::sexp node_prepend_child(SEXP parent_sxp, SEXP cur_sxp); extern "C" SEXP _xml2_node_prepend_child(SEXP parent_sxp, SEXP cur_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_prepend_child(cpp11::as_cpp>(parent_sxp), cpp11::as_cpp>(cur_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp); +cpp11::sexp node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp); extern "C" SEXP _xml2_node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_prepend_sibling(cpp11::as_cpp>(cur_sxp), cpp11::as_cpp>(elem_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_append_sibling(SEXP cur_sxp, SEXP elem_sxp); +cpp11::sexp node_append_sibling(SEXP cur_sxp, SEXP elem_sxp); extern "C" SEXP _xml2_node_append_sibling(SEXP cur_sxp, SEXP elem_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_append_sibling(cpp11::as_cpp>(cur_sxp), cpp11::as_cpp>(elem_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_replace(SEXP old_sxp, SEXP cur_sxp); +cpp11::sexp node_replace(SEXP old_sxp, SEXP cur_sxp); extern "C" SEXP _xml2_node_replace(SEXP old_sxp, SEXP cur_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_replace(cpp11::as_cpp>(old_sxp), cpp11::as_cpp>(cur_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_remove(SEXP node_sxp, SEXP free_sxp); +cpp11::sexp node_remove(SEXP node_sxp, SEXP free_sxp); extern "C" SEXP _xml2_node_remove(SEXP node_sxp, SEXP free_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_remove(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(free_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_new(SEXP name); +cpp11::sexp node_new(SEXP name); extern "C" SEXP _xml2_node_new(SEXP name) { BEGIN_CPP11 return cpp11::as_sexp(node_new(cpp11::as_cpp>(name))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_cdata_new(SEXP doc_sxp, SEXP content_sxp); +cpp11::sexp node_cdata_new(SEXP doc_sxp, SEXP content_sxp); extern "C" SEXP _xml2_node_cdata_new(SEXP doc_sxp, SEXP content_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_cdata_new(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(content_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_comment_new(SEXP content); +cpp11::sexp node_comment_new(SEXP content); extern "C" SEXP _xml2_node_comment_new(SEXP content) { BEGIN_CPP11 return cpp11::as_sexp(node_comment_new(cpp11::as_cpp>(content))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_new_ns(SEXP name, SEXP ns_sxp); +cpp11::sexp node_new_ns(SEXP name, SEXP ns_sxp); extern "C" SEXP _xml2_node_new_ns(SEXP name, SEXP ns_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_new_ns(cpp11::as_cpp>(name), cpp11::as_cpp>(ns_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri); +cpp11::sexp node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri); extern "C" SEXP _xml2_node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri) { BEGIN_CPP11 return cpp11::as_sexp(node_set_namespace_uri(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(uri))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp); +cpp11::sexp node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp); extern "C" SEXP _xml2_node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_set_namespace_prefix(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(prefix_sxp))); END_CPP11 } // xml2_node.cpp -extern "C" SEXP node_new_dtd(SEXP doc_sxp, SEXP name_sxp, SEXP eid_sxp, SEXP sid_sxp); +cpp11::sexp node_new_dtd(SEXP doc_sxp, SEXP name_sxp, SEXP eid_sxp, SEXP sid_sxp); extern "C" SEXP _xml2_node_new_dtd(SEXP doc_sxp, SEXP name_sxp, SEXP eid_sxp, SEXP sid_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_new_dtd(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(eid_sxp), cpp11::as_cpp>(sid_sxp))); END_CPP11 } // xml2_output.cpp -extern "C" SEXP xml_save_options_(); +cpp11::sexp xml_save_options_(); extern "C" SEXP _xml2_xml_save_options_() { BEGIN_CPP11 return cpp11::as_sexp(xml_save_options_()); END_CPP11 } // xml2_output.cpp -extern "C" SEXP doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp); +cpp11::sexp doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp); extern "C" SEXP _xml2_doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP11 return cpp11::as_sexp(doc_write_file(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(path_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_output.cpp -extern "C" SEXP doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp); +cpp11::sexp doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp); extern "C" SEXP _xml2_doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP11 return cpp11::as_sexp(doc_write_connection(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(connection), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_output.cpp -extern "C" SEXP doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP options_sxp); +cpp11::sexp doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP options_sxp); extern "C" SEXP _xml2_doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP11 return cpp11::as_sexp(doc_write_character(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_output.cpp -extern "C" SEXP node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp); +cpp11::sexp node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp); extern "C" SEXP _xml2_node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_write_file(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(path_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_output.cpp -extern "C" SEXP node_write_connection(SEXP node_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp); +cpp11::sexp node_write_connection(SEXP node_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp); extern "C" SEXP _xml2_node_write_connection(SEXP node_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_write_connection(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(connection), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_output.cpp -extern "C" SEXP node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEXP options_sxp); +cpp11::sexp node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEXP options_sxp); extern "C" SEXP _xml2_node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP11 return cpp11::as_sexp(node_write_character(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_schema.cpp -extern "C" SEXP doc_validate(SEXP doc_sxp, SEXP schema_sxp); +cpp11::sexp doc_validate(SEXP doc_sxp, SEXP schema_sxp); extern "C" SEXP _xml2_doc_validate(SEXP doc_sxp, SEXP schema_sxp) { BEGIN_CPP11 return cpp11::as_sexp(doc_validate(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(schema_sxp))); @@ -440,7 +440,7 @@ extern "C" SEXP _xml2_url_unescape_(SEXP x_sxp) { END_CPP11 } // xml2_xpath.cpp -extern "C" SEXP xpath_search(SEXP node_sxp, SEXP doc_sxp, SEXP xpath_sxp, SEXP nsMap_sxp, SEXP num_results_sxp); +cpp11::sexp xpath_search(SEXP node_sxp, SEXP doc_sxp, SEXP xpath_sxp, SEXP nsMap_sxp, SEXP num_results_sxp); extern "C" SEXP _xml2_xpath_search(SEXP node_sxp, SEXP doc_sxp, SEXP xpath_sxp, SEXP nsMap_sxp, SEXP num_results_sxp) { BEGIN_CPP11 return cpp11::as_sexp(xpath_search(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(xpath_sxp), cpp11::as_cpp>(nsMap_sxp), cpp11::as_cpp>(num_results_sxp))); diff --git a/src/xml2_doc.cpp b/src/xml2_doc.cpp index 087de458..52adffb3 100644 --- a/src/xml2_doc.cpp +++ b/src/xml2_doc.cpp @@ -11,7 +11,7 @@ #include [[cpp11::register]] -extern "C" SEXP xml_parse_options_() { +cpp11::sexp xml_parse_options_() { #if defined(LIBXML_VERSION) && (LIBXML_VERSION >= 20700) #define HAS_OLD10 @@ -184,7 +184,7 @@ extern "C" SEXP xml_parse_options_() { } [[cpp11::register]] -extern "C" SEXP doc_parse_file( +cpp11::sexp doc_parse_file( SEXP path_sxp, SEXP encoding_sxp, SEXP as_html_sxp, @@ -217,7 +217,7 @@ extern "C" SEXP doc_parse_file( } [[cpp11::register]] -extern "C" SEXP doc_parse_raw( +cpp11::sexp doc_parse_raw( SEXP x, SEXP encoding_sxp, SEXP base_url_sxp, @@ -259,7 +259,7 @@ extern "C" SEXP doc_parse_raw( } [[cpp11::register]] -extern "C" SEXP doc_root(SEXP x) { +cpp11::sexp doc_root(SEXP x) { BEGIN_CPP XPtrDoc doc(x); XPtrNode node(xmlDocGetRootElement(doc.checked_get())); @@ -268,7 +268,7 @@ extern "C" SEXP doc_root(SEXP x) { } [[cpp11::register]] -extern "C" SEXP doc_has_root(SEXP x_sxp) { +cpp11::sexp doc_has_root(SEXP x_sxp) { BEGIN_CPP XPtrDoc x(x_sxp); return Rf_ScalarLogical(xmlDocGetRootElement(x.get()) != NULL); @@ -276,7 +276,7 @@ extern "C" SEXP doc_has_root(SEXP x_sxp) { } [[cpp11::register]] -extern "C" SEXP doc_url(SEXP doc_sxp) { +cpp11::sexp doc_url(SEXP doc_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); @@ -293,7 +293,7 @@ extern "C" SEXP doc_url(SEXP doc_sxp) { } [[cpp11::register]] -extern "C" SEXP doc_new(SEXP version_sxp, SEXP encoding_sxp) { +cpp11::sexp doc_new(SEXP version_sxp, SEXP encoding_sxp) { const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); @@ -306,7 +306,7 @@ extern "C" SEXP doc_new(SEXP version_sxp, SEXP encoding_sxp) { } [[cpp11::register]] -extern "C" SEXP doc_set_root(SEXP doc_sxp, SEXP root_sxp) { +cpp11::sexp doc_set_root(SEXP doc_sxp, SEXP root_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode root(root_sxp); @@ -316,7 +316,7 @@ extern "C" SEXP doc_set_root(SEXP doc_sxp, SEXP root_sxp) { } [[cpp11::register]] -extern "C" SEXP doc_is_html(SEXP doc_sxp) { +cpp11::sexp doc_is_html(SEXP doc_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); return Rf_ScalarLogical(doc->properties & XML_DOC_HTML); diff --git a/src/xml2_init.cpp b/src/xml2_init.cpp index 95b1a201..a463b1bb 100644 --- a/src/xml2_init.cpp +++ b/src/xml2_init.cpp @@ -40,7 +40,7 @@ void handleGenericError(void *ctx, const char *fmt, ...) } [[cpp11::register]] -extern "C" SEXP init_libxml2() { +cpp11::sexp init_libxml2() { // Check that header and libs are compatible LIBXML_TEST_VERSION @@ -59,6 +59,6 @@ extern "C" { } [[cpp11::register]] -extern "C" SEXP libxml2_version_(){ +cpp11::sexp libxml2_version_(){ return Rf_mkString(LIBXML_DOTTED_VERSION); } diff --git a/src/xml2_namespace.cpp b/src/xml2_namespace.cpp index 8142962f..e9e6bf1b 100644 --- a/src/xml2_namespace.cpp +++ b/src/xml2_namespace.cpp @@ -10,7 +10,7 @@ #include "xml2_utils.h" [[cpp11::register]] -extern "C" SEXP unique_ns(SEXP ns) { +cpp11::sexp unique_ns(SEXP ns) { BEGIN_CPP return NsMap(ns).out(); END_CPP @@ -29,7 +29,7 @@ void cache_namespace(xmlNode* node, NsMap* nsMap) { } [[cpp11::register]] -extern "C" SEXP doc_namespaces(SEXP doc_sxp) { +cpp11::sexp doc_namespaces(SEXP doc_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); @@ -43,7 +43,7 @@ extern "C" SEXP doc_namespaces(SEXP doc_sxp) { } [[cpp11::register]] -extern "C" SEXP ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp) { +cpp11::sexp ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(node_sxp); @@ -58,7 +58,7 @@ extern "C" SEXP ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp) { } [[cpp11::register]] -extern "C" SEXP ns_lookup(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { +cpp11::sexp ns_lookup(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(node_sxp); diff --git a/src/xml2_node.cpp b/src/xml2_node.cpp index 5af5d12b..56aed88e 100644 --- a/src/xml2_node.cpp +++ b/src/xml2_node.cpp @@ -30,7 +30,7 @@ std::string nodeName(T* node, SEXP nsMap) { } [[cpp11::register]] -extern "C" SEXP node_name(SEXP node_sxp, SEXP nsMap) { +cpp11::sexp node_name(SEXP node_sxp, SEXP nsMap) { BEGIN_CPP XPtrNode node(node_sxp); @@ -40,7 +40,7 @@ extern "C" SEXP node_name(SEXP node_sxp, SEXP nsMap) { } [[cpp11::register]] -extern "C" SEXP node_set_name(SEXP node_sxp, SEXP value) { +cpp11::sexp node_set_name(SEXP node_sxp, SEXP value) { BEGIN_CPP XPtrNode node(node_sxp); @@ -51,7 +51,7 @@ extern "C" SEXP node_set_name(SEXP node_sxp, SEXP value) { } [[cpp11::register]] -extern "C" SEXP node_text(SEXP node_sxp) { +cpp11::sexp node_text(SEXP node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -85,7 +85,7 @@ const xmlChar* xmlNsDefinition(xmlNodePtr node, const xmlChar* lookup) { } [[cpp11::register]] -extern "C" SEXP node_attr( +cpp11::sexp node_attr( SEXP node_sxp, SEXP name_sxp, SEXP missing_sxp, @@ -136,7 +136,7 @@ extern "C" SEXP node_attr( } [[cpp11::register]] -extern "C" SEXP node_attrs(SEXP node_sxp, SEXP nsMap_sxp) { +cpp11::sexp node_attrs(SEXP node_sxp, SEXP nsMap_sxp) { BEGIN_CPP XPtrNode node_(node_sxp); @@ -327,7 +327,7 @@ void removeNs(xmlNodePtr node, const xmlChar* prefix) { } [[cpp11::register]] -extern "C" SEXP node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, SEXP nsMap) { +cpp11::sexp node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, SEXP nsMap) { BEGIN_CPP XPtrNode node_(node_sxp); std::string name(CHAR(STRING_ELT(name_sxp, 0))); @@ -371,7 +371,7 @@ extern "C" SEXP node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, SEXP nsM } [[cpp11::register]] -extern "C" SEXP node_remove_attr(SEXP node_sxp, SEXP name_sxp, SEXP nsMap) { +cpp11::sexp node_remove_attr(SEXP node_sxp, SEXP name_sxp, SEXP nsMap) { BEGIN_CPP XPtrNode node_(node_sxp); std::string name(CHAR(STRING_ELT(name_sxp, 0))); @@ -426,7 +426,7 @@ SEXP asList(std::vector nodes) { } [[cpp11::register]] -extern "C" SEXP node_children(SEXP node_sxp, SEXP only_node_sxp) { +cpp11::sexp node_children(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); bool only_node = LOGICAL(only_node_sxp)[0]; @@ -446,7 +446,7 @@ extern "C" SEXP node_children(SEXP node_sxp, SEXP only_node_sxp) { } [[cpp11::register]] -extern "C" SEXP node_length(SEXP node_sxp, SEXP only_node_sxp) { +cpp11::sexp node_length(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -465,7 +465,7 @@ extern "C" SEXP node_length(SEXP node_sxp, SEXP only_node_sxp) { } [[cpp11::register]] -extern "C" SEXP node_has_children(SEXP node_sxp, SEXP only_node_sxp) { +cpp11::sexp node_has_children(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); bool only_node = LOGICAL(only_node_sxp)[0]; @@ -481,7 +481,7 @@ extern "C" SEXP node_has_children(SEXP node_sxp, SEXP only_node_sxp) { } [[cpp11::register]] -extern "C" SEXP node_parents(SEXP node_sxp) { +cpp11::sexp node_parents(SEXP node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -498,7 +498,7 @@ extern "C" SEXP node_parents(SEXP node_sxp) { } [[cpp11::register]] -extern "C" SEXP node_siblings(SEXP node_sxp, SEXP only_node_sxp) { +cpp11::sexp node_siblings(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); bool only_node = LOGICAL(only_node_sxp)[0]; @@ -526,7 +526,7 @@ extern "C" SEXP node_siblings(SEXP node_sxp, SEXP only_node_sxp) { [[cpp11::register]] -extern "C" SEXP node_parent(SEXP node_sxp) { +cpp11::sexp node_parent(SEXP node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -539,7 +539,7 @@ extern "C" SEXP node_parent(SEXP node_sxp) { } [[cpp11::register]] -extern "C" SEXP node_path(SEXP node_sxp) { +cpp11::sexp node_path(SEXP node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -548,7 +548,7 @@ extern "C" SEXP node_path(SEXP node_sxp) { } [[cpp11::register]] -extern "C" SEXP nodes_duplicated(SEXP nodes) { +cpp11::sexp nodes_duplicated(SEXP nodes) { BEGIN_CPP std::set seen; @@ -578,7 +578,7 @@ extern "C" SEXP nodes_duplicated(SEXP nodes) { } [[cpp11::register]] -extern "C" SEXP node_type(SEXP node_sxp) { +cpp11::sexp node_type(SEXP node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -587,7 +587,7 @@ extern "C" SEXP node_type(SEXP node_sxp) { } [[cpp11::register]] -extern "C" SEXP node_copy(SEXP node_sxp) { +cpp11::sexp node_copy(SEXP node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -598,7 +598,7 @@ extern "C" SEXP node_copy(SEXP node_sxp) { } [[cpp11::register]] -extern "C" SEXP node_set_content(SEXP node_sxp, SEXP content) { +cpp11::sexp node_set_content(SEXP node_sxp, SEXP content) { BEGIN_CPP XPtrNode node(node_sxp); @@ -609,7 +609,7 @@ extern "C" SEXP node_set_content(SEXP node_sxp, SEXP content) { } [[cpp11::register]] -extern "C" SEXP node_append_content(SEXP node_sxp, SEXP content) { +cpp11::sexp node_append_content(SEXP node_sxp, SEXP content) { BEGIN_CPP XPtrNode node(node_sxp); @@ -620,7 +620,7 @@ extern "C" SEXP node_append_content(SEXP node_sxp, SEXP content) { } [[cpp11::register]] -extern "C" SEXP node_new_text(SEXP node_sxp, SEXP content) { +cpp11::sexp node_new_text(SEXP node_sxp, SEXP content) { BEGIN_CPP XPtrNode node(node_sxp); @@ -631,7 +631,7 @@ extern "C" SEXP node_new_text(SEXP node_sxp, SEXP content) { } [[cpp11::register]] -extern "C" SEXP node_append_child(SEXP parent_sxp, SEXP cur_sxp) { +cpp11::sexp node_append_child(SEXP parent_sxp, SEXP cur_sxp) { BEGIN_CPP XPtrNode parent(parent_sxp); XPtrNode cur(cur_sxp); @@ -641,7 +641,7 @@ extern "C" SEXP node_append_child(SEXP parent_sxp, SEXP cur_sxp) { } [[cpp11::register]] -extern "C" SEXP node_prepend_child(SEXP parent_sxp, SEXP cur_sxp) { +cpp11::sexp node_prepend_child(SEXP parent_sxp, SEXP cur_sxp) { BEGIN_CPP XPtrNode parent(parent_sxp); XPtrNode cur(cur_sxp); @@ -654,7 +654,7 @@ extern "C" SEXP node_prepend_child(SEXP parent_sxp, SEXP cur_sxp) { // Previous sibling [[cpp11::register]] -extern "C" SEXP node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp) { +cpp11::sexp node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp) { BEGIN_CPP XPtrNode cur(cur_sxp); XPtrNode elem(elem_sxp); @@ -667,7 +667,7 @@ extern "C" SEXP node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp) { // Append sibling [[cpp11::register]] -extern "C" SEXP node_append_sibling(SEXP cur_sxp, SEXP elem_sxp) { +cpp11::sexp node_append_sibling(SEXP cur_sxp, SEXP elem_sxp) { BEGIN_CPP XPtrNode cur(cur_sxp); XPtrNode elem(elem_sxp); @@ -679,7 +679,7 @@ extern "C" SEXP node_append_sibling(SEXP cur_sxp, SEXP elem_sxp) { // Replace node [[cpp11::register]] -extern "C" SEXP node_replace(SEXP old_sxp, SEXP cur_sxp) { +cpp11::sexp node_replace(SEXP old_sxp, SEXP cur_sxp) { BEGIN_CPP XPtrNode old(old_sxp); XPtrNode cur(cur_sxp); @@ -690,7 +690,7 @@ extern "C" SEXP node_replace(SEXP old_sxp, SEXP cur_sxp) { } [[cpp11::register]] -extern "C" SEXP node_remove(SEXP node_sxp, SEXP free_sxp) { +cpp11::sexp node_remove(SEXP node_sxp, SEXP free_sxp) { BEGIN_CPP XPtrNode node(node_sxp); bool free = LOGICAL(free_sxp)[0]; @@ -705,7 +705,7 @@ extern "C" SEXP node_remove(SEXP node_sxp, SEXP free_sxp) { } [[cpp11::register]] -extern "C" SEXP node_new(SEXP name) { +cpp11::sexp node_new(SEXP name) { BEGIN_CPP XPtrNode node(xmlNewNode(NULL, asXmlChar(name))); return SEXP(node); @@ -714,7 +714,7 @@ extern "C" SEXP node_new(SEXP name) { [[cpp11::register]] -extern "C" SEXP node_cdata_new(SEXP doc_sxp, SEXP content_sxp) { +cpp11::sexp node_cdata_new(SEXP doc_sxp, SEXP content_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(xmlNewCDataBlock(doc.checked_get(), asXmlChar(content_sxp), Rf_xlength(STRING_ELT(content_sxp, 0)))); @@ -723,7 +723,7 @@ extern "C" SEXP node_cdata_new(SEXP doc_sxp, SEXP content_sxp) { } [[cpp11::register]] -extern "C" SEXP node_comment_new(SEXP content) { +cpp11::sexp node_comment_new(SEXP content) { BEGIN_CPP XPtrNode node(xmlNewComment(asXmlChar(content))); return SEXP(node); @@ -731,7 +731,7 @@ extern "C" SEXP node_comment_new(SEXP content) { } [[cpp11::register]] -extern "C" SEXP node_new_ns(SEXP name, SEXP ns_sxp) { +cpp11::sexp node_new_ns(SEXP name, SEXP ns_sxp) { BEGIN_CPP XPtrNs ns(ns_sxp); XPtrNode node(xmlNewNode(ns.checked_get(), asXmlChar(name))); @@ -740,7 +740,7 @@ extern "C" SEXP node_new_ns(SEXP name, SEXP ns_sxp) { } [[cpp11::register]] -extern "C" SEXP node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri) { +cpp11::sexp node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri) { BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(node_sxp); @@ -754,7 +754,7 @@ extern "C" SEXP node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri) { } [[cpp11::register]] -extern "C" SEXP node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { +cpp11::sexp node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(node_sxp); @@ -773,7 +773,7 @@ extern "C" SEXP node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP pref } [[cpp11::register]] -extern "C" SEXP node_new_dtd(SEXP doc_sxp, SEXP name_sxp, SEXP eid_sxp, SEXP sid_sxp) { +cpp11::sexp node_new_dtd(SEXP doc_sxp, SEXP name_sxp, SEXP eid_sxp, SEXP sid_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); std::string name(CHAR(STRING_ELT(name_sxp, 0))); diff --git a/src/xml2_output.cpp b/src/xml2_output.cpp index 360efc99..84d36650 100644 --- a/src/xml2_output.cpp +++ b/src/xml2_output.cpp @@ -46,7 +46,7 @@ typedef struct { } xml_save_def; [[cpp11::register]] -extern "C" SEXP xml_save_options_() { +cpp11::sexp xml_save_options_() { static const xml_save_def entries[] = { {"format", "Format output", XML_SAVE_FORMAT}, @@ -100,7 +100,7 @@ int xml_write_callback(SEXP con, const char * buffer, int len) { } [[cpp11::register]] -extern "C" SEXP doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { +cpp11::sexp doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); @@ -122,7 +122,7 @@ extern "C" SEXP doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, S } [[cpp11::register]] -extern "C" SEXP doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { +cpp11::sexp doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); @@ -147,7 +147,7 @@ extern "C" SEXP doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encodin } [[cpp11::register]] -extern "C" SEXP doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP options_sxp) { +cpp11::sexp doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); @@ -177,7 +177,7 @@ extern "C" SEXP doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP option } [[cpp11::register]] -extern "C" SEXP node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { +cpp11::sexp node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP XPtrNode node(node_sxp); const char* path = CHAR(STRING_ELT(path_sxp, 0)); @@ -198,7 +198,7 @@ extern "C" SEXP node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, } [[cpp11::register]] -extern "C" SEXP node_write_connection(SEXP node_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { +cpp11::sexp node_write_connection(SEXP node_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP XPtrNode node(node_sxp); SEXP con = R_GetConnection(connection); @@ -222,7 +222,7 @@ extern "C" SEXP node_write_connection(SEXP node_sxp, SEXP connection, SEXP encod } [[cpp11::register]] -extern "C" SEXP node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEXP options_sxp) { +cpp11::sexp node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP XPtrNode node(node_sxp); const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); diff --git a/src/xml2_schema.cpp b/src/xml2_schema.cpp index 0f5de518..b83609ff 100644 --- a/src/xml2_schema.cpp +++ b/src/xml2_schema.cpp @@ -19,7 +19,7 @@ void handleSchemaError(void* userData, xmlError* error) { } [[cpp11::register]] -extern "C" SEXP doc_validate(SEXP doc_sxp, SEXP schema_sxp) { +cpp11::sexp doc_validate(SEXP doc_sxp, SEXP schema_sxp) { XPtrDoc doc(doc_sxp); XPtrDoc schema(schema_sxp); diff --git a/src/xml2_xpath.cpp b/src/xml2_xpath.cpp index 24796122..02920687 100644 --- a/src/xml2_xpath.cpp +++ b/src/xml2_xpath.cpp @@ -105,7 +105,7 @@ class XmlSeeker { }; [[cpp11::register]] -extern "C" SEXP xpath_search(SEXP node_sxp, SEXP doc_sxp, SEXP xpath_sxp, SEXP nsMap_sxp, SEXP num_results_sxp) { +cpp11::sexp xpath_search(SEXP node_sxp, SEXP doc_sxp, SEXP xpath_sxp, SEXP nsMap_sxp, SEXP num_results_sxp) { XPtrNode node(node_sxp); XPtrDoc doc(doc_sxp); From 44eddbeadf6459d6f1fe808a1eb7af716e0cbec9 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Mon, 4 Sep 2023 11:10:26 +0000 Subject: [PATCH 05/25] Remove unused `R_ReadConnection()` --- src/connection.h | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/connection.h b/src/connection.h index 19e2de68..ea370741 100644 --- a/src/connection.h +++ b/src/connection.h @@ -14,18 +14,6 @@ SEXP write_bin(SEXP data, SEXP con); inline SEXP R_GetConnection(SEXP con) { return con; } -inline size_t R_ReadConnection(SEXP con, void* buf, size_t n) { - SEXP res = PROTECT(read_bin(con, n)); - - R_xlen_t size = Rf_xlength(res); - - memcpy(buf, RAW(res), size); - - UNPROTECT(1); - - return Rf_xlength(res); -} - inline size_t R_WriteConnection(SEXP con, void* buf, size_t n) { SEXP payload = PROTECT(Rf_allocVector(RAWSXP, n)); From 66f4c602573dbd33b3ff137f0d10619769f51923 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Mon, 4 Sep 2023 13:14:00 +0200 Subject: [PATCH 06/25] Remove unnecessary `R_GetConnection()` --- src/connection.h | 1 - src/xml2_output.cpp | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/connection.h b/src/connection.h index ea370741..a9a8b648 100644 --- a/src/connection.h +++ b/src/connection.h @@ -12,7 +12,6 @@ SEXP read_bin(SEXP con, size_t bytes = 64 * 1024); SEXP write_bin(SEXP data, SEXP con); -inline SEXP R_GetConnection(SEXP con) { return con; } inline size_t R_WriteConnection(SEXP con, void* buf, size_t n) { SEXP payload = PROTECT(Rf_allocVector(RAWSXP, n)); diff --git a/src/xml2_output.cpp b/src/xml2_output.cpp index 84d36650..3b2b1261 100644 --- a/src/xml2_output.cpp +++ b/src/xml2_output.cpp @@ -128,8 +128,6 @@ cpp11::sexp doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encoding_sx const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); int options = INTEGER(options_sxp)[0]; - SEXP con = R_GetConnection(connection); - xmlSaveCtxtPtr savectx = xmlSaveToIO( reinterpret_cast(xml_write_callback), NULL, @@ -201,7 +199,6 @@ cpp11::sexp node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, SEX cpp11::sexp node_write_connection(SEXP node_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP XPtrNode node(node_sxp); - SEXP con = R_GetConnection(connection); const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); int options = INTEGER(options_sxp)[0]; From cd54aedfe8191ec4367fc77315b84fd34517b198 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Mon, 4 Sep 2023 11:21:38 +0000 Subject: [PATCH 07/25] Migrate `xml2_output.cpp` --- DESCRIPTION | 2 +- src/connection.cpp | 9 ++-- src/connection.h | 3 +- src/cpp11.cpp | 26 +++++------ src/xml2_output.cpp | 102 ++++++++++++++++++-------------------------- 5 files changed, 59 insertions(+), 83 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 20736e93..918feda5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -42,10 +42,10 @@ SystemRequirements: libxml2: libxml2-dev (deb), libxml2-devel (rpm) Collate: 'S4.R' 'as_list.R' - 'cpp11.R' 'xml_parse.R' 'as_xml_document.R' 'classes.R' + 'cpp11.R' 'format.R' 'import-standalone-obj-type.R' 'import-standalone-purrr.R' diff --git a/src/connection.cpp b/src/connection.cpp index 7015b98c..8f694209 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -20,12 +20,9 @@ SEXP read_bin(SEXP con, size_t bytes) { } // Wrapper around R's write_bin function -SEXP write_bin(SEXP data, SEXP con) { - SEXP e; - PROTECT(e = Rf_lang3(Rf_install("writeBin"), data, con)); - SEXP res = Rf_eval(e, R_GlobalEnv); - UNPROTECT(1); - return res; +cpp11::sexp write_bin(cpp11::sexp data, cpp11::sexp con) { + cpp11::function write_bin = cpp11::package("base")["writeBin"]; + return write_bin(data, con); } // Read data from a connection in chunks and then combine into a single diff --git a/src/connection.h b/src/connection.h index a9a8b648..d6ad6b8b 100644 --- a/src/connection.h +++ b/src/connection.h @@ -10,8 +10,7 @@ #include SEXP read_bin(SEXP con, size_t bytes = 64 * 1024); -SEXP write_bin(SEXP data, SEXP con); - +cpp11::sexp write_bin(cpp11::sexp data, cpp11::sexp con); inline size_t R_WriteConnection(SEXP con, void* buf, size_t n) { SEXP payload = PROTECT(Rf_allocVector(RAWSXP, n)); diff --git a/src/cpp11.cpp b/src/cpp11.cpp index b1055e9c..62e424d6 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -349,52 +349,52 @@ extern "C" SEXP _xml2_node_new_dtd(SEXP doc_sxp, SEXP name_sxp, SEXP eid_sxp, SE END_CPP11 } // xml2_output.cpp -cpp11::sexp xml_save_options_(); +cpp11::writable::integers xml_save_options_(); extern "C" SEXP _xml2_xml_save_options_() { BEGIN_CPP11 return cpp11::as_sexp(xml_save_options_()); END_CPP11 } // xml2_output.cpp -cpp11::sexp doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp); +cpp11::sexp doc_write_file(cpp11::sexp doc_sxp, cpp11::strings path_sxp, cpp11::strings encoding_sxp, cpp11::integers options_sxp); extern "C" SEXP _xml2_doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_write_file(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(path_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); + return cpp11::as_sexp(doc_write_file(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(path_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_output.cpp -cpp11::sexp doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp); +cpp11::sexp doc_write_connection(cpp11::sexp doc_sxp, cpp11::sexp connection, cpp11::strings encoding_sxp, cpp11::integers options_sxp); extern "C" SEXP _xml2_doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_write_connection(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(connection), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); + return cpp11::as_sexp(doc_write_connection(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(connection), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_output.cpp -cpp11::sexp doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP options_sxp); +cpp11::writable::strings doc_write_character(cpp11::sexp doc_sxp, cpp11::strings encoding_sxp, cpp11::integers options_sxp); extern "C" SEXP _xml2_doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_write_character(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); + return cpp11::as_sexp(doc_write_character(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_output.cpp -cpp11::sexp node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp); +cpp11::sexp node_write_file(cpp11::sexp node_sxp, cpp11::strings path_sxp, cpp11::strings encoding_sxp, cpp11::integers options_sxp); extern "C" SEXP _xml2_node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_write_file(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(path_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); + return cpp11::as_sexp(node_write_file(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(path_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_output.cpp -cpp11::sexp node_write_connection(SEXP node_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp); +cpp11::sexp node_write_connection(cpp11::sexp node_sxp, cpp11::sexp connection, cpp11::strings encoding_sxp, cpp11::integers options_sxp); extern "C" SEXP _xml2_node_write_connection(SEXP node_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_write_connection(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(connection), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); + return cpp11::as_sexp(node_write_connection(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(connection), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_output.cpp -cpp11::sexp node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEXP options_sxp); +cpp11::writable::strings node_write_character(cpp11::sexp node_sxp, cpp11::strings encoding_sxp, cpp11::integers options_sxp); extern "C" SEXP _xml2_node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEXP options_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_write_character(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); + return cpp11::as_sexp(node_write_character(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_schema.cpp diff --git a/src/xml2_output.cpp b/src/xml2_output.cpp index 3b2b1261..3e53b512 100644 --- a/src/xml2_output.cpp +++ b/src/xml2_output.cpp @@ -46,7 +46,7 @@ typedef struct { } xml_save_def; [[cpp11::register]] -cpp11::sexp xml_save_options_() { +cpp11::writable::integers xml_save_options_() { static const xml_save_def entries[] = { {"format", "Format output", XML_SAVE_FORMAT}, @@ -71,21 +71,18 @@ cpp11::sexp xml_save_options_() { ++n; } - SEXP names = PROTECT(Rf_allocVector(STRSXP, n)); - SEXP descriptions = PROTECT(Rf_allocVector(STRSXP, n)); - SEXP values = PROTECT(Rf_allocVector(INTSXP, n)); + cpp11::writable::strings names(n); + cpp11::writable::strings descriptions(n); + cpp11::writable::integers values(n); - - for (R_xlen_t i = 0;i < n; ++i) { - SET_STRING_ELT(names, i, Rf_mkChar(entries[i].name)); - SET_STRING_ELT(descriptions, i, Rf_mkChar(entries[i].description)); - INTEGER(values)[i] = entries[i].value; + for (R_xlen_t i = 0; i < n; ++i) { + names[i] = entries[i].name; + descriptions[i] = entries[i].description; + values[i] = entries[i].value; } - Rf_setAttrib(values, R_NamesSymbol, names); - Rf_setAttrib(values, Rf_install("descriptions"), descriptions); - - UNPROTECT(3); + values.names() = names; + values.attr("descriptions") = descriptions; return values; } @@ -94,19 +91,17 @@ int xml_write_callback(SEXP con, const char * buffer, int len) { size_t write_size; if ((write_size = R_WriteConnection(con, (void *) buffer, len)) != static_cast(len)) { - Rf_error("write failed, expected %l, got %l", len, write_size); + cpp11::stop("write failed, expected %l, got %l", len, write_size); } return write_size; } [[cpp11::register]] -cpp11::sexp doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { - - BEGIN_CPP +cpp11::sexp doc_write_file(cpp11::sexp doc_sxp, cpp11::strings path_sxp, cpp11::strings encoding_sxp, cpp11::integers options_sxp) { XPtrDoc doc(doc_sxp); - const char* path = CHAR(STRING_ELT(path_sxp, 0)); - const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); - int options = INTEGER(options_sxp)[0]; + const char* path = cpp11::as_cpp(path_sxp); + const char* encoding = cpp11::as_cpp(encoding_sxp); + int options = options_sxp[0]; xmlSaveCtxtPtr savectx = xmlSaveToFilename( path, @@ -114,42 +109,38 @@ cpp11::sexp doc_write_file(SEXP doc_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options); xmlSaveDoc(savectx, doc.checked_get()); if (xmlSaveClose(savectx) == -1) { - Rf_error("Error closing file"); + cpp11::stop("Error closing file"); } return R_NilValue; - END_CPP } [[cpp11::register]] -cpp11::sexp doc_write_connection(SEXP doc_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { - BEGIN_CPP +cpp11::sexp doc_write_connection(cpp11::sexp doc_sxp, cpp11::sexp connection, cpp11::strings encoding_sxp, cpp11::integers options_sxp) { XPtrDoc doc(doc_sxp); - const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); - int options = INTEGER(options_sxp)[0]; + const char* encoding = cpp11::as_cpp(encoding_sxp); + int options = options_sxp[0]; xmlSaveCtxtPtr savectx = xmlSaveToIO( reinterpret_cast(xml_write_callback), NULL, - con, + connection, encoding, options); xmlSaveDoc(savectx, doc.checked_get()); if (xmlSaveClose(savectx) == -1) { - Rf_error("Error closing connection"); + cpp11::stop("Error closing connection"); } return R_NilValue; - END_CPP } [[cpp11::register]] -cpp11::sexp doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP options_sxp) { - BEGIN_CPP +cpp11::writable::strings doc_write_character(cpp11::sexp doc_sxp, cpp11::strings encoding_sxp, cpp11::integers options_sxp) { XPtrDoc doc(doc_sxp); - const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); - int options = INTEGER(options_sxp)[0]; + const char* encoding = cpp11::as_cpp(encoding_sxp); + int options = options_sxp[0]; xmlBufferPtr buffer = xmlBufferCreate(); @@ -161,26 +152,21 @@ cpp11::sexp doc_write_character(SEXP doc_sxp, SEXP encoding_sxp, SEXP options_sx xmlSaveDoc(savectx, doc.checked_get()); if (xmlSaveClose(savectx) == -1) { xmlFree(buffer); - Rf_error("Error writing to buffer"); + cpp11::stop("Error writing to buffer"); } - SEXP out = PROTECT(Rf_allocVector(STRSXP, 1)); - SET_STRING_ELT(out, 0, Xml2String(buffer->content).asRString()); + cpp11::writable::strings out(Xml2String(buffer->content).asRString()); xmlFree(buffer); - UNPROTECT(1); - return out; - END_CPP } [[cpp11::register]] -cpp11::sexp node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, SEXP options_sxp) { - BEGIN_CPP +cpp11::sexp node_write_file(cpp11::sexp node_sxp, cpp11::strings path_sxp, cpp11::strings encoding_sxp, cpp11::integers options_sxp) { XPtrNode node(node_sxp); - const char* path = CHAR(STRING_ELT(path_sxp, 0)); - const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); - int options = INTEGER(options_sxp)[0]; + const char* path = cpp11::as_cpp(path_sxp); + const char* encoding = cpp11::as_cpp(encoding_sxp); + int options = options_sxp[0]; xmlSaveCtxtPtr savectx = xmlSaveToFilename( path, @@ -188,42 +174,38 @@ cpp11::sexp node_write_file(SEXP node_sxp, SEXP path_sxp, SEXP encoding_sxp, SEX options); xmlSaveTree(savectx, node.checked_get()); if (xmlSaveClose(savectx) == -1) { - Rf_error("Error closing file"); + cpp11::stop("Error closing file"); } return R_NilValue; - END_CPP } [[cpp11::register]] -cpp11::sexp node_write_connection(SEXP node_sxp, SEXP connection, SEXP encoding_sxp, SEXP options_sxp) { - BEGIN_CPP +cpp11::sexp node_write_connection(cpp11::sexp node_sxp, cpp11::sexp connection, cpp11::strings encoding_sxp, cpp11::integers options_sxp) { XPtrNode node(node_sxp); - const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); - int options = INTEGER(options_sxp)[0]; + const char* encoding = cpp11::as_cpp(encoding_sxp); + int options = options_sxp[0]; xmlSaveCtxtPtr savectx = xmlSaveToIO( (xmlOutputWriteCallback)xml_write_callback, NULL, - con, + connection, encoding, options); xmlSaveTree(savectx, node.checked_get()); if (xmlSaveClose(savectx) == -1) { - Rf_error("Error closing connection"); + cpp11::stop("Error closing connection"); } return R_NilValue; - END_CPP } [[cpp11::register]] -cpp11::sexp node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEXP options_sxp) { - BEGIN_CPP +cpp11::writable::strings node_write_character(cpp11::sexp node_sxp, cpp11::strings encoding_sxp, cpp11::integers options_sxp) { XPtrNode node(node_sxp); - const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); - int options = INTEGER(options_sxp)[0]; + const char* encoding = cpp11::as_cpp(encoding_sxp); + int options = options_sxp[0]; xmlBufferPtr buffer = xmlBufferCreate(); @@ -235,12 +217,10 @@ cpp11::sexp node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEXP options_ xmlSaveTree(savectx, node.checked_get()); if (xmlSaveClose(savectx) == -1) { xmlFree(buffer); - Rf_error("Error writing to buffer"); + cpp11::stop("Error writing to buffer"); } - SEXP out = PROTECT(Rf_ScalarString(Xml2String(buffer->content).asRString())); + cpp11::writable::strings out(Xml2String(buffer->content).asRString()); xmlFree(buffer); - UNPROTECT(1); return out; - END_CPP } From e351747e1b2894e6aa0cd55361518cd6e79b9cb7 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Mon, 4 Sep 2023 11:49:22 +0000 Subject: [PATCH 08/25] Convert `xml2_doc.cpp` --- src/cpp11.cpp | 32 +++++++------- src/xml2_doc.cpp | 110 ++++++++++++++++------------------------------- 2 files changed, 54 insertions(+), 88 deletions(-) diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 62e424d6..007a1382 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -20,59 +20,59 @@ extern "C" SEXP _xml2_xml_parse_options_() { END_CPP11 } // xml2_doc.cpp -cpp11::sexp doc_parse_file(SEXP path_sxp, SEXP encoding_sxp, SEXP as_html_sxp, SEXP options_sxp); +cpp11::sexp doc_parse_file(cpp11::strings path_sxp, cpp11::strings encoding_sxp, cpp11::logicals as_html_sxp, cpp11::integers options_sxp); extern "C" SEXP _xml2_doc_parse_file(SEXP path_sxp, SEXP encoding_sxp, SEXP as_html_sxp, SEXP options_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_parse_file(cpp11::as_cpp>(path_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(as_html_sxp), cpp11::as_cpp>(options_sxp))); + return cpp11::as_sexp(doc_parse_file(cpp11::as_cpp>(path_sxp), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(as_html_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_doc.cpp -cpp11::sexp doc_parse_raw(SEXP x, SEXP encoding_sxp, SEXP base_url_sxp, SEXP as_html_sxp, SEXP options_sxp); +cpp11::sexp doc_parse_raw(cpp11::raws x, cpp11::strings encoding_sxp, cpp11::strings base_url_sxp, cpp11::logicals as_html_sxp, cpp11::integers options_sxp); extern "C" SEXP _xml2_doc_parse_raw(SEXP x, SEXP encoding_sxp, SEXP base_url_sxp, SEXP as_html_sxp, SEXP options_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_parse_raw(cpp11::as_cpp>(x), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(base_url_sxp), cpp11::as_cpp>(as_html_sxp), cpp11::as_cpp>(options_sxp))); + return cpp11::as_sexp(doc_parse_raw(cpp11::as_cpp>(x), cpp11::as_cpp>(encoding_sxp), cpp11::as_cpp>(base_url_sxp), cpp11::as_cpp>(as_html_sxp), cpp11::as_cpp>(options_sxp))); END_CPP11 } // xml2_doc.cpp -cpp11::sexp doc_root(SEXP x); +cpp11::sexp doc_root(cpp11::sexp x); extern "C" SEXP _xml2_doc_root(SEXP x) { BEGIN_CPP11 - return cpp11::as_sexp(doc_root(cpp11::as_cpp>(x))); + return cpp11::as_sexp(doc_root(cpp11::as_cpp>(x))); END_CPP11 } // xml2_doc.cpp -cpp11::sexp doc_has_root(SEXP x_sxp); +cpp11::logicals doc_has_root(cpp11::sexp x_sxp); extern "C" SEXP _xml2_doc_has_root(SEXP x_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_has_root(cpp11::as_cpp>(x_sxp))); + return cpp11::as_sexp(doc_has_root(cpp11::as_cpp>(x_sxp))); END_CPP11 } // xml2_doc.cpp -cpp11::sexp doc_url(SEXP doc_sxp); +cpp11::strings doc_url(cpp11::sexp doc_sxp); extern "C" SEXP _xml2_doc_url(SEXP doc_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_url(cpp11::as_cpp>(doc_sxp))); + return cpp11::as_sexp(doc_url(cpp11::as_cpp>(doc_sxp))); END_CPP11 } // xml2_doc.cpp -cpp11::sexp doc_new(SEXP version_sxp, SEXP encoding_sxp); +cpp11::sexp doc_new(cpp11::sexp version_sxp, cpp11::strings encoding_sxp); extern "C" SEXP _xml2_doc_new(SEXP version_sxp, SEXP encoding_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_new(cpp11::as_cpp>(version_sxp), cpp11::as_cpp>(encoding_sxp))); + return cpp11::as_sexp(doc_new(cpp11::as_cpp>(version_sxp), cpp11::as_cpp>(encoding_sxp))); END_CPP11 } // xml2_doc.cpp -cpp11::sexp doc_set_root(SEXP doc_sxp, SEXP root_sxp); +cpp11::sexp doc_set_root(cpp11::sexp doc_sxp, cpp11::sexp root_sxp); extern "C" SEXP _xml2_doc_set_root(SEXP doc_sxp, SEXP root_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_set_root(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(root_sxp))); + return cpp11::as_sexp(doc_set_root(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(root_sxp))); END_CPP11 } // xml2_doc.cpp -cpp11::sexp doc_is_html(SEXP doc_sxp); +cpp11::sexp doc_is_html(cpp11::sexp doc_sxp); extern "C" SEXP _xml2_doc_is_html(SEXP doc_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_is_html(cpp11::as_cpp>(doc_sxp))); + return cpp11::as_sexp(doc_is_html(cpp11::as_cpp>(doc_sxp))); END_CPP11 } // xml2_init.cpp diff --git a/src/xml2_doc.cpp b/src/xml2_doc.cpp index 52adffb3..9703c11b 100644 --- a/src/xml2_doc.cpp +++ b/src/xml2_doc.cpp @@ -9,6 +9,7 @@ #include "xml2_types.h" #include "xml2_utils.h" #include +#include [[cpp11::register]] cpp11::sexp xml_parse_options_() { @@ -42,7 +43,7 @@ cpp11::sexp xml_parse_options_() { #define HAS_BIG_LINES #endif - const char * names[] = { + std::vector names = { "RECOVER", "NOENT", "DTDLOAD", @@ -80,7 +81,7 @@ cpp11::sexp xml_parse_options_() { #endif }; - const int values[] = { + std::vector values = { XML_PARSE_RECOVER, XML_PARSE_NOENT, XML_PARSE_DTDLOAD, @@ -118,7 +119,7 @@ cpp11::sexp xml_parse_options_() { #endif }; - const char * descriptions[] = { + std::vector descriptions = { "recover on errors", "substitute entities", "load the external subset", @@ -156,22 +157,10 @@ cpp11::sexp xml_parse_options_() { #endif }; - size_t size = sizeof(values) / sizeof(values[0]); + cpp11::writable::integers out_values(values); - SEXP out_values = PROTECT(Rf_allocVector(INTSXP, size)); - SEXP out_names = PROTECT(Rf_allocVector(STRSXP, size)); - SEXP out_descriptions = PROTECT(Rf_allocVector(STRSXP, size)); - - for (size_t i = 0; i < size; ++i) { - INTEGER(out_values)[i] = values[i]; - SET_STRING_ELT(out_names, i, Rf_mkChar(names[i])); - SET_STRING_ELT(out_descriptions, i, Rf_mkChar(descriptions[i])); - } - - Rf_setAttrib(out_values, R_NamesSymbol, out_names); - Rf_setAttrib(out_values, Rf_install("descriptions"), out_descriptions); - - UNPROTECT(3); + out_values.names() = names; + out_values.attr("descriptions") = descriptions; return out_values; @@ -185,15 +174,14 @@ cpp11::sexp xml_parse_options_() { [[cpp11::register]] cpp11::sexp doc_parse_file( - SEXP path_sxp, - SEXP encoding_sxp, - SEXP as_html_sxp, - SEXP options_sxp) { - - const char* path = CHAR(STRING_ELT(path_sxp, 0)); - const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); - bool as_html = LOGICAL(as_html_sxp)[0]; - int options = INTEGER(options_sxp)[0]; + cpp11::strings path_sxp, + cpp11::strings encoding_sxp, + cpp11::logicals as_html_sxp, + cpp11::integers options_sxp) { + const char* path = cpp11::as_cpp(path_sxp); + const char* encoding = cpp11::as_cpp(encoding_sxp); + bool as_html = cpp11::as_cpp(as_html_sxp); + int options = cpp11::as_cpp(options_sxp); xmlDoc* pDoc; if (as_html) { pDoc = htmlReadFile( @@ -210,7 +198,7 @@ cpp11::sexp doc_parse_file( } if (pDoc == NULL) { - Rf_error("Failed to parse %s", path); + cpp11::stop("Failed to parse %s", path); } return SEXP(XPtrDoc(pDoc)); @@ -218,23 +206,21 @@ cpp11::sexp doc_parse_file( [[cpp11::register]] cpp11::sexp doc_parse_raw( - SEXP x, - SEXP encoding_sxp, - SEXP base_url_sxp, - SEXP as_html_sxp, - SEXP options_sxp) { - - BEGIN_CPP - std::string encoding(CHAR(STRING_ELT(encoding_sxp, 0))); - std::string base_url(CHAR(STRING_ELT(base_url_sxp, 0))); - bool as_html = LOGICAL(as_html_sxp)[0]; - int options = INTEGER(options_sxp)[0]; + cpp11::raws x, + cpp11::strings encoding_sxp, + cpp11::strings base_url_sxp, + cpp11::logicals as_html_sxp, + cpp11::integers options_sxp) { + std::string encoding = cpp11::as_cpp(encoding_sxp); + std::string base_url = cpp11::as_cpp(base_url_sxp); + bool as_html = cpp11::as_cpp(as_html_sxp); + int options = cpp11::as_cpp(options_sxp); xmlDoc* pDoc; if (as_html) { pDoc = htmlReadMemory( (const char *) RAW(x), - Rf_length(x), + x.size(), base_url == "" ? NULL : base_url.c_str(), encoding == "" ? NULL : encoding.c_str(), options @@ -242,7 +228,7 @@ cpp11::sexp doc_parse_raw( } else { pDoc = xmlReadMemory( (const char *) RAW(x), - Rf_length(x), + x.size(), base_url == "" ? NULL : base_url.c_str(), encoding == "" ? NULL : encoding.c_str(), options @@ -250,75 +236,55 @@ cpp11::sexp doc_parse_raw( } if (pDoc == NULL) { - Rf_error("Failed to parse text"); + cpp11::stop("Failed to parse text"); } return SEXP(XPtrDoc(pDoc)); - - END_CPP } [[cpp11::register]] -cpp11::sexp doc_root(SEXP x) { - BEGIN_CPP +cpp11::sexp doc_root(cpp11::sexp x) { XPtrDoc doc(x); XPtrNode node(xmlDocGetRootElement(doc.checked_get())); return SEXP(node); - END_CPP } [[cpp11::register]] -cpp11::sexp doc_has_root(SEXP x_sxp) { - BEGIN_CPP +cpp11::logicals doc_has_root(cpp11::sexp x_sxp) { XPtrDoc x(x_sxp); - return Rf_ScalarLogical(xmlDocGetRootElement(x.get()) != NULL); - END_CPP + return cpp11::logicals({xmlDocGetRootElement(x.get()) != NULL}); } [[cpp11::register]] -cpp11::sexp doc_url(SEXP doc_sxp) { - BEGIN_CPP - +cpp11::strings doc_url(cpp11::sexp doc_sxp) { XPtrDoc doc(doc_sxp); if (doc->URL == NULL) { return Rf_ScalarString(NA_STRING); } - SEXP out = PROTECT(Rf_allocVector(STRSXP, 1)); - SET_STRING_ELT(out, 0, Rf_mkCharCE((const char*) doc->URL, CE_UTF8)); - UNPROTECT(1); - - return out; - END_CPP + return cpp11::strings({(const char*) doc->URL}); } [[cpp11::register]] -cpp11::sexp doc_new(SEXP version_sxp, SEXP encoding_sxp) { - - const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0)); +cpp11::sexp doc_new(cpp11::sexp version_sxp, cpp11::strings encoding_sxp) { + const char* encoding = cpp11::as_cpp(encoding_sxp); - BEGIN_CPP XPtrDoc x(xmlNewDoc(asXmlChar(version_sxp))); xmlCharEncodingHandlerPtr p = xmlFindCharEncodingHandler(encoding); x->encoding = xmlStrdup(reinterpret_cast(p->name)); return SEXP(x); - END_CPP } [[cpp11::register]] -cpp11::sexp doc_set_root(SEXP doc_sxp, SEXP root_sxp) { - BEGIN_CPP +cpp11::sexp doc_set_root(cpp11::sexp doc_sxp, cpp11::sexp root_sxp) { XPtrDoc doc(doc_sxp); XPtrNode root(root_sxp); XPtrNode out(xmlDocSetRootElement(doc, root)); return SEXP(out); - END_CPP } [[cpp11::register]] -cpp11::sexp doc_is_html(SEXP doc_sxp) { - BEGIN_CPP +cpp11::sexp doc_is_html(cpp11::sexp doc_sxp) { XPtrDoc doc(doc_sxp); - return Rf_ScalarLogical(doc->properties & XML_DOC_HTML); - END_CPP + return cpp11::logicals({doc->properties & XML_DOC_HTML}); } From 60ae697b69f5a1f3248bf9fc185af888a0b6aded Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Mon, 4 Sep 2023 12:23:16 +0000 Subject: [PATCH 09/25] Convert `xml2_schema.cpp` --- src/cpp11.cpp | 4 ++-- src/xml2_schema.cpp | 19 ++++--------------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 007a1382..9f5d30f1 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -398,10 +398,10 @@ extern "C" SEXP _xml2_node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEX END_CPP11 } // xml2_schema.cpp -cpp11::sexp doc_validate(SEXP doc_sxp, SEXP schema_sxp); +cpp11::logicals doc_validate(cpp11::sexp doc_sxp, cpp11::sexp schema_sxp); extern "C" SEXP _xml2_doc_validate(SEXP doc_sxp, SEXP schema_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_validate(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(schema_sxp))); + return cpp11::as_sexp(doc_validate(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(schema_sxp))); END_CPP11 } // xml2_url.cpp diff --git a/src/xml2_schema.cpp b/src/xml2_schema.cpp index b83609ff..9c6d118e 100644 --- a/src/xml2_schema.cpp +++ b/src/xml2_schema.cpp @@ -19,15 +19,13 @@ void handleSchemaError(void* userData, xmlError* error) { } [[cpp11::register]] -cpp11::sexp doc_validate(SEXP doc_sxp, SEXP schema_sxp) { +cpp11::logicals doc_validate(cpp11::sexp doc_sxp, cpp11::sexp schema_sxp) { XPtrDoc doc(doc_sxp); XPtrDoc schema(schema_sxp); xmlLineNumbersDefault(1); - BEGIN_CPP - std::vector vec; xmlSchemaParserCtxtPtr cptr = xmlSchemaNewDocParserCtxt(schema.checked_get()); @@ -40,23 +38,14 @@ cpp11::sexp doc_validate(SEXP doc_sxp, SEXP schema_sxp) { xmlSchemaSetValidStructuredErrors(vptr, handleSchemaError, &vec); - SEXP out = PROTECT(Rf_allocVector(LGLSXP, 1)); - - LOGICAL(out)[0] = xmlSchemaValidateDoc(vptr, doc.checked_get()) == 0; + bool valid = (xmlSchemaValidateDoc(vptr, doc.checked_get()) == 0); + cpp11::writable::logicals out{valid}; xmlSchemaFreeParserCtxt(cptr); xmlSchemaFreeValidCtxt(vptr); xmlSchemaFree(sptr); - SEXP errors = PROTECT(Rf_allocVector(STRSXP, vec.size())); - for (size_t i = 0; i < vec.size(); ++i) { - SET_STRING_ELT(errors, i, Rf_mkCharLenCE(vec[i].c_str(), vec[i].size(), CE_UTF8)); - } - Rf_setAttrib(out, Rf_install("errors"), errors); + out.attr("errors") = vec; - - UNPROTECT(2); return out; - - END_CPP } From ae3a6ec7625a9467d1ad2f857971a7261794f561 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Mon, 4 Sep 2023 12:54:55 +0000 Subject: [PATCH 10/25] Convert `xml2_path.cpp` --- src/cpp11.cpp | 4 ++-- src/xml2_xpath.cpp | 52 ++++++++++++++++++++-------------------------- 2 files changed, 25 insertions(+), 31 deletions(-) diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 9f5d30f1..3755e70c 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -440,10 +440,10 @@ extern "C" SEXP _xml2_url_unescape_(SEXP x_sxp) { END_CPP11 } // xml2_xpath.cpp -cpp11::sexp xpath_search(SEXP node_sxp, SEXP doc_sxp, SEXP xpath_sxp, SEXP nsMap_sxp, SEXP num_results_sxp); +cpp11::sexp xpath_search(cpp11::sexp node_sxp, cpp11::sexp doc_sxp, cpp11::sexp xpath_sxp, cpp11::strings nsMap_sxp, cpp11::doubles num_results_sxp); extern "C" SEXP _xml2_xpath_search(SEXP node_sxp, SEXP doc_sxp, SEXP xpath_sxp, SEXP nsMap_sxp, SEXP num_results_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(xpath_search(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(xpath_sxp), cpp11::as_cpp>(nsMap_sxp), cpp11::as_cpp>(num_results_sxp))); + return cpp11::as_sexp(xpath_search(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(xpath_sxp), cpp11::as_cpp>(nsMap_sxp), cpp11::as_cpp>(num_results_sxp))); END_CPP11 } diff --git a/src/xml2_xpath.cpp b/src/xml2_xpath.cpp index 02920687..7d848e5b 100644 --- a/src/xml2_xpath.cpp +++ b/src/xml2_xpath.cpp @@ -23,24 +23,24 @@ class XmlSeeker { context_->node = node; } - void registerNamespace(SEXP nsMap) { - R_xlen_t n = Rf_xlength(nsMap); + void registerNamespace(cpp11::strings nsMap) { + R_xlen_t n = nsMap.size(); if (n == 0) { return; } - SEXP prefix = Rf_getAttrib(nsMap, R_NamesSymbol); + cpp11::strings prefix = nsMap.names(); for (int i = 0; i < n; ++i) { - xmlChar* prefixI = (xmlChar*) CHAR(STRING_ELT(prefix, i)); - xmlChar* urlI = (xmlChar*) CHAR(STRING_ELT(nsMap, i)); + xmlChar* prefixI = (xmlChar*) CHAR(prefix[i]); + xmlChar* urlI = (xmlChar*) CHAR(nsMap[i]); if (xmlXPathRegisterNs(context_, prefixI, urlI) != 0) - Rf_error("Failed to register namespace (%s <-> %s)", prefixI, urlI); + cpp11::stop("Failed to register namespace (%s <-> %s)", prefixI, urlI); } } - SEXP search(const char* xpath, int num_results) { + cpp11::sexp search(const char* xpath, int num_results) { result_ = xmlXPathEval((const xmlChar*)xpath, context_); if (result_ == NULL) { SEXP ret = PROTECT(Rf_allocVector(VECSXP, 0)); @@ -61,34 +61,29 @@ class XmlSeeker { } int n = std::min(result_->nodesetval->nodeNr, num_results); - SEXP out = PROTECT(Rf_allocVector(VECSXP, n)); + cpp11::writable::list out(n); - SEXP names = PROTECT(Rf_allocVector(STRSXP, 2)); - SET_STRING_ELT(names, 0, Rf_mkChar("node")); - SET_STRING_ELT(names, 1, Rf_mkChar("doc")); + cpp11::strings names({"node", "doc"}); for (int i = 0; i < n; i++) { - SEXP ret = PROTECT(Rf_allocVector(VECSXP, 2)); + cpp11::writable::list ret({ + XPtrNode(nodes->nodeTab[i]), + doc_ + }); - SET_VECTOR_ELT(ret, 0, XPtrNode(nodes->nodeTab[i])); - SET_VECTOR_ELT(ret, 1, doc_); + ret.names() = names; + ret.attr("class") = "xml_node"; - Rf_setAttrib(ret, R_NamesSymbol, names); - Rf_setAttrib(ret, R_ClassSymbol, Rf_mkString("xml_node")); - - SET_VECTOR_ELT(out, i, ret); - - UNPROTECT(1); + out[i] = ret; } - UNPROTECT(2); return out; } - case XPATH_NUMBER: { return Rf_ScalarReal(result_->floatval); } - case XPATH_BOOLEAN: { return Rf_ScalarLogical(result_->boolval); } - case XPATH_STRING: { return Rf_ScalarString(Rf_mkCharCE((char *) result_->stringval, CE_UTF8)); } + case XPATH_NUMBER: { return cpp11::doubles({result_->floatval}); } + case XPATH_BOOLEAN: { return cpp11::logicals({result_->boolval}); } + case XPATH_STRING: { return cpp11::as_sexp((const char*) result_->stringval); } default: - Rf_error("XPath result type: %d not supported", result_->type); + cpp11::stop("XPath result type: %d not supported", result_->type); } return R_NilValue; @@ -105,16 +100,15 @@ class XmlSeeker { }; [[cpp11::register]] -cpp11::sexp xpath_search(SEXP node_sxp, SEXP doc_sxp, SEXP xpath_sxp, SEXP nsMap_sxp, SEXP num_results_sxp) { - +cpp11::sexp xpath_search(cpp11::sexp node_sxp, cpp11::sexp doc_sxp, cpp11::sexp xpath_sxp, cpp11::strings nsMap_sxp, cpp11::doubles num_results_sxp) { XPtrNode node(node_sxp); XPtrDoc doc(doc_sxp); if (TYPEOF(xpath_sxp) != STRSXP) { Rf_error("XPath must be a string, received %s", Rf_type2char(TYPEOF(xpath_sxp))); } - const char* xpath = CHAR(STRING_ELT(xpath_sxp, 0)); + const char* xpath = CHAR(cpp11::strings(xpath_sxp)[0]); - double num_results = REAL(num_results_sxp)[0]; + double num_results = num_results_sxp[0]; if (num_results == R_PosInf) { num_results = INT_MAX; From 33d6c7e4340f4a59f7c37082fa15d75959544b0f Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Mon, 4 Sep 2023 12:59:31 +0000 Subject: [PATCH 11/25] Fix compilation issues --- src/xml2_doc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xml2_doc.cpp b/src/xml2_doc.cpp index 9703c11b..c0949a00 100644 --- a/src/xml2_doc.cpp +++ b/src/xml2_doc.cpp @@ -262,7 +262,7 @@ cpp11::strings doc_url(cpp11::sexp doc_sxp) { return Rf_ScalarString(NA_STRING); } - return cpp11::strings({(const char*) doc->URL}); + return cpp11::as_sexp((const char*) doc->URL); } [[cpp11::register]] From 8029c3034235b8f0acbd4983188201605082b987 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Mon, 4 Sep 2023 13:13:37 +0000 Subject: [PATCH 12/25] Minor things --- src/xml2_doc.cpp | 2 +- src/xml2_init.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/xml2_doc.cpp b/src/xml2_doc.cpp index c0949a00..302da883 100644 --- a/src/xml2_doc.cpp +++ b/src/xml2_doc.cpp @@ -259,7 +259,7 @@ cpp11::logicals doc_has_root(cpp11::sexp x_sxp) { cpp11::strings doc_url(cpp11::sexp doc_sxp) { XPtrDoc doc(doc_sxp); if (doc->URL == NULL) { - return Rf_ScalarString(NA_STRING); + return cpp11::writable::strings({NA_STRING}); } return cpp11::as_sexp((const char*) doc->URL); diff --git a/src/xml2_init.cpp b/src/xml2_init.cpp index a463b1bb..3bbf7757 100644 --- a/src/xml2_init.cpp +++ b/src/xml2_init.cpp @@ -59,6 +59,6 @@ extern "C" { } [[cpp11::register]] -cpp11::sexp libxml2_version_(){ - return Rf_mkString(LIBXML_DOTTED_VERSION); +cpp11::strings libxml2_version_(){ + return cpp11::strings({LIBXML_DOTTED_VERSION}); } From 33561d8395edcab9e1731a48fa86bcf8067d00ad Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 2 Nov 2023 05:57:00 +0000 Subject: [PATCH 13/25] As `as_cpp()` --- src/xml2_output.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xml2_output.cpp b/src/xml2_output.cpp index 3e53b512..43d5566a 100644 --- a/src/xml2_output.cpp +++ b/src/xml2_output.cpp @@ -119,7 +119,7 @@ cpp11::sexp doc_write_file(cpp11::sexp doc_sxp, cpp11::strings path_sxp, cpp11:: cpp11::sexp doc_write_connection(cpp11::sexp doc_sxp, cpp11::sexp connection, cpp11::strings encoding_sxp, cpp11::integers options_sxp) { XPtrDoc doc(doc_sxp); const char* encoding = cpp11::as_cpp(encoding_sxp); - int options = options_sxp[0]; + int options = cpp11::as_cpp(options_sxp); xmlSaveCtxtPtr savectx = xmlSaveToIO( reinterpret_cast(xml_write_callback), From 10f3f75c68bd4308f5a7b0ea67249f5f640ee24d Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 2 Nov 2023 05:57:49 +0000 Subject: [PATCH 14/25] Use `R_xlen_t` for `size()` method --- src/xml2_url.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/xml2_url.cpp b/src/xml2_url.cpp index 265ad1f5..cf7928a5 100644 --- a/src/xml2_url.cpp +++ b/src/xml2_url.cpp @@ -17,12 +17,12 @@ const xmlChar* to_xml_chr(cpp11::strings x, const char* arg) { [[cpp11::register]] cpp11::strings url_absolute_(cpp11::strings x_sxp, cpp11::strings base_sxp) { - int n = x_sxp.size(); + R_xlen_t n = x_sxp.size(); cpp11::writable::strings out(n); const xmlChar* base_uri = to_xml_chr(base_sxp, "Base URL"); - for (int i = 0; i < n; ++i) { + for (R_xlen_t i = 0; i < n; ++i) { const xmlChar* uri = (xmlChar*) Rf_translateCharUTF8(x_sxp[i]); out[i] = Xml2String(xmlBuildURI(uri, base_uri)).asRString(); } @@ -32,12 +32,12 @@ cpp11::strings url_absolute_(cpp11::strings x_sxp, cpp11::strings base_sxp) { [[cpp11::register]] cpp11::strings url_relative_(cpp11::strings x_sxp, cpp11::strings base_sxp) { - int n = x_sxp.size(); + R_xlen_t n = x_sxp.size(); cpp11::writable::strings out(n); const xmlChar* base_uri = to_xml_chr(base_sxp, "Base URL"); - for (int i = 0; i < n; ++i) { + for (R_xlen_t i = 0; i < n; ++i) { const xmlChar* uri = (xmlChar*) Rf_translateCharUTF8(x_sxp[i]); out[i] = Xml2String(xmlBuildRelativeURI(uri, base_uri)).asRString(); } @@ -47,7 +47,7 @@ cpp11::strings url_relative_(cpp11::strings x_sxp, cpp11::strings base_sxp) { [[cpp11::register]] cpp11::data_frame url_parse_(cpp11::strings x_sxp) { - int n = x_sxp.size(); + R_xlen_t n = x_sxp.size(); cpp11::writable::strings scheme(n); cpp11::writable::strings server(n); @@ -58,7 +58,7 @@ cpp11::data_frame url_parse_(cpp11::strings x_sxp) { cpp11::writable::integers port(n); - for (int i = 0; i < n; ++i) { + for (R_xlen_t i = 0; i < n; ++i) { const char* raw = Rf_translateCharUTF8(x_sxp[i]); xmlURI* uri = xmlParseURI(raw); if (uri == NULL) { @@ -103,12 +103,12 @@ cpp11::data_frame url_parse_(cpp11::strings x_sxp) { [[cpp11::register]] cpp11::strings url_escape_(cpp11::strings x_sxp, cpp11::strings reserved_sxp) { - int n = x_sxp.size(); + R_xlen_t n = x_sxp.size(); cpp11::writable::strings out(n); const xmlChar* xReserved = to_xml_chr(reserved_sxp, "`reserved`"); - for (int i = 0; i < n; ++i) { + for (R_xlen_t i = 0; i < n; ++i) { const xmlChar* xx = (xmlChar*) Rf_translateCharUTF8(x_sxp[i]); out[i] = Xml2String(xmlURIEscapeStr(xx, xReserved)).asRString(); } @@ -118,10 +118,10 @@ cpp11::strings url_escape_(cpp11::strings x_sxp, cpp11::strings reserved_sxp) { [[cpp11::register]] cpp11::strings url_unescape_(cpp11::strings x_sxp) { - int n = x_sxp.size(); + R_xlen_t n = x_sxp.size(); cpp11::writable::strings out(n); - for (int i = 0; i < n; ++i) { + for (R_xlen_t i = 0; i < n; ++i) { const char* xx = Rf_translateCharUTF8(x_sxp[i]); char* unescaped = xmlURIUnescapeString(xx, 0, NULL); From d43f4bfaec17eb032d959653356bf239722256cf Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 2 Nov 2023 06:20:15 +0000 Subject: [PATCH 15/25] Use cpp11 raws with memcpy --- src/connection.h | 9 ++++----- src/cpp11.cpp | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/connection.h b/src/connection.h index d6ad6b8b..bb9a4b79 100644 --- a/src/connection.h +++ b/src/connection.h @@ -13,13 +13,12 @@ SEXP read_bin(SEXP con, size_t bytes = 64 * 1024); cpp11::sexp write_bin(cpp11::sexp data, cpp11::sexp con); inline size_t R_WriteConnection(SEXP con, void* buf, size_t n) { - SEXP payload = PROTECT(Rf_allocVector(RAWSXP, n)); + cpp11::writable::raws payload(n); + SEXP payload_sexp = SEXP(payload); - memcpy(RAW(payload), buf, n); + memcpy(RAW(payload_sexp), buf, n); - write_bin(payload, con); - - UNPROTECT(1); + write_bin(payload_sexp, con); return n; } diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 3755e70c..7cb2a493 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -83,7 +83,7 @@ extern "C" SEXP _xml2_init_libxml2() { END_CPP11 } // xml2_init.cpp -cpp11::sexp libxml2_version_(); +cpp11::strings libxml2_version_(); extern "C" SEXP _xml2_libxml2_version_() { BEGIN_CPP11 return cpp11::as_sexp(libxml2_version_()); From ea377a985ffabe4d47032c1623d3512c0510800f Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 2 Nov 2023 06:25:47 +0000 Subject: [PATCH 16/25] Check for empty vectors as well --- src/xml2_url.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xml2_url.cpp b/src/xml2_url.cpp index cf7928a5..ed181a6c 100644 --- a/src/xml2_url.cpp +++ b/src/xml2_url.cpp @@ -8,7 +8,7 @@ #include "xml2_utils.h" const xmlChar* to_xml_chr(cpp11::strings x, const char* arg) { - if (x.size() > 1) { + if (x.size() != 1) { cpp11::stop("%s must be a character vector of length 1", arg); } From 31e7555ca2049a0f7d1e1233795e25216afedeff Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 2 Nov 2023 10:33:42 +0000 Subject: [PATCH 17/25] Fix ambiguous initializer --- src/xml2_init.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xml2_init.cpp b/src/xml2_init.cpp index 3bbf7757..7ebcfcfb 100644 --- a/src/xml2_init.cpp +++ b/src/xml2_init.cpp @@ -60,5 +60,5 @@ extern "C" { [[cpp11::register]] cpp11::strings libxml2_version_(){ - return cpp11::strings({LIBXML_DOTTED_VERSION}); + return cpp11::writable::strings(cpp11::r_string(LIBXML_DOTTED_VERSION)); } From b7ff7537a89e8cf54d95c147af3cf6859de2a3d6 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 2 Nov 2023 11:00:00 +0000 Subject: [PATCH 18/25] More cpp11 i `xml2_xpath.cpp` --- src/xml2_xpath.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/xml2_xpath.cpp b/src/xml2_xpath.cpp index 7d848e5b..c8e6dd1c 100644 --- a/src/xml2_xpath.cpp +++ b/src/xml2_xpath.cpp @@ -46,6 +46,9 @@ class XmlSeeker { SEXP ret = PROTECT(Rf_allocVector(VECSXP, 0)); Rf_setAttrib(ret, R_ClassSymbol, Rf_mkString("xml_missing")); UNPROTECT(1); + // TODO creating an empty list doesn't work; fails test-xml_find.R:40:3 + // cpp11::writable::list ret; + // ret.attr("class") = "xml_missing"; return ret; } @@ -54,6 +57,7 @@ class XmlSeeker { { xmlNodeSet* nodes = result_->nodesetval; if (nodes == NULL || nodes->nodeNr == 0) { + // TODO SEXP ret = PROTECT(Rf_allocVector(VECSXP, 0)); Rf_setAttrib(ret, R_ClassSymbol, Rf_mkString("xml_missing")); UNPROTECT(1); @@ -104,9 +108,9 @@ cpp11::sexp xpath_search(cpp11::sexp node_sxp, cpp11::sexp doc_sxp, cpp11::sexp XPtrNode node(node_sxp); XPtrDoc doc(doc_sxp); if (TYPEOF(xpath_sxp) != STRSXP) { - Rf_error("XPath must be a string, received %s", Rf_type2char(TYPEOF(xpath_sxp))); + cpp11::stop("XPath must be a string, received %s", Rf_type2char(TYPEOF(xpath_sxp))); } - const char* xpath = CHAR(cpp11::strings(xpath_sxp)[0]); + const char* xpath = cpp11::as_cpp(xpath_sxp); double num_results = num_results_sxp[0]; From 50489ac207e7d6a023a268cfc0f6e453047baa26 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 2 Nov 2023 12:01:54 +0000 Subject: [PATCH 19/25] Minor changes --- src/connection.h | 6 +++--- src/xml2_doc.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/connection.h b/src/connection.h index bb9a4b79..ed796511 100644 --- a/src/connection.h +++ b/src/connection.h @@ -9,12 +9,12 @@ #include #include -SEXP read_bin(SEXP con, size_t bytes = 64 * 1024); +cpp11::sexp read_bin(cpp11::sexp con, size_t bytes = 64 * 1024); cpp11::sexp write_bin(cpp11::sexp data, cpp11::sexp con); -inline size_t R_WriteConnection(SEXP con, void* buf, size_t n) { +inline size_t R_WriteConnection(cpp11::sexp con, void* buf, size_t n) { cpp11::writable::raws payload(n); - SEXP payload_sexp = SEXP(payload); + cpp11::sexp payload_sexp = cpp11::sexp(payload); memcpy(RAW(payload_sexp), buf, n); diff --git a/src/xml2_doc.cpp b/src/xml2_doc.cpp index 302da883..6ffc0a15 100644 --- a/src/xml2_doc.cpp +++ b/src/xml2_doc.cpp @@ -211,8 +211,8 @@ cpp11::sexp doc_parse_raw( cpp11::strings base_url_sxp, cpp11::logicals as_html_sxp, cpp11::integers options_sxp) { - std::string encoding = cpp11::as_cpp(encoding_sxp); - std::string base_url = cpp11::as_cpp(base_url_sxp); + std::string encoding = cpp11::r_string(encoding_sxp[0]); + std::string base_url = cpp11::r_string(base_url_sxp[0]); bool as_html = cpp11::as_cpp(as_html_sxp); int options = cpp11::as_cpp(options_sxp); From 6f0e3535c703fd78250bc31a61339f7f019e4a00 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 2 Nov 2023 12:28:41 +0000 Subject: [PATCH 20/25] Use cpp11 in `xml2_utils.h` --- src/cpp11.cpp | 4 ++-- src/xml2_doc.cpp | 2 +- src/xml2_utils.h | 30 +++++++++++++++--------------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 7cb2a493..f22bf462 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -55,10 +55,10 @@ extern "C" SEXP _xml2_doc_url(SEXP doc_sxp) { END_CPP11 } // xml2_doc.cpp -cpp11::sexp doc_new(cpp11::sexp version_sxp, cpp11::strings encoding_sxp); +cpp11::sexp doc_new(cpp11::strings version_sxp, cpp11::strings encoding_sxp); extern "C" SEXP _xml2_doc_new(SEXP version_sxp, SEXP encoding_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_new(cpp11::as_cpp>(version_sxp), cpp11::as_cpp>(encoding_sxp))); + return cpp11::as_sexp(doc_new(cpp11::as_cpp>(version_sxp), cpp11::as_cpp>(encoding_sxp))); END_CPP11 } // xml2_doc.cpp diff --git a/src/xml2_doc.cpp b/src/xml2_doc.cpp index 6ffc0a15..7a911a0c 100644 --- a/src/xml2_doc.cpp +++ b/src/xml2_doc.cpp @@ -266,7 +266,7 @@ cpp11::strings doc_url(cpp11::sexp doc_sxp) { } [[cpp11::register]] -cpp11::sexp doc_new(cpp11::sexp version_sxp, cpp11::strings encoding_sxp) { +cpp11::sexp doc_new(cpp11::strings version_sxp, cpp11::strings encoding_sxp) { const char* encoding = cpp11::as_cpp(encoding_sxp); XPtrDoc x(xmlNewDoc(asXmlChar(version_sxp))); diff --git a/src/xml2_utils.h b/src/xml2_utils.h index 327ca41a..27eb9d2a 100644 --- a/src/xml2_utils.h +++ b/src/xml2_utils.h @@ -15,8 +15,8 @@ inline const xmlChar* asXmlChar(std::string const& x) { return (const xmlChar*) x.c_str(); } -inline const xmlChar* asXmlChar(SEXP x, int n = 0) { - return (const xmlChar*) CHAR(STRING_ELT(x, n)); +inline const xmlChar* asXmlChar(cpp11::strings x) { + return (const xmlChar*) cpp11::as_cpp(x); } #define BEGIN_CPP try { @@ -64,11 +64,11 @@ class Xml2String { return std::string((char*) string_); } - SEXP asRString(SEXP missing = NA_STRING) { + cpp11::r_string asRString(cpp11::r_string missing = NA_STRING) { if (string_ == NULL) return missing; - return Rf_mkCharCE((char*) string_, CE_UTF8); + return cpp11::r_string((char*) string_); }; }; @@ -87,10 +87,10 @@ class NsMap { } // Initialise from an existing STRSXP - NsMap(SEXP x) { - SEXP names = Rf_getAttrib(x, R_NamesSymbol); - for (R_len_t i = 0; i < Rf_xlength(x); ++i) { - add(std::string(CHAR(STRING_ELT(names, i))), std::string(CHAR(STRING_ELT(x, i)))); + NsMap(cpp11::strings x) { + cpp11::strings names = x.names(); + for (R_len_t i = 0; i < x.size(); ++i) { + add(cpp11::r_string(names[i]), cpp11::r_string(x[i])); } } @@ -128,20 +128,20 @@ class NsMap { return true; } - SEXP out() { - SEXP out = PROTECT(Rf_allocVector(STRSXP, prefix2url.size())); - SEXP names = PROTECT(Rf_allocVector(STRSXP, prefix2url.size())); + cpp11::sexp out() { + int n = prefix2url.size(); + cpp11::writable::strings out(n); + cpp11::writable::strings names(n); size_t i = 0; for (prefix2url_t::const_iterator it = prefix2url.begin(); it != prefix2url.end(); ++it) { - SET_STRING_ELT(out, i, Rf_mkChar(it->second.c_str())); - SET_STRING_ELT(names, i, Rf_mkChar(it->first.c_str())); + out[i] = it->second.c_str(); + names[i] = it->first.c_str(); ++i; } - Rf_setAttrib(out, R_NamesSymbol, names); + out.names() = names; - UNPROTECT(2); return out; } }; From 2539195f8a25788d8a6bf94b7bb57731dcf0e4c5 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Fri, 3 Nov 2023 07:45:46 +0000 Subject: [PATCH 21/25] Use cpp11 in `xml2_node.cpp` --- inst/include/xml2_types.h | 3 + src/cpp11.cpp | 132 ++++++++--------- src/xml2_node.cpp | 288 +++++++++++++++++--------------------- 3 files changed, 200 insertions(+), 223 deletions(-) diff --git a/inst/include/xml2_types.h b/inst/include/xml2_types.h index b5c12e32..60a0212d 100644 --- a/inst/include/xml2_types.h +++ b/inst/include/xml2_types.h @@ -94,4 +94,7 @@ class XPtrDoc : public ::XPtr { typedef ::XPtr XPtrNode; typedef ::XPtr XPtrNs; +using node_pointer = cpp11::external_pointer; +using doc_pointer = cpp11::external_pointer; + #endif diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 720175bc..614e5e8e 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -118,234 +118,234 @@ extern "C" SEXP _xml2_ns_lookup(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { END_CPP11 } // xml2_node.cpp -SEXP node_name(SEXP x, SEXP nsMap); +cpp11::strings node_name(cpp11::list x, cpp11::strings nsMap); extern "C" SEXP _xml2_node_name(SEXP x, SEXP nsMap) { BEGIN_CPP11 - return cpp11::as_sexp(node_name(cpp11::as_cpp>(x), cpp11::as_cpp>(nsMap))); + return cpp11::as_sexp(node_name(cpp11::as_cpp>(x), cpp11::as_cpp>(nsMap))); END_CPP11 } // xml2_node.cpp -SEXP node_set_name(SEXP node_sxp, SEXP value); +SEXP node_set_name(node_pointer node_sxp, cpp11::strings value); extern "C" SEXP _xml2_node_set_name(SEXP node_sxp, SEXP value) { BEGIN_CPP11 - return cpp11::as_sexp(node_set_name(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(value))); + return cpp11::as_sexp(node_set_name(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(value))); END_CPP11 } // xml2_node.cpp -SEXP node_text(SEXP x); +cpp11::strings node_text(cpp11::list x); extern "C" SEXP _xml2_node_text(SEXP x) { BEGIN_CPP11 - return cpp11::as_sexp(node_text(cpp11::as_cpp>(x))); + return cpp11::as_sexp(node_text(cpp11::as_cpp>(x))); END_CPP11 } // xml2_node.cpp -SEXP node_attr(SEXP x, SEXP name_sxp, SEXP missing_sxp, SEXP nsMap_sxp); +cpp11::strings node_attr(cpp11::list x, cpp11::strings name_sxp, cpp11::strings missing_sxp, cpp11::strings nsMap_sxp); extern "C" SEXP _xml2_node_attr(SEXP x, SEXP name_sxp, SEXP missing_sxp, SEXP nsMap_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_attr(cpp11::as_cpp>(x), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(missing_sxp), cpp11::as_cpp>(nsMap_sxp))); + return cpp11::as_sexp(node_attr(cpp11::as_cpp>(x), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(missing_sxp), cpp11::as_cpp>(nsMap_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_attrs(SEXP x, SEXP nsMap_sxp); +cpp11::sexp node_attrs(cpp11::list x, cpp11::strings nsMap_sxp); extern "C" SEXP _xml2_node_attrs(SEXP x, SEXP nsMap_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_attrs(cpp11::as_cpp>(x), cpp11::as_cpp>(nsMap_sxp))); + return cpp11::as_sexp(node_attrs(cpp11::as_cpp>(x), cpp11::as_cpp>(nsMap_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, SEXP nsMap); +cpp11::sexp node_set_attr(node_pointer node_sxp, cpp11::strings name_sxp, cpp11::strings value, cpp11::strings nsMap); extern "C" SEXP _xml2_node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, SEXP nsMap) { BEGIN_CPP11 - return cpp11::as_sexp(node_set_attr(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(value), cpp11::as_cpp>(nsMap))); + return cpp11::as_sexp(node_set_attr(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(value), cpp11::as_cpp>(nsMap))); END_CPP11 } // xml2_node.cpp -SEXP node_remove_attr(SEXP node_sxp, SEXP name_sxp, SEXP nsMap); +cpp11::sexp node_remove_attr(node_pointer node_sxp, cpp11::strings name_sxp, cpp11::strings nsMap); extern "C" SEXP _xml2_node_remove_attr(SEXP node_sxp, SEXP name_sxp, SEXP nsMap) { BEGIN_CPP11 - return cpp11::as_sexp(node_remove_attr(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(nsMap))); + return cpp11::as_sexp(node_remove_attr(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(nsMap))); END_CPP11 } // xml2_node.cpp -SEXP node_children(SEXP node_sxp, SEXP only_node_sxp); +cpp11::list node_children(node_pointer node_sxp, cpp11::logicals only_node_sxp); extern "C" SEXP _xml2_node_children(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_children(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); + return cpp11::as_sexp(node_children(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_length(SEXP x, SEXP only_node_sxp); +cpp11::integers node_length(cpp11::list x, cpp11::logicals only_node_sxp); extern "C" SEXP _xml2_node_length(SEXP x, SEXP only_node_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_length(cpp11::as_cpp>(x), cpp11::as_cpp>(only_node_sxp))); + return cpp11::as_sexp(node_length(cpp11::as_cpp>(x), cpp11::as_cpp>(only_node_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_has_children(SEXP node_sxp, SEXP only_node_sxp); +cpp11::logicals node_has_children(node_pointer node_sxp, cpp11::logicals only_node_sxp); extern "C" SEXP _xml2_node_has_children(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_has_children(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); + return cpp11::as_sexp(node_has_children(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_parents(SEXP node_sxp); +cpp11::list node_parents(node_pointer node_sxp); extern "C" SEXP _xml2_node_parents(SEXP node_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_parents(cpp11::as_cpp>(node_sxp))); + return cpp11::as_sexp(node_parents(cpp11::as_cpp>(node_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_siblings(SEXP node_sxp, SEXP only_node_sxp); +cpp11::list node_siblings(node_pointer node_sxp, cpp11::logicals only_node_sxp); extern "C" SEXP _xml2_node_siblings(SEXP node_sxp, SEXP only_node_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_siblings(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); + return cpp11::as_sexp(node_siblings(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(only_node_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_parent(SEXP node_sxp); +node_pointer node_parent(node_pointer node_sxp); extern "C" SEXP _xml2_node_parent(SEXP node_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_parent(cpp11::as_cpp>(node_sxp))); + return cpp11::as_sexp(node_parent(cpp11::as_cpp>(node_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_path(SEXP x); +cpp11::strings node_path(cpp11::list x); extern "C" SEXP _xml2_node_path(SEXP x) { BEGIN_CPP11 - return cpp11::as_sexp(node_path(cpp11::as_cpp>(x))); + return cpp11::as_sexp(node_path(cpp11::as_cpp>(x))); END_CPP11 } // xml2_node.cpp -SEXP nodes_duplicated(SEXP nodes); +cpp11::logicals nodes_duplicated(cpp11::list nodes); extern "C" SEXP _xml2_nodes_duplicated(SEXP nodes) { BEGIN_CPP11 - return cpp11::as_sexp(nodes_duplicated(cpp11::as_cpp>(nodes))); + return cpp11::as_sexp(nodes_duplicated(cpp11::as_cpp>(nodes))); END_CPP11 } // xml2_node.cpp -SEXP node_type(SEXP x); +cpp11::integers node_type(cpp11::list x); extern "C" SEXP _xml2_node_type(SEXP x) { BEGIN_CPP11 - return cpp11::as_sexp(node_type(cpp11::as_cpp>(x))); + return cpp11::as_sexp(node_type(cpp11::as_cpp>(x))); END_CPP11 } // xml2_node.cpp -SEXP node_copy(SEXP node_sxp); +node_pointer node_copy(node_pointer node_sxp); extern "C" SEXP _xml2_node_copy(SEXP node_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_copy(cpp11::as_cpp>(node_sxp))); + return cpp11::as_sexp(node_copy(cpp11::as_cpp>(node_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_set_content(SEXP node_sxp, SEXP content); +cpp11::sexp node_set_content(node_pointer node_sxp, cpp11::strings content); extern "C" SEXP _xml2_node_set_content(SEXP node_sxp, SEXP content) { BEGIN_CPP11 - return cpp11::as_sexp(node_set_content(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(content))); + return cpp11::as_sexp(node_set_content(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(content))); END_CPP11 } // xml2_node.cpp -SEXP node_append_content(SEXP node_sxp, SEXP content); +cpp11::sexp node_append_content(node_pointer node_sxp, cpp11::strings content); extern "C" SEXP _xml2_node_append_content(SEXP node_sxp, SEXP content) { BEGIN_CPP11 - return cpp11::as_sexp(node_append_content(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(content))); + return cpp11::as_sexp(node_append_content(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(content))); END_CPP11 } // xml2_node.cpp -SEXP node_new_text(SEXP node_sxp, SEXP content); +cpp11::sexp node_new_text(node_pointer node_sxp, cpp11::strings content); extern "C" SEXP _xml2_node_new_text(SEXP node_sxp, SEXP content) { BEGIN_CPP11 - return cpp11::as_sexp(node_new_text(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(content))); + return cpp11::as_sexp(node_new_text(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(content))); END_CPP11 } // xml2_node.cpp -SEXP node_append_child(SEXP parent_sxp, SEXP cur_sxp); +node_pointer node_append_child(node_pointer parent_sxp, node_pointer cur_sxp); extern "C" SEXP _xml2_node_append_child(SEXP parent_sxp, SEXP cur_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_append_child(cpp11::as_cpp>(parent_sxp), cpp11::as_cpp>(cur_sxp))); + return cpp11::as_sexp(node_append_child(cpp11::as_cpp>(parent_sxp), cpp11::as_cpp>(cur_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_prepend_child(SEXP parent_sxp, SEXP cur_sxp); +node_pointer node_prepend_child(node_pointer parent_sxp, node_pointer cur_sxp); extern "C" SEXP _xml2_node_prepend_child(SEXP parent_sxp, SEXP cur_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_prepend_child(cpp11::as_cpp>(parent_sxp), cpp11::as_cpp>(cur_sxp))); + return cpp11::as_sexp(node_prepend_child(cpp11::as_cpp>(parent_sxp), cpp11::as_cpp>(cur_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp); +node_pointer node_prepend_sibling(node_pointer cur_sxp, node_pointer elem_sxp); extern "C" SEXP _xml2_node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_prepend_sibling(cpp11::as_cpp>(cur_sxp), cpp11::as_cpp>(elem_sxp))); + return cpp11::as_sexp(node_prepend_sibling(cpp11::as_cpp>(cur_sxp), cpp11::as_cpp>(elem_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_append_sibling(SEXP cur_sxp, SEXP elem_sxp); +node_pointer node_append_sibling(node_pointer cur_sxp, node_pointer elem_sxp); extern "C" SEXP _xml2_node_append_sibling(SEXP cur_sxp, SEXP elem_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_append_sibling(cpp11::as_cpp>(cur_sxp), cpp11::as_cpp>(elem_sxp))); + return cpp11::as_sexp(node_append_sibling(cpp11::as_cpp>(cur_sxp), cpp11::as_cpp>(elem_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_replace(SEXP old_sxp, SEXP cur_sxp); +node_pointer node_replace(node_pointer old_sxp, node_pointer cur_sxp); extern "C" SEXP _xml2_node_replace(SEXP old_sxp, SEXP cur_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_replace(cpp11::as_cpp>(old_sxp), cpp11::as_cpp>(cur_sxp))); + return cpp11::as_sexp(node_replace(cpp11::as_cpp>(old_sxp), cpp11::as_cpp>(cur_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_remove(SEXP node_sxp, SEXP free_sxp); +cpp11::sexp node_remove(node_pointer node_sxp, cpp11::logicals free_sxp); extern "C" SEXP _xml2_node_remove(SEXP node_sxp, SEXP free_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_remove(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(free_sxp))); + return cpp11::as_sexp(node_remove(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(free_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_new(SEXP name); +cpp11::sexp node_new(cpp11::strings name); extern "C" SEXP _xml2_node_new(SEXP name) { BEGIN_CPP11 - return cpp11::as_sexp(node_new(cpp11::as_cpp>(name))); + return cpp11::as_sexp(node_new(cpp11::as_cpp>(name))); END_CPP11 } // xml2_node.cpp -SEXP node_cdata_new(SEXP doc_sxp, SEXP content_sxp); +cpp11::sexp node_cdata_new(cpp11::sexp doc_sxp, cpp11::strings content_sxp); extern "C" SEXP _xml2_node_cdata_new(SEXP doc_sxp, SEXP content_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_cdata_new(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(content_sxp))); + return cpp11::as_sexp(node_cdata_new(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(content_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_comment_new(SEXP content); +node_pointer node_comment_new(cpp11::strings content); extern "C" SEXP _xml2_node_comment_new(SEXP content) { BEGIN_CPP11 - return cpp11::as_sexp(node_comment_new(cpp11::as_cpp>(content))); + return cpp11::as_sexp(node_comment_new(cpp11::as_cpp>(content))); END_CPP11 } // xml2_node.cpp -SEXP node_new_ns(SEXP name, SEXP ns_sxp); +node_pointer node_new_ns(cpp11::strings name, cpp11::external_pointer ns_sxp); extern "C" SEXP _xml2_node_new_ns(SEXP name, SEXP ns_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_new_ns(cpp11::as_cpp>(name), cpp11::as_cpp>(ns_sxp))); + return cpp11::as_sexp(node_new_ns(cpp11::as_cpp>(name), cpp11::as_cpp>>(ns_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri); +cpp11::sexp node_set_namespace_uri(doc_pointer doc_sxp, node_pointer node_sxp, cpp11::strings uri); extern "C" SEXP _xml2_node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri) { BEGIN_CPP11 - return cpp11::as_sexp(node_set_namespace_uri(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(uri))); + return cpp11::as_sexp(node_set_namespace_uri(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(uri))); END_CPP11 } // xml2_node.cpp -SEXP node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp); +cpp11::sexp node_set_namespace_prefix(doc_pointer doc_sxp, node_pointer node_sxp, cpp11::strings prefix_sxp); extern "C" SEXP _xml2_node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_set_namespace_prefix(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(prefix_sxp))); + return cpp11::as_sexp(node_set_namespace_prefix(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(prefix_sxp))); END_CPP11 } // xml2_node.cpp -SEXP node_new_dtd(SEXP doc_sxp, SEXP name_sxp, SEXP eid_sxp, SEXP sid_sxp); +cpp11::sexp node_new_dtd(doc_pointer doc_sxp, cpp11::strings name_sxp, cpp11::strings eid_sxp, cpp11::strings sid_sxp); extern "C" SEXP _xml2_node_new_dtd(SEXP doc_sxp, SEXP name_sxp, SEXP eid_sxp, SEXP sid_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(node_new_dtd(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(eid_sxp), cpp11::as_cpp>(sid_sxp))); + return cpp11::as_sexp(node_new_dtd(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(name_sxp), cpp11::as_cpp>(eid_sxp), cpp11::as_cpp>(sid_sxp))); END_CPP11 } // xml2_output.cpp diff --git a/src/xml2_node.cpp b/src/xml2_node.cpp index b9cdf184..b5b54992 100644 --- a/src/xml2_node.cpp +++ b/src/xml2_node.cpp @@ -84,7 +84,7 @@ cpp11::strings node_name(cpp11::list x, cpp11::strings nsMap) { } [[cpp11::register]] -SEXP node_set_name(cpp11::list node_sxp, cpp11::strings value) { +SEXP node_set_name(node_pointer node_sxp, cpp11::strings value) { BEGIN_CPP XPtrNode node(node_sxp); @@ -94,18 +94,17 @@ SEXP node_set_name(cpp11::list node_sxp, cpp11::strings value) { END_CPP } -SEXP node_text_impl(SEXP x) { +cpp11::r_string node_text_impl(cpp11::list x) { NodeType type = getNodeType(x); - SEXP out; + cpp11::r_string out; switch(type) { case NodeType::missing: out = NA_STRING; break; case NodeType::node: { - SEXP node_sxp = VECTOR_ELT(x, 0); - XPtrNode node(node_sxp); + XPtrNode node(x[0]); out = Xml2String(xmlNodeGetContent(node.checked_get())).asRString(); break; @@ -117,7 +116,7 @@ SEXP node_text_impl(SEXP x) { } [[cpp11::register]] -SEXP node_text(SEXP x) { +cpp11::strings node_text(cpp11::list x) { BEGIN_CPP NodeType type = getNodeType(x); @@ -125,20 +124,17 @@ SEXP node_text(SEXP x) { { case NodeType::missing: case NodeType::node: - return Rf_ScalarString(node_text_impl(x)); + // TODO can this be done nicer? + return cpp11::writable::strings(node_text_impl(x)); break; case NodeType::nodeset: { - R_xlen_t n = Rf_xlength(x); - - SEXP out = PROTECT(Rf_allocVector(STRSXP, n)); + R_xlen_t n = x.size(); + cpp11::writable::strings out(n); for (int i = 0; i < n; ++i) { - SEXP x_i = VECTOR_ELT(x, i); - SEXP name_i = node_text_impl(x_i); - SET_STRING_ELT(out, i, name_i); + out[i] = node_text_impl(x[i]); } - UNPROTECT(1); return out; }; default: stop_unexpected_node_type(); @@ -173,10 +169,10 @@ const xmlChar* xmlNsDefinition(xmlNodePtr node, const xmlChar* lookup) { } -SEXP node_attr_impl(SEXP x, - const std::string& name, - SEXP missingVal, - cpp11::strings nsMap_sxp) { +cpp11::r_string node_attr_impl(cpp11::list x, + const std::string& name, + cpp11::r_string missingVal, + cpp11::strings nsMap_sxp) { NodeType type = getNodeType(x); switch(type) { @@ -184,8 +180,7 @@ SEXP node_attr_impl(SEXP x, return NA_STRING; break; case NodeType::node: { - SEXP node_sxp = VECTOR_ELT(x, 0); - XPtrNode node(node_sxp); + XPtrNode node(x[0]); if (name == "xmlns") { return Xml2String(xmlNsDefinition(node, NULL)).asRString(missingVal); } @@ -224,40 +219,37 @@ SEXP node_attr_impl(SEXP x, } [[cpp11::register]] -SEXP node_attr( - SEXP x, - SEXP name_sxp, - SEXP missing_sxp, +cpp11::strings node_attr( + cpp11::list x, + cpp11::strings name_sxp, + cpp11::strings missing_sxp, cpp11::strings nsMap_sxp) { BEGIN_CPP NodeType type = getNodeType(x); - std::string name(CHAR(STRING_ELT(name_sxp, 0))); + std::string name(cpp11::as_cpp(name_sxp)); - if (Rf_xlength(missing_sxp) != 1) { + if (missing_sxp.size() != 1) { Rf_error("`missing` should be length 1"); } - SEXP missingVal = STRING_ELT(missing_sxp, 0); + cpp11::r_string missingVal = missing_sxp[0]; switch(type) { case NodeType::missing: case NodeType::node: - return Rf_ScalarString(node_attr_impl(x, name, missingVal, nsMap_sxp)); + return cpp11::writable::strings(node_attr_impl(x, name, missingVal, nsMap_sxp)); break; case NodeType::nodeset: { - R_xlen_t n = Rf_xlength(x); + R_xlen_t n = x.size(); - SEXP out = PROTECT(Rf_allocVector(STRSXP, n)); + cpp11::writable::strings out(n); for (int i = 0; i < n; ++i) { - SEXP x_i = VECTOR_ELT(x, i); - SEXP attr_i = node_attr_impl(x_i, name, missingVal, nsMap_sxp); - SET_STRING_ELT(out, i, attr_i); + out[i] = node_attr_impl(x[i], name, missingVal, nsMap_sxp); } - UNPROTECT(1); return out; }; default: stop_unexpected_node_type(); @@ -266,16 +258,15 @@ SEXP node_attr( END_CPP } -SEXP node_attrs_impl(SEXP x, cpp11::strings nsMap_sxp) { +cpp11::strings node_attrs_impl(cpp11::list x, cpp11::strings nsMap_sxp) { NodeType type = getNodeType(x); switch(type) { case NodeType::missing: - return Rf_ScalarString(NA_STRING); + return cpp11::writable::strings({NA_STRING}); break; case NodeType::node: { - SEXP node_sxp = VECTOR_ELT(x, 0); - XPtrNode node_(node_sxp); + XPtrNode node_(x[0]); int n = 0; xmlNodePtr node = node_.checked_get(); @@ -289,43 +280,42 @@ SEXP node_attrs_impl(SEXP x, cpp11::strings nsMap_sxp) { for(xmlNsPtr cur = node->nsDef; cur != NULL; cur = cur->next) n++; - SEXP names = PROTECT(Rf_allocVector(STRSXP, n)); - SEXP values = PROTECT(Rf_allocVector(STRSXP, n)); + cpp11::writable::strings names(n); + cpp11::writable::strings values(n); int i = 0; for(xmlAttr* cur = node->properties; cur != NULL; cur = cur->next, ++i) { std::string name = nodeName(cur, nsMap_sxp); - SET_STRING_ELT(names, i, Rf_mkCharLenCE(name.c_str(), name.size(), CE_UTF8)); + names[i] = name; xmlNs* ns = cur->ns; if (ns == NULL) { - if (Rf_xlength(nsMap_sxp) > 0) { - SET_STRING_ELT(values, i, Xml2String(xmlGetNoNsProp(node, cur->name)).asRString()); + if (nsMap_sxp.size() > 0) { + values[i] = Xml2String(xmlGetNoNsProp(node, cur->name)).asRString(); } else { - SET_STRING_ELT(values, i, Xml2String(xmlGetProp(node, cur->name)).asRString()); + values[i] = Xml2String(xmlGetProp(node, cur->name)).asRString(); } } else { - SET_STRING_ELT(values, i, Xml2String(xmlGetNsProp(node, cur->name, ns->href)).asRString()); + values[i] = Xml2String(xmlGetNsProp(node, cur->name, ns->href)).asRString(); } } for(xmlNsPtr cur = node->nsDef; cur != NULL; cur = cur->next, ++i) { if (cur->prefix == NULL) { - SET_STRING_ELT(names, i, Rf_mkChar("xmlns")); + names[i] = "xmlns"; } else { std::string name = std::string("xmlns:") + Xml2String(cur->prefix).asStdString(); - SET_STRING_ELT(names,i, Rf_mkCharLenCE(name.c_str(), name.size(), CE_UTF8)); + names[i] = name; } - SET_STRING_ELT(values, i, Xml2String(cur->href).asRString()); + values[i] = Xml2String(cur->href).asRString(); } - Rf_setAttrib(values, R_NamesSymbol, names); + values.names() = names; - UNPROTECT(2); return values; } - return Rf_allocVector(STRSXP, 0); + return cpp11::strings(); break; } default: stop_unexpected_node_type(); @@ -333,7 +323,7 @@ SEXP node_attrs_impl(SEXP x, cpp11::strings nsMap_sxp) { } [[cpp11::register]] -SEXP node_attrs(SEXP x, cpp11::strings nsMap_sxp) { +cpp11::sexp node_attrs(cpp11::list x, cpp11::strings nsMap_sxp) { BEGIN_CPP NodeType type = getNodeType(x); @@ -344,17 +334,14 @@ SEXP node_attrs(SEXP x, cpp11::strings nsMap_sxp) { return node_attrs_impl(x, nsMap_sxp); break; case NodeType::nodeset: { - R_xlen_t n = Rf_xlength(x); + R_xlen_t n = x.size(); - SEXP out = PROTECT(Rf_allocVector(VECSXP, n)); + cpp11::writable::list out(n); for (int i = 0; i < n; ++i) { - SEXP x_i = VECTOR_ELT(x, i); - SEXP name_i = node_attrs_impl(x_i, nsMap_sxp); - SET_VECTOR_ELT(out, i, name_i); + out[i] = node_attrs_impl(x[i], nsMap_sxp); } - UNPROTECT(1); return out; }; default: stop_unexpected_node_type(); @@ -497,10 +484,14 @@ void removeNs(xmlNodePtr node, const xmlChar* prefix) { } [[cpp11::register]] -SEXP node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, cpp11::strings nsMap) { +cpp11::sexp node_set_attr( + node_pointer node_sxp, + cpp11::strings name_sxp, + cpp11::strings value, + cpp11::strings nsMap) { BEGIN_CPP XPtrNode node_(node_sxp); - std::string name(CHAR(STRING_ELT(name_sxp, 0))); + std::string name(cpp11::as_cpp(name_sxp)); const xmlNodePtr node = node_.checked_get(); @@ -515,7 +506,7 @@ SEXP node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, cpp11::strings nsMa return R_NilValue; } - if (Rf_xlength(nsMap) == 0) { + if (nsMap.empty()) { xmlSetProp(node, asXmlChar(name), asXmlChar(value)); } else { size_t colon = name.find(':'); @@ -541,10 +532,13 @@ SEXP node_set_attr(SEXP node_sxp, SEXP name_sxp, SEXP value, cpp11::strings nsMa } [[cpp11::register]] -SEXP node_remove_attr(SEXP node_sxp, SEXP name_sxp, cpp11::strings nsMap) { +cpp11::sexp node_remove_attr( + node_pointer node_sxp, + cpp11::strings name_sxp, + cpp11::strings nsMap) { BEGIN_CPP XPtrNode node_(node_sxp); - std::string name(CHAR(STRING_ELT(name_sxp, 0))); + std::string name(cpp11::as_cpp(name_sxp)); const xmlNodePtr node = node_.checked_get(); @@ -558,7 +552,7 @@ SEXP node_remove_attr(SEXP node_sxp, SEXP name_sxp, cpp11::strings nsMap) { return R_NilValue; } - if (Rf_xlength(nsMap) == 0) { + if (nsMap.empty()) { xmlUnsetProp(node, asXmlChar(name)); } else { size_t colon = name.find(':'); @@ -583,23 +577,22 @@ SEXP node_remove_attr(SEXP node_sxp, SEXP name_sxp, cpp11::strings nsMap) { END_CPP } -SEXP asList(std::vector nodes) { - SEXP out = PROTECT(Rf_allocVector(VECSXP, nodes.size())); - for (size_t i = 0; i < nodes.size(); ++i) { +cpp11::list asList(std::vector nodes) { + R_xlen_t n = nodes.size(); + cpp11::writable::list out(n); + for (size_t i = 0; i < n; ++i) { XPtrNode node(nodes[i]); - SET_VECTOR_ELT(out, i, SEXP(node)); + out[i] = SEXP(node); } - UNPROTECT(1); - return out; } [[cpp11::register]] -SEXP node_children(SEXP node_sxp, SEXP only_node_sxp) { +cpp11::list node_children(node_pointer node_sxp, cpp11::logicals only_node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); - bool only_node = LOGICAL(only_node_sxp)[0]; + bool only_node = cpp11::as_cpp(only_node_sxp); std::vector out; @@ -615,7 +608,7 @@ SEXP node_children(SEXP node_sxp, SEXP only_node_sxp) { END_CPP } -int node_length_impl(SEXP x, bool only_node) { +int node_length_impl(cpp11::list x, bool only_node) { NodeType type = getNodeType(x); int out; @@ -625,8 +618,7 @@ int node_length_impl(SEXP x, bool only_node) { out = 0; break; case NodeType::node: { - SEXP node_sxp = VECTOR_ELT(x, 0); - XPtrNode node(node_sxp); + XPtrNode node(x[0]); out = 0; for(xmlNode* cur = node->xmlChildrenNode; cur != NULL; cur = cur->next) { @@ -644,35 +636,31 @@ int node_length_impl(SEXP x, bool only_node) { } [[cpp11::register]] -SEXP node_length(SEXP x, SEXP only_node_sxp) { +cpp11::integers node_length(cpp11::list x, cpp11::logicals only_node_sxp) { BEGIN_CPP NodeType type = getNodeType(x); - bool only_node = LOGICAL(only_node_sxp)[0]; + bool only_node = cpp11::as_cpp(only_node_sxp); switch(type) { case NodeType::missing: case NodeType::node: - return Rf_ScalarInteger(node_length_impl(x, only_node)); + return cpp11::integers({node_length_impl(x, only_node)}); break; case NodeType::nodeset: { - R_xlen_t n = Rf_xlength(x); + R_xlen_t n = x.size(); if (n == 0) { - return Rf_ScalarInteger(0); + return cpp11::writable::integers({0}); } - SEXP out = PROTECT(Rf_allocVector(INTSXP, n)); - int* p_out = INTEGER(out); + cpp11::writable::integers out(n); for (int i = 0; i < n; ++i) { - SEXP x_i = VECTOR_ELT(x, i); - int length_i = node_length_impl(x_i, only_node); - p_out[i] = length_i; + out[i] = node_length_impl(x[i], only_node); } - UNPROTECT(1); return out; }; default: stop_unexpected_node_type(); @@ -682,23 +670,23 @@ SEXP node_length(SEXP x, SEXP only_node_sxp) { } [[cpp11::register]] -SEXP node_has_children(SEXP node_sxp, SEXP only_node_sxp) { +cpp11::logicals node_has_children(node_pointer node_sxp, cpp11::logicals only_node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); - bool only_node = LOGICAL(only_node_sxp)[0]; + bool only_node = cpp11::as_cpp(only_node_sxp); for(xmlNode* cur = node->xmlChildrenNode; cur != NULL; cur = cur->next) { if (only_node && cur->type != XML_ELEMENT_NODE) { continue; } - return Rf_ScalarLogical(true); + return cpp11::logicals({true}); } - return Rf_ScalarLogical(false); + return cpp11::logicals({false}); END_CPP } [[cpp11::register]] -SEXP node_parents(SEXP node_sxp) { +cpp11::list node_parents(node_pointer node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -715,16 +703,16 @@ SEXP node_parents(SEXP node_sxp) { } [[cpp11::register]] -SEXP node_siblings(SEXP node_sxp, SEXP only_node_sxp) { +cpp11::list node_siblings(node_pointer node_sxp, cpp11::logicals only_node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); - bool only_node = LOGICAL(only_node_sxp)[0]; + bool only_node = cpp11::as_cpp(only_node_sxp); std::vector out; xmlNode* parent = node->parent; if (parent == NULL) - return Rf_allocVector(VECSXP, 0); + return cpp11::list(0); for(xmlNode* cur = parent->xmlChildrenNode; cur != NULL; cur = cur->next) { if (cur == node) { @@ -743,7 +731,7 @@ SEXP node_siblings(SEXP node_sxp, SEXP only_node_sxp) { [[cpp11::register]] -SEXP node_parent(SEXP node_sxp) { +node_pointer node_parent(node_pointer node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -755,30 +743,25 @@ SEXP node_parent(SEXP node_sxp) { END_CPP } -SEXP node_path_impl(SEXP x) { +cpp11::r_string node_path_impl(cpp11::list x) { NodeType type = getNodeType(x); - SEXP out; - switch(type) { case NodeType::missing: - out = NA_STRING; + return NA_STRING; break; case NodeType::node: { - SEXP node_sxp = VECTOR_ELT(x, 0); - XPtrNode node(node_sxp); + XPtrNode node(x[0]); - out = Xml2String(xmlGetNodePath(node.checked_get())).asRString(); + return Xml2String(xmlGetNodePath(node.checked_get())).asRString(); break; } default: stop_unexpected_node_type(); } - - return out; } [[cpp11::register]] -SEXP node_path(SEXP x) { +cpp11::strings node_path(cpp11::list x) { BEGIN_CPP NodeType type = getNodeType(x); @@ -786,20 +769,17 @@ SEXP node_path(SEXP x) { { case NodeType::missing: case NodeType::node: - return Rf_ScalarString(node_path_impl(x)); + return cpp11::writable::strings(node_path_impl(x)); break; case NodeType::nodeset: { - R_xlen_t n = Rf_xlength(x); + R_xlen_t n = x.size(); - SEXP out = PROTECT(Rf_allocVector(STRSXP, n)); + cpp11::writable::strings out(n); for (int i = 0; i < n; ++i) { - SEXP x_i = VECTOR_ELT(x, i); - SEXP name_i = node_path_impl(x_i); - SET_STRING_ELT(out, i, name_i); + out[i] = node_path_impl(x[i]); } - UNPROTECT(1); return out; }; default: stop_unexpected_node_type(); @@ -809,20 +789,20 @@ SEXP node_path(SEXP x) { } [[cpp11::register]] -SEXP nodes_duplicated(SEXP nodes) { +cpp11::logicals nodes_duplicated(cpp11::list nodes) { BEGIN_CPP std::set seen; - R_xlen_t n = Rf_xlength(nodes); + R_xlen_t n = nodes.size(); - SEXP out = PROTECT(Rf_allocVector(LGLSXP, n)); + cpp11::writable::logicals out(n); for (int i = 0; i < n; ++i) { bool result; - SEXP cur = VECTOR_ELT(nodes, i); + cpp11::list cur = nodes[i]; if (Rf_inherits(cur, "xml_node")) { - XPtrNode node(VECTOR_ELT(cur, 0)); + XPtrNode node(cur[0]); result = !seen.insert(node.checked_get()).second; } else if (Rf_inherits(cur, "xml_missing")) { result = false; @@ -830,15 +810,14 @@ SEXP nodes_duplicated(SEXP nodes) { XPtrNode node(cur); result = !seen.insert(node.checked_get()).second; } - LOGICAL(out)[i] = result; + out[i] = result; } - UNPROTECT(1); return out; END_CPP } -int node_type_impl(SEXP x) { +int node_type_impl(cpp11::list x) { NodeType type = getNodeType(x); int out; @@ -848,8 +827,7 @@ int node_type_impl(SEXP x) { out = NA_INTEGER; break; case NodeType::node: { - SEXP node_sxp = VECTOR_ELT(x, 0); - XPtrNode node(node_sxp); + XPtrNode node(x[0]); out = node->type; break; @@ -861,7 +839,7 @@ int node_type_impl(SEXP x) { } [[cpp11::register]] -SEXP node_type(SEXP x) { +cpp11::integers node_type(cpp11::list x) { BEGIN_CPP NodeType type = getNodeType(x); @@ -869,21 +847,17 @@ SEXP node_type(SEXP x) { { case NodeType::missing: case NodeType::node: - return Rf_ScalarInteger(node_type_impl(x)); + return cpp11::writable::integers({node_type_impl(x)}); break; case NodeType::nodeset: { - R_xlen_t n = Rf_xlength(x); + R_xlen_t n = x.size(); - SEXP out = PROTECT(Rf_allocVector(INTSXP, n)); - int* p_out = INTEGER(out); + cpp11::writable::integers out(n); for (int i = 0; i < n; ++i) { - SEXP x_i = VECTOR_ELT(x, i); - int type_i = node_type_impl(x_i); - p_out[i] = type_i; + out[i] = node_type_impl(x[i]); } - UNPROTECT(1); return out; }; default: stop_unexpected_node_type(); @@ -893,7 +867,7 @@ SEXP node_type(SEXP x) { } [[cpp11::register]] -SEXP node_copy(SEXP node_sxp) { +node_pointer node_copy(node_pointer node_sxp) { BEGIN_CPP XPtrNode node(node_sxp); @@ -904,40 +878,40 @@ SEXP node_copy(SEXP node_sxp) { } [[cpp11::register]] -SEXP node_set_content(SEXP node_sxp, SEXP content) { +cpp11::sexp node_set_content(node_pointer node_sxp, cpp11::strings content) { BEGIN_CPP XPtrNode node(node_sxp); - xmlNodeSetContentLen(node.checked_get(), asXmlChar(content), Rf_xlength(STRING_ELT(content, 0))); + xmlNodeSetContentLen(node.checked_get(), asXmlChar(content), content[0].size()); return R_NilValue; END_CPP } [[cpp11::register]] -SEXP node_append_content(SEXP node_sxp, SEXP content) { +cpp11::sexp node_append_content(node_pointer node_sxp, cpp11::strings content) { BEGIN_CPP XPtrNode node(node_sxp); - xmlNodeAddContentLen(node.checked_get(), asXmlChar(content), Rf_xlength(STRING_ELT(content, 0))); + xmlNodeAddContentLen(node.checked_get(), asXmlChar(content), content[0].size()); return R_NilValue; END_CPP } [[cpp11::register]] -SEXP node_new_text(SEXP node_sxp, SEXP content) { +cpp11::sexp node_new_text(node_pointer node_sxp, cpp11::strings content) { BEGIN_CPP XPtrNode node(node_sxp); - xmlAddChild(node.checked_get(), xmlNewTextLen(asXmlChar(content), Rf_xlength(STRING_ELT(content, 0)))); + xmlAddChild(node.checked_get(), xmlNewTextLen(asXmlChar(content), content[0].size())); return R_NilValue; END_CPP } [[cpp11::register]] -SEXP node_append_child(SEXP parent_sxp, SEXP cur_sxp) { +node_pointer node_append_child(node_pointer parent_sxp, node_pointer cur_sxp) { BEGIN_CPP XPtrNode parent(parent_sxp); XPtrNode cur(cur_sxp); @@ -947,7 +921,7 @@ SEXP node_append_child(SEXP parent_sxp, SEXP cur_sxp) { } [[cpp11::register]] -SEXP node_prepend_child(SEXP parent_sxp, SEXP cur_sxp) { +node_pointer node_prepend_child(node_pointer parent_sxp, node_pointer cur_sxp) { BEGIN_CPP XPtrNode parent(parent_sxp); XPtrNode cur(cur_sxp); @@ -960,7 +934,7 @@ SEXP node_prepend_child(SEXP parent_sxp, SEXP cur_sxp) { // Previous sibling [[cpp11::register]] -SEXP node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp) { +node_pointer node_prepend_sibling(node_pointer cur_sxp, node_pointer elem_sxp) { BEGIN_CPP XPtrNode cur(cur_sxp); XPtrNode elem(elem_sxp); @@ -973,7 +947,7 @@ SEXP node_prepend_sibling(SEXP cur_sxp, SEXP elem_sxp) { // Append sibling [[cpp11::register]] -SEXP node_append_sibling(SEXP cur_sxp, SEXP elem_sxp) { +node_pointer node_append_sibling(node_pointer cur_sxp, node_pointer elem_sxp) { BEGIN_CPP XPtrNode cur(cur_sxp); XPtrNode elem(elem_sxp); @@ -985,7 +959,7 @@ SEXP node_append_sibling(SEXP cur_sxp, SEXP elem_sxp) { // Replace node [[cpp11::register]] -SEXP node_replace(SEXP old_sxp, SEXP cur_sxp) { +node_pointer node_replace(node_pointer old_sxp, node_pointer cur_sxp) { BEGIN_CPP XPtrNode old(old_sxp); XPtrNode cur(cur_sxp); @@ -996,10 +970,10 @@ SEXP node_replace(SEXP old_sxp, SEXP cur_sxp) { } [[cpp11::register]] -SEXP node_remove(SEXP node_sxp, SEXP free_sxp) { +cpp11::sexp node_remove(node_pointer node_sxp, cpp11::logicals free_sxp) { BEGIN_CPP XPtrNode node(node_sxp); - bool free = LOGICAL(free_sxp)[0]; + bool free = cpp11::as_cpp(free_sxp); xmlUnlinkNode(node.checked_get()); if (free) { @@ -1011,7 +985,7 @@ SEXP node_remove(SEXP node_sxp, SEXP free_sxp) { } [[cpp11::register]] -SEXP node_new(SEXP name) { +cpp11::sexp node_new(cpp11::strings name) { BEGIN_CPP XPtrNode node(xmlNewNode(NULL, asXmlChar(name))); return SEXP(node); @@ -1020,16 +994,16 @@ SEXP node_new(SEXP name) { [[cpp11::register]] -SEXP node_cdata_new(SEXP doc_sxp, SEXP content_sxp) { +cpp11::sexp node_cdata_new(cpp11::sexp doc_sxp, cpp11::strings content_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); - XPtrNode node(xmlNewCDataBlock(doc.checked_get(), asXmlChar(content_sxp), Rf_xlength(STRING_ELT(content_sxp, 0)))); + XPtrNode node(xmlNewCDataBlock(doc.checked_get(), asXmlChar(content_sxp), content_sxp[0].size())); return SEXP(node); END_CPP } [[cpp11::register]] -SEXP node_comment_new(SEXP content) { +node_pointer node_comment_new(cpp11::strings content) { BEGIN_CPP XPtrNode node(xmlNewComment(asXmlChar(content))); return SEXP(node); @@ -1037,7 +1011,7 @@ SEXP node_comment_new(SEXP content) { } [[cpp11::register]] -SEXP node_new_ns(SEXP name, SEXP ns_sxp) { +node_pointer node_new_ns(cpp11::strings name, cpp11::external_pointer ns_sxp) { BEGIN_CPP XPtrNs ns(ns_sxp); XPtrNode node(xmlNewNode(ns.checked_get(), asXmlChar(name))); @@ -1046,7 +1020,7 @@ SEXP node_new_ns(SEXP name, SEXP ns_sxp) { } [[cpp11::register]] -SEXP node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri) { +cpp11::sexp node_set_namespace_uri(doc_pointer doc_sxp, node_pointer node_sxp, cpp11::strings uri) { BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(node_sxp); @@ -1060,13 +1034,13 @@ SEXP node_set_namespace_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri) { } [[cpp11::register]] -SEXP node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { +cpp11::sexp node_set_namespace_prefix(doc_pointer doc_sxp, node_pointer node_sxp, cpp11::strings prefix_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(node_sxp); xmlNsPtr ns = NULL; - if (Rf_xlength(STRING_ELT(prefix_sxp, 0)) == 0) { + if (prefix_sxp[0].size() == 0) { ns = xmlSearchNs(doc.checked_get(), node.checked_get(), NULL); } else { ns = xmlSearchNs(doc.checked_get(), node.checked_get(), asXmlChar(prefix_sxp)); @@ -1079,12 +1053,12 @@ SEXP node_set_namespace_prefix(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { } [[cpp11::register]] -SEXP node_new_dtd(SEXP doc_sxp, SEXP name_sxp, SEXP eid_sxp, SEXP sid_sxp) { +cpp11::sexp node_new_dtd(doc_pointer doc_sxp, cpp11::strings name_sxp, cpp11::strings eid_sxp, cpp11::strings sid_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); - std::string name(CHAR(STRING_ELT(name_sxp, 0))); - std::string eid(CHAR(STRING_ELT(eid_sxp, 0))); - std::string sid(CHAR(STRING_ELT(sid_sxp, 0))); + std::string name(cpp11::as_cpp(name_sxp)); + std::string eid(cpp11::as_cpp(eid_sxp)); + std::string sid(cpp11::as_cpp(sid_sxp)); xmlDtdPtr dtd = xmlNewDtd(doc, name == "" ? NULL : asXmlChar(name), eid == "" ? NULL : asXmlChar(eid), sid == "" ? NULL : asXmlChar(sid)); xmlAddChild(reinterpret_cast(doc.checked_get()), reinterpret_cast(dtd)); From b65e011f6543f0748893f7a9f966ae6c8a8b8697 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Fri, 3 Nov 2023 07:56:28 +0000 Subject: [PATCH 22/25] Fix compilation issues --- src/connection.h | 7 ++----- src/xml2_node.cpp | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/connection.h b/src/connection.h index ed796511..7311de27 100644 --- a/src/connection.h +++ b/src/connection.h @@ -14,11 +14,8 @@ cpp11::sexp write_bin(cpp11::sexp data, cpp11::sexp con); inline size_t R_WriteConnection(cpp11::sexp con, void* buf, size_t n) { cpp11::writable::raws payload(n); - cpp11::sexp payload_sexp = cpp11::sexp(payload); - - memcpy(RAW(payload_sexp), buf, n); - - write_bin(payload_sexp, con); + memcpy(RAW(payload), buf, n); + write_bin(payload, con); return n; } diff --git a/src/xml2_node.cpp b/src/xml2_node.cpp index b5b54992..72cb44b4 100644 --- a/src/xml2_node.cpp +++ b/src/xml2_node.cpp @@ -580,7 +580,7 @@ cpp11::sexp node_remove_attr( cpp11::list asList(std::vector nodes) { R_xlen_t n = nodes.size(); cpp11::writable::list out(n); - for (size_t i = 0; i < n; ++i) { + for (R_xlen_t i = 0; i < n; ++i) { XPtrNode node(nodes[i]); out[i] = SEXP(node); } From f73bb4147dc609937ef1d0b80de2c048bcf92ee4 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Fri, 3 Nov 2023 08:30:58 +0000 Subject: [PATCH 23/25] Use cpp11 in namespace and connection --- src/connection.cpp | 28 +++++++++++----------------- src/cpp11.cpp | 16 ++++++++-------- src/xml2_namespace.cpp | 12 ++++++------ 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/src/connection.cpp b/src/connection.cpp index 8f694209..48b76cc2 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -8,14 +8,14 @@ #include #include "xml2_utils.h" +using namespace cpp11::literals; // so we can use ""_nm syntax + // Wrapper around R's read_bin function -SEXP read_bin(SEXP con, size_t bytes) { - SEXP e; - SEXP raw_sxp = PROTECT(Rf_mkString("raw")); - SEXP bytes_sxp = PROTECT(Rf_ScalarInteger(bytes)); - PROTECT(e = Rf_lang4(Rf_install("readBin"), con, raw_sxp, bytes_sxp)); - SEXP res = Rf_eval(e, R_GlobalEnv); - UNPROTECT(3); +SEXP read_bin(SEXP con, cpp11::doubles bytes_sxp) { + cpp11::strings raw_sxp({"raw"}); + + auto readBin = cpp11::package("base")["readBin"]; + cpp11::sexp res = readBin("con"_nm = con, "what"_nm = raw_sxp, "n"_nm = bytes_sxp); return res; } @@ -29,26 +29,20 @@ cpp11::sexp write_bin(cpp11::sexp data, cpp11::sexp con) { // raw vector. // [[cpp11::register]] -cpp11::sexp read_connection_(SEXP con_sxp, SEXP read_size_sxp) { +cpp11::sexp read_connection_(cpp11::sexp con_sxp, cpp11::doubles read_size_sxp) { BEGIN_CPP std::vector buffer; - size_t read_size = REAL(read_size_sxp)[0]; - SEXP chunk = read_bin(con_sxp, read_size); + cpp11::sexp chunk = read_bin(con_sxp, read_size_sxp); R_xlen_t chunk_size = Rf_xlength(chunk); while(chunk_size > 0) { std::copy(RAW(chunk), RAW(chunk) + chunk_size, std::back_inserter(buffer)); - chunk = read_bin(con_sxp, read_size); + chunk = read_bin(con_sxp, read_size_sxp); chunk_size = Rf_xlength(chunk); } - size_t size = buffer.size(); - - SEXP out = PROTECT(Rf_allocVector(RAWSXP, size)); - std::copy(buffer.begin(), buffer.end(), RAW(out)); - - UNPROTECT(1); + cpp11::raws out(buffer); return out; diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 614e5e8e..de1b603e 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -6,10 +6,10 @@ #include // connection.cpp -cpp11::sexp read_connection_(SEXP con_sxp, SEXP read_size_sxp); +cpp11::sexp read_connection_(cpp11::sexp con_sxp, cpp11::doubles read_size_sxp); extern "C" SEXP _xml2_read_connection_(SEXP con_sxp, SEXP read_size_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(read_connection_(cpp11::as_cpp>(con_sxp), cpp11::as_cpp>(read_size_sxp))); + return cpp11::as_sexp(read_connection_(cpp11::as_cpp>(con_sxp), cpp11::as_cpp>(read_size_sxp))); END_CPP11 } // xml2_doc.cpp @@ -97,24 +97,24 @@ extern "C" SEXP _xml2_unique_ns(SEXP ns) { END_CPP11 } // xml2_namespace.cpp -cpp11::sexp doc_namespaces(SEXP doc_sxp); +cpp11::sexp doc_namespaces(doc_pointer doc_sxp); extern "C" SEXP _xml2_doc_namespaces(SEXP doc_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_namespaces(cpp11::as_cpp>(doc_sxp))); + return cpp11::as_sexp(doc_namespaces(cpp11::as_cpp>(doc_sxp))); END_CPP11 } // xml2_namespace.cpp -cpp11::sexp ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp); +cpp11::sexp ns_lookup_uri(doc_pointer doc_sxp, node_pointer node_sxp, cpp11::strings uri_sxp); extern "C" SEXP _xml2_ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(ns_lookup_uri(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(uri_sxp))); + return cpp11::as_sexp(ns_lookup_uri(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(uri_sxp))); END_CPP11 } // xml2_namespace.cpp -cpp11::sexp ns_lookup(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp); +cpp11::sexp ns_lookup(doc_pointer doc_sxp, node_pointer node_sxp, cpp11::strings prefix_sxp); extern "C" SEXP _xml2_ns_lookup(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(ns_lookup(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(prefix_sxp))); + return cpp11::as_sexp(ns_lookup(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(prefix_sxp))); END_CPP11 } // xml2_node.cpp diff --git a/src/xml2_namespace.cpp b/src/xml2_namespace.cpp index e9e6bf1b..045ccbd6 100644 --- a/src/xml2_namespace.cpp +++ b/src/xml2_namespace.cpp @@ -29,7 +29,7 @@ void cache_namespace(xmlNode* node, NsMap* nsMap) { } [[cpp11::register]] -cpp11::sexp doc_namespaces(SEXP doc_sxp) { +cpp11::sexp doc_namespaces(doc_pointer doc_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); @@ -43,14 +43,14 @@ cpp11::sexp doc_namespaces(SEXP doc_sxp) { } [[cpp11::register]] -cpp11::sexp ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp) { +cpp11::sexp ns_lookup_uri(doc_pointer doc_sxp, node_pointer node_sxp, cpp11::strings uri_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(node_sxp); xmlNsPtr ns = xmlSearchNsByHref(doc.checked_get(), node.checked_get(), asXmlChar(uri_sxp)); if (ns == NULL) { - Rf_error("No namespace with URI `%s` found", CHAR(STRING_ELT(uri_sxp, 0))); + Rf_error("No namespace with URI `%s` found", cpp11::as_cpp(uri_sxp)); } XPtrNs out(ns); return SEXP(out); @@ -58,18 +58,18 @@ cpp11::sexp ns_lookup_uri(SEXP doc_sxp, SEXP node_sxp, SEXP uri_sxp) { } [[cpp11::register]] -cpp11::sexp ns_lookup(SEXP doc_sxp, SEXP node_sxp, SEXP prefix_sxp) { +cpp11::sexp ns_lookup(doc_pointer doc_sxp, node_pointer node_sxp, cpp11::strings prefix_sxp) { BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(node_sxp); xmlNsPtr ns = NULL; - if (Rf_xlength(STRING_ELT(prefix_sxp, 0)) == 0) { + if (prefix_sxp[0].size() == 0) { ns = xmlSearchNs(doc.checked_get(), node.checked_get(), NULL); } else { ns = xmlSearchNs(doc.checked_get(), node.checked_get(), asXmlChar(prefix_sxp)); if (ns == NULL) { - Rf_error("No namespace with prefix `%s` found", CHAR(STRING_ELT(prefix_sxp, 0))); + Rf_error("No namespace with prefix `%s` found", cpp11::as_cpp(prefix_sxp)); } } From 2e859218d4bd23ef98c099731af0213b412e2892 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Fri, 3 Nov 2023 08:52:05 +0000 Subject: [PATCH 24/25] Remove cpp wrapper macro --- src/connection.cpp | 4 -- src/xml2_init.cpp | 8 ++++ src/xml2_namespace.cpp | 12 +----- src/xml2_node.cpp | 83 +----------------------------------------- src/xml2_utils.h | 20 ++++------ 5 files changed, 20 insertions(+), 107 deletions(-) diff --git a/src/connection.cpp b/src/connection.cpp index 48b76cc2..037fc9ca 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -30,8 +30,6 @@ cpp11::sexp write_bin(cpp11::sexp data, cpp11::sexp con) { // [[cpp11::register]] cpp11::sexp read_connection_(cpp11::sexp con_sxp, cpp11::doubles read_size_sxp) { - - BEGIN_CPP std::vector buffer; cpp11::sexp chunk = read_bin(con_sxp, read_size_sxp); @@ -45,6 +43,4 @@ cpp11::sexp read_connection_(cpp11::sexp con_sxp, cpp11::doubles read_size_sxp) cpp11::raws out(buffer); return out; - - END_CPP } diff --git a/src/xml2_init.cpp b/src/xml2_init.cpp index 7ebcfcfb..bab45a2b 100644 --- a/src/xml2_init.cpp +++ b/src/xml2_init.cpp @@ -12,6 +12,14 @@ #include #include "xml2_utils.h" +#define BEGIN_CPP try { + +#define END_CPP \ + } \ + catch (std::exception & e) { \ + Rf_error("C++ exception: %s", e.what()); \ + } + void handleStructuredError(void* userData, xmlError* error) { BEGIN_CPP diff --git a/src/xml2_namespace.cpp b/src/xml2_namespace.cpp index 045ccbd6..e5e2d1cb 100644 --- a/src/xml2_namespace.cpp +++ b/src/xml2_namespace.cpp @@ -11,9 +11,7 @@ [[cpp11::register]] cpp11::sexp unique_ns(SEXP ns) { - BEGIN_CPP return NsMap(ns).out(); - END_CPP } void cache_namespace(xmlNode* node, NsMap* nsMap) { @@ -30,7 +28,6 @@ void cache_namespace(xmlNode* node, NsMap* nsMap) { [[cpp11::register]] cpp11::sexp doc_namespaces(doc_pointer doc_sxp) { - BEGIN_CPP XPtrDoc doc(doc_sxp); NsMap nsMap; @@ -39,27 +36,23 @@ cpp11::sexp doc_namespaces(doc_pointer doc_sxp) { cache_namespace(root, &nsMap); return nsMap.out(); - END_CPP } [[cpp11::register]] cpp11::sexp ns_lookup_uri(doc_pointer doc_sxp, node_pointer node_sxp, cpp11::strings uri_sxp) { - BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(node_sxp); xmlNsPtr ns = xmlSearchNsByHref(doc.checked_get(), node.checked_get(), asXmlChar(uri_sxp)); if (ns == NULL) { - Rf_error("No namespace with URI `%s` found", cpp11::as_cpp(uri_sxp)); + cpp11::stop("No namespace with URI `%s` found", cpp11::as_cpp(uri_sxp)); } XPtrNs out(ns); return SEXP(out); - END_CPP } [[cpp11::register]] cpp11::sexp ns_lookup(doc_pointer doc_sxp, node_pointer node_sxp, cpp11::strings prefix_sxp) { - BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(node_sxp); @@ -69,11 +62,10 @@ cpp11::sexp ns_lookup(doc_pointer doc_sxp, node_pointer node_sxp, cpp11::strings } else { ns = xmlSearchNs(doc.checked_get(), node.checked_get(), asXmlChar(prefix_sxp)); if (ns == NULL) { - Rf_error("No namespace with prefix `%s` found", cpp11::as_cpp(prefix_sxp)); + cpp11::stop("No namespace with prefix `%s` found", cpp11::as_cpp(prefix_sxp)); } } XPtrNs out(ns); return SEXP(out); - END_CPP } diff --git a/src/xml2_node.cpp b/src/xml2_node.cpp index 72cb44b4..9cea7dd6 100644 --- a/src/xml2_node.cpp +++ b/src/xml2_node.cpp @@ -14,11 +14,6 @@ #include "xml2_types.h" #include "xml2_utils.h" -__attribute__ ((noreturn)) -void stop_unexpected_node_type() { - Rf_error("Unexpected node type"); -} - template // for xmlAttr and xmlNode std::string nodeName(T* node, cpp11::strings nsMap) { std::string name = Xml2String(node->name).asStdString(); @@ -57,7 +52,6 @@ cpp11::r_string node_name_impl(cpp11::list x, cpp11::strings nsMap) { [[cpp11::register]] cpp11::strings node_name(cpp11::list x, cpp11::strings nsMap) { - BEGIN_CPP NodeType type = getNodeType(x); switch(type) @@ -79,19 +73,15 @@ cpp11::strings node_name(cpp11::list x, cpp11::strings nsMap) { }; default: stop_unexpected_node_type(); } - - END_CPP } [[cpp11::register]] SEXP node_set_name(node_pointer node_sxp, cpp11::strings value) { - BEGIN_CPP XPtrNode node(node_sxp); xmlNodeSetName(node, asXmlChar(value)); return R_NilValue; - END_CPP } cpp11::r_string node_text_impl(cpp11::list x) { @@ -117,7 +107,6 @@ cpp11::r_string node_text_impl(cpp11::list x) { [[cpp11::register]] cpp11::strings node_text(cpp11::list x) { - BEGIN_CPP NodeType type = getNodeType(x); switch(type) @@ -139,8 +128,6 @@ cpp11::strings node_text(cpp11::list x) { }; default: stop_unexpected_node_type(); } - - END_CPP } bool hasPrefix(std::string lhs, std::string rhs) { @@ -224,13 +211,12 @@ cpp11::strings node_attr( cpp11::strings name_sxp, cpp11::strings missing_sxp, cpp11::strings nsMap_sxp) { - BEGIN_CPP NodeType type = getNodeType(x); std::string name(cpp11::as_cpp(name_sxp)); if (missing_sxp.size() != 1) { - Rf_error("`missing` should be length 1"); + cpp11::stop("`missing` should be length 1"); } cpp11::r_string missingVal = missing_sxp[0]; @@ -254,8 +240,6 @@ cpp11::strings node_attr( }; default: stop_unexpected_node_type(); } - - END_CPP } cpp11::strings node_attrs_impl(cpp11::list x, cpp11::strings nsMap_sxp) { @@ -324,7 +308,6 @@ cpp11::strings node_attrs_impl(cpp11::list x, cpp11::strings nsMap_sxp) { [[cpp11::register]] cpp11::sexp node_attrs(cpp11::list x, cpp11::strings nsMap_sxp) { - BEGIN_CPP NodeType type = getNodeType(x); switch(type) @@ -346,8 +329,6 @@ cpp11::sexp node_attrs(cpp11::list x, cpp11::strings nsMap_sxp) { }; default: stop_unexpected_node_type(); } - - END_CPP } // Fix the tree by removing the namespace pointers to the given tree @@ -489,7 +470,6 @@ cpp11::sexp node_set_attr( cpp11::strings name_sxp, cpp11::strings value, cpp11::strings nsMap) { - BEGIN_CPP XPtrNode node_(node_sxp); std::string name(cpp11::as_cpp(name_sxp)); @@ -528,7 +508,6 @@ cpp11::sexp node_set_attr( } return R_NilValue; - END_CPP } [[cpp11::register]] @@ -536,7 +515,6 @@ cpp11::sexp node_remove_attr( node_pointer node_sxp, cpp11::strings name_sxp, cpp11::strings nsMap) { - BEGIN_CPP XPtrNode node_(node_sxp); std::string name(cpp11::as_cpp(name_sxp)); @@ -574,7 +552,6 @@ cpp11::sexp node_remove_attr( } return R_NilValue; - END_CPP } cpp11::list asList(std::vector nodes) { @@ -590,7 +567,6 @@ cpp11::list asList(std::vector nodes) { [[cpp11::register]] cpp11::list node_children(node_pointer node_sxp, cpp11::logicals only_node_sxp) { - BEGIN_CPP XPtrNode node(node_sxp); bool only_node = cpp11::as_cpp(only_node_sxp); @@ -605,7 +581,6 @@ cpp11::list node_children(node_pointer node_sxp, cpp11::logicals only_node_sxp) } return asList(out); - END_CPP } int node_length_impl(cpp11::list x, bool only_node) { @@ -637,7 +612,6 @@ int node_length_impl(cpp11::list x, bool only_node) { [[cpp11::register]] cpp11::integers node_length(cpp11::list x, cpp11::logicals only_node_sxp) { - BEGIN_CPP NodeType type = getNodeType(x); bool only_node = cpp11::as_cpp(only_node_sxp); @@ -665,13 +639,10 @@ cpp11::integers node_length(cpp11::list x, cpp11::logicals only_node_sxp) { }; default: stop_unexpected_node_type(); } - - END_CPP } [[cpp11::register]] cpp11::logicals node_has_children(node_pointer node_sxp, cpp11::logicals only_node_sxp) { - BEGIN_CPP XPtrNode node(node_sxp); bool only_node = cpp11::as_cpp(only_node_sxp); @@ -682,12 +653,10 @@ cpp11::logicals node_has_children(node_pointer node_sxp, cpp11::logicals only_no return cpp11::logicals({true}); } return cpp11::logicals({false}); - END_CPP } [[cpp11::register]] cpp11::list node_parents(node_pointer node_sxp) { - BEGIN_CPP XPtrNode node(node_sxp); std::vector out; @@ -699,12 +668,10 @@ cpp11::list node_parents(node_pointer node_sxp) { } return asList(out); - END_CPP } [[cpp11::register]] cpp11::list node_siblings(node_pointer node_sxp, cpp11::logicals only_node_sxp) { - BEGIN_CPP XPtrNode node(node_sxp); bool only_node = cpp11::as_cpp(only_node_sxp); @@ -726,21 +693,18 @@ cpp11::list node_siblings(node_pointer node_sxp, cpp11::logicals only_node_sxp) } return asList(out); - END_CPP } [[cpp11::register]] node_pointer node_parent(node_pointer node_sxp) { - BEGIN_CPP XPtrNode node(node_sxp); if (node->parent == NULL) { - Rf_error("Parent does not exist"); + cpp11::stop("Parent does not exist"); } XPtrNode out(node->parent); return SEXP(out); - END_CPP } cpp11::r_string node_path_impl(cpp11::list x) { @@ -762,7 +726,6 @@ cpp11::r_string node_path_impl(cpp11::list x) { [[cpp11::register]] cpp11::strings node_path(cpp11::list x) { - BEGIN_CPP NodeType type = getNodeType(x); switch(type) @@ -784,14 +747,10 @@ cpp11::strings node_path(cpp11::list x) { }; default: stop_unexpected_node_type(); } - - END_CPP } [[cpp11::register]] cpp11::logicals nodes_duplicated(cpp11::list nodes) { - BEGIN_CPP - std::set seen; R_xlen_t n = nodes.size(); @@ -814,7 +773,6 @@ cpp11::logicals nodes_duplicated(cpp11::list nodes) { } return out; - END_CPP } int node_type_impl(cpp11::list x) { @@ -840,7 +798,6 @@ int node_type_impl(cpp11::list x) { [[cpp11::register]] cpp11::integers node_type(cpp11::list x) { - BEGIN_CPP NodeType type = getNodeType(x); switch(type) @@ -862,116 +819,95 @@ cpp11::integers node_type(cpp11::list x) { }; default: stop_unexpected_node_type(); } - - END_CPP } [[cpp11::register]] node_pointer node_copy(node_pointer node_sxp) { - BEGIN_CPP XPtrNode node(node_sxp); XPtrNode copy(xmlCopyNode(node.checked_get(), 1)); return SEXP(copy); - END_CPP } [[cpp11::register]] cpp11::sexp node_set_content(node_pointer node_sxp, cpp11::strings content) { - BEGIN_CPP XPtrNode node(node_sxp); xmlNodeSetContentLen(node.checked_get(), asXmlChar(content), content[0].size()); return R_NilValue; - END_CPP } [[cpp11::register]] cpp11::sexp node_append_content(node_pointer node_sxp, cpp11::strings content) { - BEGIN_CPP XPtrNode node(node_sxp); xmlNodeAddContentLen(node.checked_get(), asXmlChar(content), content[0].size()); return R_NilValue; - END_CPP } [[cpp11::register]] cpp11::sexp node_new_text(node_pointer node_sxp, cpp11::strings content) { - BEGIN_CPP XPtrNode node(node_sxp); xmlAddChild(node.checked_get(), xmlNewTextLen(asXmlChar(content), content[0].size())); return R_NilValue; - END_CPP } [[cpp11::register]] node_pointer node_append_child(node_pointer parent_sxp, node_pointer cur_sxp) { - BEGIN_CPP XPtrNode parent(parent_sxp); XPtrNode cur(cur_sxp); XPtrNode out(xmlAddChild(parent.checked_get(), cur.checked_get())); return SEXP(out); - END_CPP } [[cpp11::register]] node_pointer node_prepend_child(node_pointer parent_sxp, node_pointer cur_sxp) { - BEGIN_CPP XPtrNode parent(parent_sxp); XPtrNode cur(cur_sxp); XPtrNode out(xmlAddPrevSibling(parent.checked_get()->children, cur.checked_get())); return SEXP(out); - END_CPP } // Previous sibling [[cpp11::register]] node_pointer node_prepend_sibling(node_pointer cur_sxp, node_pointer elem_sxp) { - BEGIN_CPP XPtrNode cur(cur_sxp); XPtrNode elem(elem_sxp); XPtrNode out(xmlAddPrevSibling(cur.checked_get(), elem.checked_get())); return SEXP(out); - END_CPP } // Append sibling [[cpp11::register]] node_pointer node_append_sibling(node_pointer cur_sxp, node_pointer elem_sxp) { - BEGIN_CPP XPtrNode cur(cur_sxp); XPtrNode elem(elem_sxp); XPtrNode out(xmlAddNextSibling(cur.checked_get(), elem.checked_get())); return SEXP(out); - END_CPP } // Replace node [[cpp11::register]] node_pointer node_replace(node_pointer old_sxp, node_pointer cur_sxp) { - BEGIN_CPP XPtrNode old(old_sxp); XPtrNode cur(cur_sxp); XPtrNode out(xmlReplaceNode(old.checked_get(), cur.checked_get())); return SEXP(out); - END_CPP } [[cpp11::register]] cpp11::sexp node_remove(node_pointer node_sxp, cpp11::logicals free_sxp) { - BEGIN_CPP XPtrNode node(node_sxp); bool free = cpp11::as_cpp(free_sxp); @@ -981,47 +917,37 @@ cpp11::sexp node_remove(node_pointer node_sxp, cpp11::logicals free_sxp) { } return R_NilValue; - END_CPP } [[cpp11::register]] cpp11::sexp node_new(cpp11::strings name) { - BEGIN_CPP XPtrNode node(xmlNewNode(NULL, asXmlChar(name))); return SEXP(node); - END_CPP } [[cpp11::register]] cpp11::sexp node_cdata_new(cpp11::sexp doc_sxp, cpp11::strings content_sxp) { - BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(xmlNewCDataBlock(doc.checked_get(), asXmlChar(content_sxp), content_sxp[0].size())); return SEXP(node); - END_CPP } [[cpp11::register]] node_pointer node_comment_new(cpp11::strings content) { - BEGIN_CPP XPtrNode node(xmlNewComment(asXmlChar(content))); return SEXP(node); - END_CPP } [[cpp11::register]] node_pointer node_new_ns(cpp11::strings name, cpp11::external_pointer ns_sxp) { - BEGIN_CPP XPtrNs ns(ns_sxp); XPtrNode node(xmlNewNode(ns.checked_get(), asXmlChar(name))); return SEXP(node); - END_CPP } [[cpp11::register]] cpp11::sexp node_set_namespace_uri(doc_pointer doc_sxp, node_pointer node_sxp, cpp11::strings uri) { - BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(node_sxp); @@ -1030,12 +956,10 @@ cpp11::sexp node_set_namespace_uri(doc_pointer doc_sxp, node_pointer node_sxp, c xmlSetNs(node.checked_get(), ns); return R_NilValue; - END_CPP } [[cpp11::register]] cpp11::sexp node_set_namespace_prefix(doc_pointer doc_sxp, node_pointer node_sxp, cpp11::strings prefix_sxp) { - BEGIN_CPP XPtrDoc doc(doc_sxp); XPtrNode node(node_sxp); @@ -1049,12 +973,10 @@ cpp11::sexp node_set_namespace_prefix(doc_pointer doc_sxp, node_pointer node_sxp xmlSetNs(node.checked_get(), ns); return R_NilValue; - END_CPP } [[cpp11::register]] cpp11::sexp node_new_dtd(doc_pointer doc_sxp, cpp11::strings name_sxp, cpp11::strings eid_sxp, cpp11::strings sid_sxp) { - BEGIN_CPP XPtrDoc doc(doc_sxp); std::string name(cpp11::as_cpp(name_sxp)); std::string eid(cpp11::as_cpp(eid_sxp)); @@ -1064,5 +986,4 @@ cpp11::sexp node_new_dtd(doc_pointer doc_sxp, cpp11::strings name_sxp, cpp11::st xmlAddChild(reinterpret_cast(doc.checked_get()), reinterpret_cast(dtd)); return R_NilValue; - END_CPP } diff --git a/src/xml2_utils.h b/src/xml2_utils.h index 1cf87f9c..489817d7 100644 --- a/src/xml2_utils.h +++ b/src/xml2_utils.h @@ -17,6 +17,11 @@ enum NodeType { nodeset = 3, }; +__attribute__ ((noreturn)) +inline void stop_unexpected_node_type() { + cpp11::stop("Unexpected node type"); +} + inline const NodeType getNodeType(SEXP x) { if (Rf_inherits(x, "xml_node")) { return(NodeType::node); @@ -25,7 +30,7 @@ inline const NodeType getNodeType(SEXP x) { } else if (Rf_inherits(x, "xml_missing")) { return(NodeType::missing); } else { - Rf_error("Unexpected node type"); + stop_unexpected_node_type(); } } @@ -37,15 +42,6 @@ inline const xmlChar* asXmlChar(cpp11::strings x) { return (const xmlChar*) cpp11::as_cpp(x); } -#define BEGIN_CPP try { - -#define END_CPP \ - } \ - catch (std::exception & e) { \ - Rf_error("C++ exception: %s", e.what()); \ - } - - // If we are using C++11 disallow moves #if __cplusplus >= 201103L void asXmlChar(std::string&&) = delete; @@ -122,7 +118,7 @@ class NsMap { return it->second; } - Rf_error("Couldn't find url for prefix %s", prefix.c_str()); + cpp11::stop("Couldn't find url for prefix %s", prefix.c_str()); return std::string(); } @@ -133,7 +129,7 @@ class NsMap { } } - Rf_error("Couldn't find prefix for url %s", url.c_str()); + cpp11::stop("Couldn't find prefix for url %s", url.c_str()); return std::string(); } From 01c41e7833f4c2fa6aa2372fc7637a91fe236b99 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Fri, 3 Nov 2023 09:39:09 +0000 Subject: [PATCH 25/25] Some more cleanup --- src/connection.h | 1 - src/cpp11.cpp | 8 ++++---- src/xml2_output.cpp | 8 ++++---- src/xml2_schema.cpp | 2 +- src/xml2_xpath.cpp | 11 ++++++++--- 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/connection.h b/src/connection.h index 7311de27..43a78c7a 100644 --- a/src/connection.h +++ b/src/connection.h @@ -9,7 +9,6 @@ #include #include -cpp11::sexp read_bin(cpp11::sexp con, size_t bytes = 64 * 1024); cpp11::sexp write_bin(cpp11::sexp data, cpp11::sexp con); inline size_t R_WriteConnection(cpp11::sexp con, void* buf, size_t n) { diff --git a/src/cpp11.cpp b/src/cpp11.cpp index de1b603e..d3ea268b 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -398,10 +398,10 @@ extern "C" SEXP _xml2_node_write_character(SEXP node_sxp, SEXP encoding_sxp, SEX END_CPP11 } // xml2_schema.cpp -cpp11::logicals doc_validate(cpp11::sexp doc_sxp, cpp11::sexp schema_sxp); +cpp11::logicals doc_validate(doc_pointer doc_sxp, doc_pointer schema_sxp); extern "C" SEXP _xml2_doc_validate(SEXP doc_sxp, SEXP schema_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(doc_validate(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(schema_sxp))); + return cpp11::as_sexp(doc_validate(cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(schema_sxp))); END_CPP11 } // xml2_url.cpp @@ -440,10 +440,10 @@ extern "C" SEXP _xml2_url_unescape_(SEXP x_sxp) { END_CPP11 } // xml2_xpath.cpp -cpp11::sexp xpath_search(cpp11::sexp node_sxp, cpp11::sexp doc_sxp, cpp11::sexp xpath_sxp, cpp11::strings nsMap_sxp, cpp11::doubles num_results_sxp); +cpp11::sexp xpath_search(node_pointer node_sxp, doc_pointer doc_sxp, cpp11::sexp xpath_sxp, cpp11::strings nsMap_sxp, cpp11::doubles num_results_sxp); extern "C" SEXP _xml2_xpath_search(SEXP node_sxp, SEXP doc_sxp, SEXP xpath_sxp, SEXP nsMap_sxp, SEXP num_results_sxp) { BEGIN_CPP11 - return cpp11::as_sexp(xpath_search(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(xpath_sxp), cpp11::as_cpp>(nsMap_sxp), cpp11::as_cpp>(num_results_sxp))); + return cpp11::as_sexp(xpath_search(cpp11::as_cpp>(node_sxp), cpp11::as_cpp>(doc_sxp), cpp11::as_cpp>(xpath_sxp), cpp11::as_cpp>(nsMap_sxp), cpp11::as_cpp>(num_results_sxp))); END_CPP11 } diff --git a/src/xml2_output.cpp b/src/xml2_output.cpp index 43d5566a..28dad2ac 100644 --- a/src/xml2_output.cpp +++ b/src/xml2_output.cpp @@ -101,7 +101,7 @@ cpp11::sexp doc_write_file(cpp11::sexp doc_sxp, cpp11::strings path_sxp, cpp11:: XPtrDoc doc(doc_sxp); const char* path = cpp11::as_cpp(path_sxp); const char* encoding = cpp11::as_cpp(encoding_sxp); - int options = options_sxp[0]; + int options = cpp11::as_cpp(options_sxp); xmlSaveCtxtPtr savectx = xmlSaveToFilename( path, @@ -166,7 +166,7 @@ cpp11::sexp node_write_file(cpp11::sexp node_sxp, cpp11::strings path_sxp, cpp11 XPtrNode node(node_sxp); const char* path = cpp11::as_cpp(path_sxp); const char* encoding = cpp11::as_cpp(encoding_sxp); - int options = options_sxp[0]; + int options = cpp11::as_cpp(options_sxp); xmlSaveCtxtPtr savectx = xmlSaveToFilename( path, @@ -184,7 +184,7 @@ cpp11::sexp node_write_file(cpp11::sexp node_sxp, cpp11::strings path_sxp, cpp11 cpp11::sexp node_write_connection(cpp11::sexp node_sxp, cpp11::sexp connection, cpp11::strings encoding_sxp, cpp11::integers options_sxp) { XPtrNode node(node_sxp); const char* encoding = cpp11::as_cpp(encoding_sxp); - int options = options_sxp[0]; + int options = cpp11::as_cpp(options_sxp); xmlSaveCtxtPtr savectx = xmlSaveToIO( (xmlOutputWriteCallback)xml_write_callback, @@ -205,7 +205,7 @@ cpp11::sexp node_write_connection(cpp11::sexp node_sxp, cpp11::sexp connection, cpp11::writable::strings node_write_character(cpp11::sexp node_sxp, cpp11::strings encoding_sxp, cpp11::integers options_sxp) { XPtrNode node(node_sxp); const char* encoding = cpp11::as_cpp(encoding_sxp); - int options = options_sxp[0]; + int options = cpp11::as_cpp(options_sxp); xmlBufferPtr buffer = xmlBufferCreate(); diff --git a/src/xml2_schema.cpp b/src/xml2_schema.cpp index 9c6d118e..44c36e86 100644 --- a/src/xml2_schema.cpp +++ b/src/xml2_schema.cpp @@ -19,7 +19,7 @@ void handleSchemaError(void* userData, xmlError* error) { } [[cpp11::register]] -cpp11::logicals doc_validate(cpp11::sexp doc_sxp, cpp11::sexp schema_sxp) { +cpp11::logicals doc_validate(doc_pointer doc_sxp, doc_pointer schema_sxp) { XPtrDoc doc(doc_sxp); XPtrDoc schema(schema_sxp); diff --git a/src/xml2_xpath.cpp b/src/xml2_xpath.cpp index c8e6dd1c..5b8347e2 100644 --- a/src/xml2_xpath.cpp +++ b/src/xml2_xpath.cpp @@ -104,15 +104,20 @@ class XmlSeeker { }; [[cpp11::register]] -cpp11::sexp xpath_search(cpp11::sexp node_sxp, cpp11::sexp doc_sxp, cpp11::sexp xpath_sxp, cpp11::strings nsMap_sxp, cpp11::doubles num_results_sxp) { +cpp11::sexp xpath_search( + node_pointer node_sxp, + doc_pointer doc_sxp, + cpp11::sexp xpath_sxp, + cpp11::strings nsMap_sxp, + cpp11::doubles num_results_sxp) { XPtrNode node(node_sxp); XPtrDoc doc(doc_sxp); + // TODO can the type check be done nicer? if (TYPEOF(xpath_sxp) != STRSXP) { cpp11::stop("XPath must be a string, received %s", Rf_type2char(TYPEOF(xpath_sxp))); } const char* xpath = cpp11::as_cpp(xpath_sxp); - - double num_results = num_results_sxp[0]; + double num_results = cpp11::as_cpp(num_results_sxp); if (num_results == R_PosInf) { num_results = INT_MAX;