@@ -364,9 +364,22 @@ namespace Rcpp {
364364 }
365365
366366
367+ inline SEXP get_sexp_impl () const {
368+
369+ // workaround for h5 package (currently deprecated so updates
370+ // to CRAN may not be timely)
371+ #ifdef __H5Cpp_H
372+ return Rf_mkCharCE (buffer.c_str (), enc);
373+ #else
374+ if (buffer.find (' \0 ' ) != std::string::npos)
375+ throw embedded_nul_in_string ();
376+ return Rf_mkCharLenCE (buffer.c_str (), buffer.size (), enc);
377+ #endif
378+ }
379+
367380 inline SEXP get_sexp () const {
368381 RCPP_STRING_DEBUG_1 (" String::get_sexp const (valid = %d) " , valid);
369- return valid ? data : Rf_mkCharCE (buffer. c_str (), enc );
382+ return valid ? data : get_sexp_impl ( );
370383 }
371384
372385 inline SEXP get_sexp () {
@@ -395,9 +408,11 @@ namespace Rcpp {
395408 enc = encoding;
396409
397410 if (valid) {
398- data = Rcpp_ReplaceObject (data, Rf_mkCharCE (Rf_translateCharUTF8 (data), encoding));
411+ // TODO: may longjmp on failure to translate?
412+ const char * translated = Rf_translateCharUTF8 (data);
413+ data = Rcpp_ReplaceObject (data, Rf_mkCharCE (translated, encoding));
399414 } else {
400- data = Rf_mkCharCE (buffer. c_str (), encoding );
415+ data = get_sexp_impl ( );
401416 Rcpp_PreserveObject (data);
402417 valid = true ;
403418 }
@@ -469,7 +484,7 @@ namespace Rcpp {
469484 inline void setData () {
470485 RCPP_STRING_DEBUG (" setData" );
471486 if (!valid) {
472- data = Rf_mkCharCE (buffer. c_str (), enc );
487+ data = get_sexp_impl ( );
473488 Rcpp_PreserveObject (data);
474489 valid = true ;
475490 }
0 commit comments