X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/fbb857a472eb4e69c1cba05e86646b7004f32df6..f0893308461d9586d4fd00d78fd7999a660058ff:/libguile/vports.c diff --git a/libguile/vports.c b/libguile/vports.c index cea11c61d..75e7df303 100644 --- a/libguile/vports.c +++ b/libguile/vports.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1998,1999,2000,2001, 2002, 2003, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,1999,2000,2001, 2002, 2003, 2006, 2009, 2010 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -56,21 +56,11 @@ sf_flush (SCM port) scm_t_port *pt = SCM_PTAB_ENTRY (port); SCM stream = SCM_PACK (pt->stream); - if (pt->write_pos > pt->write_buf) - { - /* write the byte. */ - scm_call_1 (SCM_SIMPLE_VECTOR_REF (stream, 0), - SCM_MAKE_CHAR (*pt->write_buf)); - pt->write_pos = pt->write_buf; - - /* flush the output. */ - { - SCM f = SCM_SIMPLE_VECTOR_REF (stream, 2); + SCM f = SCM_SIMPLE_VECTOR_REF (stream, 2); + + if (scm_is_true (f)) + scm_call_0 (f); - if (scm_is_true (f)) - scm_call_0 (f); - } - } } static void @@ -78,6 +68,10 @@ sf_write (SCM port, const void *data, size_t size) { SCM p = SCM_PACK (SCM_STREAM (port)); + /* DATA is assumed to be a locale-encoded C string, which makes it + hard to reliably pass binary data to a soft port. It can be + achieved by choosing a Latin-1 locale, though, but the recommended + approach is to use an R6RS "custom binary output port" instead. */ scm_call_1 (SCM_SIMPLE_VECTOR_REF (p, 1), scm_from_locale_stringn ((char *) data, size)); } @@ -92,19 +86,26 @@ sf_fill_input (SCM port) { SCM p = SCM_PACK (SCM_STREAM (port)); SCM ans; + scm_t_port *pt; ans = scm_call_0 (SCM_SIMPLE_VECTOR_REF (p, 3)); /* get char. */ if (scm_is_false (ans) || SCM_EOF_OBJECT_P (ans)) return EOF; SCM_ASSERT (SCM_CHARP (ans), ans, SCM_ARG1, "sf_fill_input"); - { - scm_t_port *pt = SCM_PTAB_ENTRY (port); - - *pt->read_buf = SCM_CHAR (ans); - pt->read_pos = pt->read_buf; - pt->read_end = pt->read_buf + 1; - return *pt->read_buf; - } + pt = SCM_PTAB_ENTRY (port); + + if (pt->encoding == NULL) + { + scm_t_port *pt = SCM_PTAB_ENTRY (port); + + *pt->read_buf = SCM_CHAR (ans); + pt->read_pos = pt->read_buf; + pt->read_end = pt->read_buf + 1; + return *pt->read_buf; + } + else + scm_ungetc (SCM_CHAR (ans), port); + return SCM_CHAR (ans); } @@ -213,7 +214,6 @@ scm_make_sfptob () { scm_t_bits tc = scm_make_port_type ("soft", sf_fill_input, sf_write); - scm_set_port_mark (tc, scm_markstream); scm_set_port_flush (tc, sf_flush); scm_set_port_close (tc, sf_close); scm_set_port_input_waiting (tc, sf_input_waiting);