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);
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);
}
}
(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 ()