@@ -19,15 +19,13 @@ void handleSchemaError(void* userData, xmlError* error) {
1919}
2020
2121[[cpp11::register ]]
22- cpp11::sexp doc_validate (SEXP doc_sxp, SEXP schema_sxp) {
22+ cpp11::logicals doc_validate (cpp11::sexp doc_sxp, cpp11::sexp schema_sxp) {
2323
2424 XPtrDoc doc (doc_sxp);
2525 XPtrDoc schema (schema_sxp);
2626
2727 xmlLineNumbersDefault (1 );
2828
29- BEGIN_CPP
30-
3129 std::vector<std::string> vec;
3230
3331 xmlSchemaParserCtxtPtr cptr = xmlSchemaNewDocParserCtxt (schema.checked_get ());
@@ -40,23 +38,14 @@ cpp11::sexp doc_validate(SEXP doc_sxp, SEXP schema_sxp) {
4038
4139 xmlSchemaSetValidStructuredErrors (vptr, handleSchemaError, &vec);
4240
43- SEXP out = PROTECT (Rf_allocVector (LGLSXP, 1 ));
44-
45- LOGICAL (out)[0 ] = xmlSchemaValidateDoc (vptr, doc.checked_get ()) == 0 ;
41+ bool valid = (xmlSchemaValidateDoc (vptr, doc.checked_get ()) == 0 );
42+ cpp11::writable::logicals out{valid};
4643
4744 xmlSchemaFreeParserCtxt (cptr);
4845 xmlSchemaFreeValidCtxt (vptr);
4946 xmlSchemaFree (sptr);
5047
51- SEXP errors = PROTECT (Rf_allocVector (STRSXP, vec.size ()));
52- for (size_t i = 0 ; i < vec.size (); ++i) {
53- SET_STRING_ELT (errors, i, Rf_mkCharLenCE (vec[i].c_str (), vec[i].size (), CE_UTF8));
54- }
55- Rf_setAttrib (out, Rf_install (" errors" ), errors);
48+ out.attr (" errors" ) = vec;
5649
57-
58- UNPROTECT (2 );
5950 return out;
60-
61- END_CPP
6251}
0 commit comments