1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-21 03:00:19 +02:00

read-line should use port's encoding, not locale's encoding

* libguile/rdelim.c (scm_read_line): modified, use port's encoding
* test-suite/test/ports.test: new test
This commit is contained in:
Michael Gran 2010-07-16 06:44:59 -07:00
parent daedbca7de
commit e50d921bd8
2 changed files with 28 additions and 5 deletions

View file

@ -205,12 +205,16 @@ SCM_DEFINE (scm_read_line, "%read-line", 0, 1, 0,
char *s;
size_t slen = 0;
SCM line, term;
const char *enc;
scm_t_string_failed_conversion_handler hndl;
if (SCM_UNBNDP (port))
port = scm_current_input_port ();
SCM_VALIDATE_OPINPORT (1,port);
pt = SCM_PTAB_ENTRY (port);
enc = pt->encoding;
hndl = pt->ilseq_handler;
if (pt->rw_active == SCM_PORT_WRITE)
scm_ptobs[SCM_PTOBNUM (port)].flush (port);
@ -220,19 +224,22 @@ SCM_DEFINE (scm_read_line, "%read-line", 0, 1, 0,
term = line = SCM_EOF_VAL;
else
{
if (s[slen-1] == '\n')
if (s[slen - 1] == '\n')
{
term = SCM_MAKE_CHAR ('\n');
s[slen-1] = '\0';
line = scm_take_locale_stringn (s, slen-1);
s[slen - 1] = '\0';
line = scm_from_stringn (s, slen - 1, enc, hndl);
free (s);
SCM_INCLINE (port);
}
else
{
/* Fix: we should check for eof on the port before assuming this. */
term = SCM_EOF_VAL;
line = scm_take_locale_stringn (s, slen);
SCM_COL (port) += slen;
line = scm_from_stringn (s, slen, enc, hndl);
free (s);
SCM_COL (port) += scm_i_string_length (line);
}
}