+1999-08-19 Gary Houston <ghouston@easynet.co.uk>
+
+ * fports.c (fport_write): fix line-buffering mode again.
+ (scm_open_file): recognise 'l' for line-buffering.
+ (scm_setvbuf): recognise _IOLBF for line-buffering.
+
1999-08-19 Mikael Djurfeldt <mdj@thalamus.nada.kth.se>
* Makefile.am (libguile_la_LDFLAGS): Increased the version number
s_setvbuf);
SCM_ASSERT (SCM_INUMP (mode), mode, SCM_ARG2, s_setvbuf);
cmode = SCM_INUM (mode);
- if (cmode != _IONBF && cmode != _IOFBF)
+ if (cmode != _IONBF && cmode != _IOFBF && cmode != _IOLBF)
scm_out_of_range (s_setvbuf, mode);
+
+ if (cmode == _IOLBF)
+ {
+ SCM_SETCAR (port, SCM_CAR (port) | SCM_BUFLINE);
+ cmode = _IOFBF;
+ }
+ else
+ {
+ SCM_SETCAR (port, SCM_CAR (port) ^ SCM_BUFLINE);
+ }
+
if (SCM_UNBNDP (size))
{
if (cmode == _IOFBF)
if (csize < 0 || (cmode == _IONBF && csize > 0))
scm_out_of_range (s_setvbuf, size);
}
+
pt = SCM_PTAB_ENTRY (port);
/* silently discards buffered chars. */
break;
case '0': /* unbuffered: handled later. */
case 'b': /* 'binary' mode: ignored. */
+ case 'l': /* line buffered: handled during output. */
break;
default:
scm_out_of_range (s_open_file, modes);
else
{
const char *input = (char *) data;
- while (size > 0)
+ size_t remaining = size;
+
+ while (remaining > 0)
{
int space = pt->write_end - pt->write_pos;
- int write_len = (size > space) ? space : size;
+ int write_len = (remaining > space) ? space : remaining;
memcpy (pt->write_pos, input, write_len);
pt->write_pos += write_len;
- size -= write_len;
+ remaining -= write_len;
input += write_len;
if (write_len == space)
fport_flush (port);