David Kastrup <d...@gnu.org> writes: > Mark H Weaver <m...@netris.org> writes: > >> 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. > > For one thing we are talking about an external file here that is mainly > parsed by LilyPond. LilyPond provides sensible pinpointing of UTF-8 > encoding errors, something which GUILE cannot do with its UTF-8 > representation since it has no transparent or reproducible > representation of bad bytes. Emacs uses overlong encodings for 0-127 to > represent badly encoded bytes (which includes any overlong sequences) in > the range 128-255, making 128-255 encode as patterns 0xc0 0x80 to 0xc1 > 0xbf.
I intend to add a similar mechanism to Guile, but it is not yet done. >> 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); > > dak@lola:/usr/local/tmp/guile$ git grep scm_open_byte_vector_input_port > v2.0.11 > dak@lola:/usr/local/tmp/guile$ git grep scm_open_byte_vector_input_port > origin/stable-2.0 > dak@lola:/usr/local/tmp/guile$ You have mispelled the name of the function. The following (untested) code should work on Guile 2.0.5 or later: 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