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); Mark