Mark H Weaver <m...@netris.org> writes: > David Kastrup <d...@gnu.org> writes: > >> In 2.0.9, the following patch/code for getting what amounts to a binary >> string port worked. >> >> commit 7f7a124d3470b0d566f796e88f4e2ad5aa043f16 >> Author: David Kastrup <d...@gnu.org> >> Date: Sun Sep 21 18:40:06 2014 +0200 >> >> Source_file::init_port: Keep GUILEv2 from redecoding string input >> >> diff --git a/lily/source-file.cc b/lily/source-file.cc >> index 1118b9d..75ed0d9 100644 >> --- a/lily/source-file.cc >> +++ b/lily/source-file.cc >> @@ -152,7 +152,11 @@ Source_file::init_port () >> // we do our own utf8 encoding and verification in the parser, so we >> // use the no-conversion equivalent of latin1 >> SCM str = scm_from_latin1_string (c_str ()); >> - str_port_ = scm_mkstrport (SCM_INUM0, str, SCM_OPN | SCM_RDNG, >> __FUNCTION__); >> + scm_dynwind_begin ((scm_t_dynwind_flags)0); >> + // Why doesn't scm_set_port_encoding_x work here? >> + scm_dynwind_fluid (ly_lily_module_constant ("%default-port-encoding"), >> SCM_BOOL_F); >> + str_port_ = scm_open_input_string (str); >> + scm_dynwind_end (); >> scm_set_port_filename_x (str_port_, ly_string2scm (name_)); >> } > > This hack of giving Guile a buffer containing UTF-8, but claiming that > it is Latin-1, is not good. It will cause Guile to see non-ASCII > characters as garbage. However, if you insist on doing this, I would > suggest using a bytevector input port instead, like this: (untested) > > char *buf = c_str (); > SCM bv = scm_c_make_bytevector (strlen (buf) + 1); > strcpy (SCM_BYTEVECTOR_CONTENTS (bv), buf); > str_port_ = scm_open_bytevector_input_port (bv, SCM_UNDEFINED);
Sorry, the NUL terminator should not be included: char *buf = c_str (); size_t len = strlen (buf); SCM bv = scm_c_make_bytevector (len); memcpy (SCM_BYTEVECTOR_CONTENTS (bv), buf, len); str_port_ = scm_open_bytevector_input_port (bv, SCM_UNDEFINED); Mark