mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-12 06:41:13 +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:
parent
daedbca7de
commit
e50d921bd8
2 changed files with 28 additions and 5 deletions
|
@ -205,12 +205,16 @@ SCM_DEFINE (scm_read_line, "%read-line", 0, 1, 0,
|
||||||
char *s;
|
char *s;
|
||||||
size_t slen = 0;
|
size_t slen = 0;
|
||||||
SCM line, term;
|
SCM line, term;
|
||||||
|
const char *enc;
|
||||||
|
scm_t_string_failed_conversion_handler hndl;
|
||||||
|
|
||||||
if (SCM_UNBNDP (port))
|
if (SCM_UNBNDP (port))
|
||||||
port = scm_current_input_port ();
|
port = scm_current_input_port ();
|
||||||
SCM_VALIDATE_OPINPORT (1,port);
|
SCM_VALIDATE_OPINPORT (1,port);
|
||||||
|
|
||||||
pt = SCM_PTAB_ENTRY (port);
|
pt = SCM_PTAB_ENTRY (port);
|
||||||
|
enc = pt->encoding;
|
||||||
|
hndl = pt->ilseq_handler;
|
||||||
if (pt->rw_active == SCM_PORT_WRITE)
|
if (pt->rw_active == SCM_PORT_WRITE)
|
||||||
scm_ptobs[SCM_PTOBNUM (port)].flush (port);
|
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;
|
term = line = SCM_EOF_VAL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (s[slen-1] == '\n')
|
if (s[slen - 1] == '\n')
|
||||||
{
|
{
|
||||||
term = SCM_MAKE_CHAR ('\n');
|
term = SCM_MAKE_CHAR ('\n');
|
||||||
s[slen-1] = '\0';
|
s[slen - 1] = '\0';
|
||||||
line = scm_take_locale_stringn (s, slen-1);
|
|
||||||
|
line = scm_from_stringn (s, slen - 1, enc, hndl);
|
||||||
|
free (s);
|
||||||
SCM_INCLINE (port);
|
SCM_INCLINE (port);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Fix: we should check for eof on the port before assuming this. */
|
/* Fix: we should check for eof on the port before assuming this. */
|
||||||
term = SCM_EOF_VAL;
|
term = SCM_EOF_VAL;
|
||||||
line = scm_take_locale_stringn (s, slen);
|
line = scm_from_stringn (s, slen, enc, hndl);
|
||||||
SCM_COL (port) += slen;
|
free (s);
|
||||||
|
SCM_COL (port) += scm_i_string_length (line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -182,6 +182,22 @@
|
||||||
(string=? line test-string)))
|
(string=? line test-string)))
|
||||||
(delete-file filename))
|
(delete-file filename))
|
||||||
|
|
||||||
|
;;; read-line should use the port encoding (not the locale encoding).
|
||||||
|
(let ((str "ĉu bone?"))
|
||||||
|
(with-locale "C"
|
||||||
|
(let* ((filename (test-file))
|
||||||
|
(port (open-file filename "wl")))
|
||||||
|
(set-port-encoding! port "UTF-8")
|
||||||
|
(write-line str port)
|
||||||
|
(let ((in-port (open-input-file filename)))
|
||||||
|
(set-port-encoding! in-port "UTF-8")
|
||||||
|
(let ((line (read-line in-port)))
|
||||||
|
(close-port in-port)
|
||||||
|
(close-port port)
|
||||||
|
(pass-if "file: read-line honors port encoding"
|
||||||
|
(string=? line str))))
|
||||||
|
(delete-file filename))))
|
||||||
|
|
||||||
;;; ungetting characters and strings.
|
;;; ungetting characters and strings.
|
||||||
(with-input-from-string "walk on the moon\nmoon"
|
(with-input-from-string "walk on the moon\nmoon"
|
||||||
(lambda ()
|
(lambda ()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue