From e50d921bd87e53df33c04831ecf8b3d100af2b7b Mon Sep 17 00:00:00 2001 From: Michael Gran Date: Fri, 16 Jul 2010 06:44:59 -0700 Subject: [PATCH] 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 --- libguile/rdelim.c | 17 ++++++++++++----- test-suite/tests/ports.test | 16 ++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/libguile/rdelim.c b/libguile/rdelim.c index 1f46e5bf0..1340c629c 100644 --- a/libguile/rdelim.c +++ b/libguile/rdelim.c @@ -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); } } diff --git a/test-suite/tests/ports.test b/test-suite/tests/ports.test index 1d8bd5052..9f9985aca 100644 --- a/test-suite/tests/ports.test +++ b/test-suite/tests/ports.test @@ -182,6 +182,22 @@ (string=? line test-string))) (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. (with-input-from-string "walk on the moon\nmoon" (lambda ()