99#include " xml2_types.h"
1010#include " xml2_utils.h"
1111#include < cstring>
12+ #include < vector>
1213
1314[[cpp11::register ]]
1415cpp11::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 ]]
187176cpp11::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 ]]
220208cpp11::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