Skip to content

Commit e351747

Browse files
committed
Convert xml2_doc.cpp
1 parent cd54aed commit e351747

File tree

2 files changed

+54
-88
lines changed

2 files changed

+54
-88
lines changed

src/cpp11.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,59 +20,59 @@ extern "C" SEXP _xml2_xml_parse_options_() {
2020
END_CPP11
2121
}
2222
// xml2_doc.cpp
23-
cpp11::sexp doc_parse_file(SEXP path_sxp, SEXP encoding_sxp, SEXP as_html_sxp, SEXP options_sxp);
23+
cpp11::sexp doc_parse_file(cpp11::strings path_sxp, cpp11::strings encoding_sxp, cpp11::logicals as_html_sxp, cpp11::integers options_sxp);
2424
extern "C" SEXP _xml2_doc_parse_file(SEXP path_sxp, SEXP encoding_sxp, SEXP as_html_sxp, SEXP options_sxp) {
2525
BEGIN_CPP11
26-
return cpp11::as_sexp(doc_parse_file(cpp11::as_cpp<cpp11::decay_t<SEXP>>(path_sxp), cpp11::as_cpp<cpp11::decay_t<SEXP>>(encoding_sxp), cpp11::as_cpp<cpp11::decay_t<SEXP>>(as_html_sxp), cpp11::as_cpp<cpp11::decay_t<SEXP>>(options_sxp)));
26+
return cpp11::as_sexp(doc_parse_file(cpp11::as_cpp<cpp11::decay_t<cpp11::strings>>(path_sxp), cpp11::as_cpp<cpp11::decay_t<cpp11::strings>>(encoding_sxp), cpp11::as_cpp<cpp11::decay_t<cpp11::logicals>>(as_html_sxp), cpp11::as_cpp<cpp11::decay_t<cpp11::integers>>(options_sxp)));
2727
END_CPP11
2828
}
2929
// xml2_doc.cpp
30-
cpp11::sexp doc_parse_raw(SEXP x, SEXP encoding_sxp, SEXP base_url_sxp, SEXP as_html_sxp, SEXP options_sxp);
30+
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);
3131
extern "C" SEXP _xml2_doc_parse_raw(SEXP x, SEXP encoding_sxp, SEXP base_url_sxp, SEXP as_html_sxp, SEXP options_sxp) {
3232
BEGIN_CPP11
33-
return cpp11::as_sexp(doc_parse_raw(cpp11::as_cpp<cpp11::decay_t<SEXP>>(x), cpp11::as_cpp<cpp11::decay_t<SEXP>>(encoding_sxp), cpp11::as_cpp<cpp11::decay_t<SEXP>>(base_url_sxp), cpp11::as_cpp<cpp11::decay_t<SEXP>>(as_html_sxp), cpp11::as_cpp<cpp11::decay_t<SEXP>>(options_sxp)));
33+
return cpp11::as_sexp(doc_parse_raw(cpp11::as_cpp<cpp11::decay_t<cpp11::raws>>(x), cpp11::as_cpp<cpp11::decay_t<cpp11::strings>>(encoding_sxp), cpp11::as_cpp<cpp11::decay_t<cpp11::strings>>(base_url_sxp), cpp11::as_cpp<cpp11::decay_t<cpp11::logicals>>(as_html_sxp), cpp11::as_cpp<cpp11::decay_t<cpp11::integers>>(options_sxp)));
3434
END_CPP11
3535
}
3636
// xml2_doc.cpp
37-
cpp11::sexp doc_root(SEXP x);
37+
cpp11::sexp doc_root(cpp11::sexp x);
3838
extern "C" SEXP _xml2_doc_root(SEXP x) {
3939
BEGIN_CPP11
40-
return cpp11::as_sexp(doc_root(cpp11::as_cpp<cpp11::decay_t<SEXP>>(x)));
40+
return cpp11::as_sexp(doc_root(cpp11::as_cpp<cpp11::decay_t<cpp11::sexp>>(x)));
4141
END_CPP11
4242
}
4343
// xml2_doc.cpp
44-
cpp11::sexp doc_has_root(SEXP x_sxp);
44+
cpp11::logicals doc_has_root(cpp11::sexp x_sxp);
4545
extern "C" SEXP _xml2_doc_has_root(SEXP x_sxp) {
4646
BEGIN_CPP11
47-
return cpp11::as_sexp(doc_has_root(cpp11::as_cpp<cpp11::decay_t<SEXP>>(x_sxp)));
47+
return cpp11::as_sexp(doc_has_root(cpp11::as_cpp<cpp11::decay_t<cpp11::sexp>>(x_sxp)));
4848
END_CPP11
4949
}
5050
// xml2_doc.cpp
51-
cpp11::sexp doc_url(SEXP doc_sxp);
51+
cpp11::strings doc_url(cpp11::sexp doc_sxp);
5252
extern "C" SEXP _xml2_doc_url(SEXP doc_sxp) {
5353
BEGIN_CPP11
54-
return cpp11::as_sexp(doc_url(cpp11::as_cpp<cpp11::decay_t<SEXP>>(doc_sxp)));
54+
return cpp11::as_sexp(doc_url(cpp11::as_cpp<cpp11::decay_t<cpp11::sexp>>(doc_sxp)));
5555
END_CPP11
5656
}
5757
// xml2_doc.cpp
58-
cpp11::sexp doc_new(SEXP version_sxp, SEXP encoding_sxp);
58+
cpp11::sexp doc_new(cpp11::sexp version_sxp, cpp11::strings encoding_sxp);
5959
extern "C" SEXP _xml2_doc_new(SEXP version_sxp, SEXP encoding_sxp) {
6060
BEGIN_CPP11
61-
return cpp11::as_sexp(doc_new(cpp11::as_cpp<cpp11::decay_t<SEXP>>(version_sxp), cpp11::as_cpp<cpp11::decay_t<SEXP>>(encoding_sxp)));
61+
return cpp11::as_sexp(doc_new(cpp11::as_cpp<cpp11::decay_t<cpp11::sexp>>(version_sxp), cpp11::as_cpp<cpp11::decay_t<cpp11::strings>>(encoding_sxp)));
6262
END_CPP11
6363
}
6464
// xml2_doc.cpp
65-
cpp11::sexp doc_set_root(SEXP doc_sxp, SEXP root_sxp);
65+
cpp11::sexp doc_set_root(cpp11::sexp doc_sxp, cpp11::sexp root_sxp);
6666
extern "C" SEXP _xml2_doc_set_root(SEXP doc_sxp, SEXP root_sxp) {
6767
BEGIN_CPP11
68-
return cpp11::as_sexp(doc_set_root(cpp11::as_cpp<cpp11::decay_t<SEXP>>(doc_sxp), cpp11::as_cpp<cpp11::decay_t<SEXP>>(root_sxp)));
68+
return cpp11::as_sexp(doc_set_root(cpp11::as_cpp<cpp11::decay_t<cpp11::sexp>>(doc_sxp), cpp11::as_cpp<cpp11::decay_t<cpp11::sexp>>(root_sxp)));
6969
END_CPP11
7070
}
7171
// xml2_doc.cpp
72-
cpp11::sexp doc_is_html(SEXP doc_sxp);
72+
cpp11::sexp doc_is_html(cpp11::sexp doc_sxp);
7373
extern "C" SEXP _xml2_doc_is_html(SEXP doc_sxp) {
7474
BEGIN_CPP11
75-
return cpp11::as_sexp(doc_is_html(cpp11::as_cpp<cpp11::decay_t<SEXP>>(doc_sxp)));
75+
return cpp11::as_sexp(doc_is_html(cpp11::as_cpp<cpp11::decay_t<cpp11::sexp>>(doc_sxp)));
7676
END_CPP11
7777
}
7878
// xml2_init.cpp

src/xml2_doc.cpp

Lines changed: 38 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "xml2_types.h"
1010
#include "xml2_utils.h"
1111
#include <cstring>
12+
#include <vector>
1213

1314
[[cpp11::register]]
1415
cpp11::sexp xml_parse_options_() {
@@ -42,7 +43,7 @@ cpp11::sexp xml_parse_options_() {
4243
#define HAS_BIG_LINES
4344
#endif
4445

45-
const char * names[] = {
46+
std::vector<std::string> names = {
4647
"RECOVER",
4748
"NOENT",
4849
"DTDLOAD",
@@ -80,7 +81,7 @@ cpp11::sexp xml_parse_options_() {
8081
#endif
8182
};
8283

83-
const int values[] = {
84+
std::vector<int> values = {
8485
XML_PARSE_RECOVER,
8586
XML_PARSE_NOENT,
8687
XML_PARSE_DTDLOAD,
@@ -118,7 +119,7 @@ cpp11::sexp xml_parse_options_() {
118119
#endif
119120
};
120121

121-
const char * descriptions[] = {
122+
std::vector<std::string> descriptions = {
122123
"recover on errors",
123124
"substitute entities",
124125
"load the external subset",
@@ -156,22 +157,10 @@ cpp11::sexp xml_parse_options_() {
156157
#endif
157158
};
158159

159-
size_t size = sizeof(values) / sizeof(values[0]);
160+
cpp11::writable::integers out_values(values);
160161

161-
SEXP out_values = PROTECT(Rf_allocVector(INTSXP, size));
162-
SEXP out_names = PROTECT(Rf_allocVector(STRSXP, size));
163-
SEXP out_descriptions = PROTECT(Rf_allocVector(STRSXP, size));
164-
165-
for (size_t i = 0; i < size; ++i) {
166-
INTEGER(out_values)[i] = values[i];
167-
SET_STRING_ELT(out_names, i, Rf_mkChar(names[i]));
168-
SET_STRING_ELT(out_descriptions, i, Rf_mkChar(descriptions[i]));
169-
}
170-
171-
Rf_setAttrib(out_values, R_NamesSymbol, out_names);
172-
Rf_setAttrib(out_values, Rf_install("descriptions"), out_descriptions);
173-
174-
UNPROTECT(3);
162+
out_values.names() = names;
163+
out_values.attr("descriptions") = descriptions;
175164

176165
return out_values;
177166

@@ -185,15 +174,14 @@ cpp11::sexp xml_parse_options_() {
185174

186175
[[cpp11::register]]
187176
cpp11::sexp doc_parse_file(
188-
SEXP path_sxp,
189-
SEXP encoding_sxp,
190-
SEXP as_html_sxp,
191-
SEXP options_sxp) {
192-
193-
const char* path = CHAR(STRING_ELT(path_sxp, 0));
194-
const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0));
195-
bool as_html = LOGICAL(as_html_sxp)[0];
196-
int options = INTEGER(options_sxp)[0];
177+
cpp11::strings path_sxp,
178+
cpp11::strings encoding_sxp,
179+
cpp11::logicals as_html_sxp,
180+
cpp11::integers options_sxp) {
181+
const char* path = cpp11::as_cpp<const char*>(path_sxp);
182+
const char* encoding = cpp11::as_cpp<const char*>(encoding_sxp);
183+
bool as_html = cpp11::as_cpp<bool>(as_html_sxp);
184+
int options = cpp11::as_cpp<int>(options_sxp);
197185
xmlDoc* pDoc;
198186
if (as_html) {
199187
pDoc = htmlReadFile(
@@ -210,115 +198,93 @@ cpp11::sexp doc_parse_file(
210198
}
211199

212200
if (pDoc == NULL) {
213-
Rf_error("Failed to parse %s", path);
201+
cpp11::stop("Failed to parse %s", path);
214202
}
215203

216204
return SEXP(XPtrDoc(pDoc));
217205
}
218206

219207
[[cpp11::register]]
220208
cpp11::sexp doc_parse_raw(
221-
SEXP x,
222-
SEXP encoding_sxp,
223-
SEXP base_url_sxp,
224-
SEXP as_html_sxp,
225-
SEXP options_sxp) {
226-
227-
BEGIN_CPP
228-
std::string encoding(CHAR(STRING_ELT(encoding_sxp, 0)));
229-
std::string base_url(CHAR(STRING_ELT(base_url_sxp, 0)));
230-
bool as_html = LOGICAL(as_html_sxp)[0];
231-
int options = INTEGER(options_sxp)[0];
209+
cpp11::raws x,
210+
cpp11::strings encoding_sxp,
211+
cpp11::strings base_url_sxp,
212+
cpp11::logicals as_html_sxp,
213+
cpp11::integers options_sxp) {
214+
std::string encoding = cpp11::as_cpp<const char*>(encoding_sxp);
215+
std::string base_url = cpp11::as_cpp<const char*>(base_url_sxp);
216+
bool as_html = cpp11::as_cpp<bool>(as_html_sxp);
217+
int options = cpp11::as_cpp<int>(options_sxp);
232218

233219
xmlDoc* pDoc;
234220
if (as_html) {
235221
pDoc = htmlReadMemory(
236222
(const char *) RAW(x),
237-
Rf_length(x),
223+
x.size(),
238224
base_url == "" ? NULL : base_url.c_str(),
239225
encoding == "" ? NULL : encoding.c_str(),
240226
options
241227
);
242228
} else {
243229
pDoc = xmlReadMemory(
244230
(const char *) RAW(x),
245-
Rf_length(x),
231+
x.size(),
246232
base_url == "" ? NULL : base_url.c_str(),
247233
encoding == "" ? NULL : encoding.c_str(),
248234
options
249235
);
250236
}
251237

252238
if (pDoc == NULL) {
253-
Rf_error("Failed to parse text");
239+
cpp11::stop("Failed to parse text");
254240
}
255241

256242
return SEXP(XPtrDoc(pDoc));
257-
258-
END_CPP
259243
}
260244

261245
[[cpp11::register]]
262-
cpp11::sexp doc_root(SEXP x) {
263-
BEGIN_CPP
246+
cpp11::sexp doc_root(cpp11::sexp x) {
264247
XPtrDoc doc(x);
265248
XPtrNode node(xmlDocGetRootElement(doc.checked_get()));
266249
return SEXP(node);
267-
END_CPP
268250
}
269251

270252
[[cpp11::register]]
271-
cpp11::sexp doc_has_root(SEXP x_sxp) {
272-
BEGIN_CPP
253+
cpp11::logicals doc_has_root(cpp11::sexp x_sxp) {
273254
XPtrDoc x(x_sxp);
274-
return Rf_ScalarLogical(xmlDocGetRootElement(x.get()) != NULL);
275-
END_CPP
255+
return cpp11::logicals({xmlDocGetRootElement(x.get()) != NULL});
276256
}
277257

278258
[[cpp11::register]]
279-
cpp11::sexp doc_url(SEXP doc_sxp) {
280-
BEGIN_CPP
281-
259+
cpp11::strings doc_url(cpp11::sexp doc_sxp) {
282260
XPtrDoc doc(doc_sxp);
283261
if (doc->URL == NULL) {
284262
return Rf_ScalarString(NA_STRING);
285263
}
286264

287-
SEXP out = PROTECT(Rf_allocVector(STRSXP, 1));
288-
SET_STRING_ELT(out, 0, Rf_mkCharCE((const char*) doc->URL, CE_UTF8));
289-
UNPROTECT(1);
290-
291-
return out;
292-
END_CPP
265+
return cpp11::strings({(const char*) doc->URL});
293266
}
294267

295268
[[cpp11::register]]
296-
cpp11::sexp doc_new(SEXP version_sxp, SEXP encoding_sxp) {
297-
298-
const char* encoding = CHAR(STRING_ELT(encoding_sxp, 0));
269+
cpp11::sexp doc_new(cpp11::sexp version_sxp, cpp11::strings encoding_sxp) {
270+
const char* encoding = cpp11::as_cpp<const char*>(encoding_sxp);
299271

300-
BEGIN_CPP
301272
XPtrDoc x(xmlNewDoc(asXmlChar(version_sxp)));
302273
xmlCharEncodingHandlerPtr p = xmlFindCharEncodingHandler(encoding);
303274
x->encoding = xmlStrdup(reinterpret_cast<const xmlChar *>(p->name));
304275
return SEXP(x);
305-
END_CPP
306276
}
307277

308278
[[cpp11::register]]
309-
cpp11::sexp doc_set_root(SEXP doc_sxp, SEXP root_sxp) {
310-
BEGIN_CPP
279+
cpp11::sexp doc_set_root(cpp11::sexp doc_sxp, cpp11::sexp root_sxp) {
311280
XPtrDoc doc(doc_sxp);
312281
XPtrNode root(root_sxp);
313282
XPtrNode out(xmlDocSetRootElement(doc, root));
314283
return SEXP(out);
315-
END_CPP
316284
}
317285

318286
[[cpp11::register]]
319-
cpp11::sexp doc_is_html(SEXP doc_sxp) {
320-
BEGIN_CPP
287+
cpp11::sexp doc_is_html(cpp11::sexp doc_sxp) {
321288
XPtrDoc doc(doc_sxp);
322-
return Rf_ScalarLogical(doc->properties & XML_DOC_HTML);
323-
END_CPP
289+
return cpp11::logicals({doc->properties & XML_DOC_HTML});
324290
}

0 commit comments

Comments
 (0)