diff options
author | Andy Wingo <wingo@pobox.com> | 2014-07-21 21:36:30 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2014-07-21 21:38:16 +0200 |
commit | 3c01acbcf5afe0be07d44a12cf3f23106b8ca1a5 (patch) | |
tree | c0171c5c723e8cd13e9ddbdea4244af493715e03 | |
parent | 681f2b8585eeda8bc0b3e5acd78d80abd3385ee9 (diff) | |
download | guile-3c01acbcf5afe0be07d44a12cf3f23106b8ca1a5.tar.gz |
Soft port fill-input doesn't alter line or column
* libguile/vports.c (sf_fill_input): Save and restore the line/column
info around the ungetc.
-rw-r--r-- | libguile/vports.c | 22 |
1 files changed, 17 insertions, 5 deletions
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; } |