X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/7d484bfa15172982862b450db6a2a3620e95239d..refs/heads/wip:/libguile/vports.c diff --git a/libguile/vports.c b/libguile/vports.c index e7263302b..17eac8695 100644 --- a/libguile/vports.c +++ b/libguile/vports.c @@ -88,6 +88,7 @@ sf_fill_input (SCM port) { SCM p = SCM_PACK (SCM_STREAM (port)); SCM ans; + scm_t_wchar c; scm_t_port_internal *pti; ans = scm_call_0 (SCM_SIMPLE_VECTOR_REF (p, 3)); /* get char. */ @@ -96,18 +97,29 @@ sf_fill_input (SCM port) SCM_ASSERT (SCM_CHARP (ans), ans, SCM_ARG1, "sf_fill_input"); pti = SCM_PORT_GET_INTERNAL (port); - if (pti->encoding_mode == SCM_PORT_ENCODING_MODE_LATIN1) + c = SCM_CHAR (ans); + + if (pti->encoding_mode == SCM_PORT_ENCODING_MODE_LATIN1 + || (pti->encoding_mode == SCM_PORT_ENCODING_MODE_UTF8 && c < 0xff)) { scm_t_port *pt = SCM_PTAB_ENTRY (port); - *pt->read_buf = SCM_CHAR (ans); + *pt->read_buf = c; pt->read_pos = pt->read_buf; pt->read_end = pt->read_buf + 1; - return *pt->read_buf; } else - scm_ungetc_unlocked (SCM_CHAR (ans), port); - return SCM_CHAR (ans); + { + long line = SCM_LINUM (port); + int column = SCM_COL (port); + + scm_ungetc_unlocked (c, port); + + SCM_LINUM (port) = line; + SCM_COL (port) = column; + } + + return c; }