mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-12 06:41:13 +02:00
* ioext.c (scm_read_line): Switch to reading properly.
* fports.c, fports.h, gc.c, gdbint.c, ioext.c, ports.c, ports.h, scmsigs.c, strports.c, vports.c: Install the sources which actually correspond to the changes described below. I got the ChangeLog entries and the patch from two different places...
This commit is contained in:
parent
2f9c714095
commit
afc5764cd0
1 changed files with 22 additions and 92 deletions
114
libguile/ioext.c
114
libguile/ioext.c
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
/* Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -143,7 +143,7 @@ scm_read_delimited_x (delims, buf, gobble, port, start, end)
|
||||||
static unsigned char *
|
static unsigned char *
|
||||||
scm_do_read_line (SCM port, int *len_p)
|
scm_do_read_line (SCM port, int *len_p)
|
||||||
{
|
{
|
||||||
struct scm_port_table *pt = SCM_PTAB_ENTRY (port);
|
scm_port *pt = SCM_PTAB_ENTRY (port);
|
||||||
unsigned char *end;
|
unsigned char *end;
|
||||||
|
|
||||||
/* I thought reading lines was simple. Mercy me. */
|
/* I thought reading lines was simple. Mercy me. */
|
||||||
|
@ -290,6 +290,7 @@ SCM
|
||||||
scm_read_line (port)
|
scm_read_line (port)
|
||||||
SCM port;
|
SCM port;
|
||||||
{
|
{
|
||||||
|
scm_port *pt;
|
||||||
char *s;
|
char *s;
|
||||||
int slen;
|
int slen;
|
||||||
SCM line, term;
|
SCM line, term;
|
||||||
|
@ -302,6 +303,10 @@ scm_read_line (port)
|
||||||
port, SCM_ARG1, s_read_line);
|
port, SCM_ARG1, s_read_line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pt = SCM_PTAB_ENTRY (port);
|
||||||
|
if (pt->rw_active == SCM_PORT_WRITE)
|
||||||
|
scm_ptobs[SCM_PTOBNUM (port)].fflush (port);
|
||||||
|
|
||||||
s = scm_do_read_line (port, &slen);
|
s = scm_do_read_line (port, &slen);
|
||||||
|
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
|
@ -320,9 +325,13 @@ scm_read_line (port)
|
||||||
/* Fix: we should check for eof on the port before assuming this. */
|
/* Fix: we should check for eof on the port before assuming this. */
|
||||||
term = SCM_EOF_VAL;
|
term = SCM_EOF_VAL;
|
||||||
line = scm_take_str (s, slen);
|
line = scm_take_str (s, slen);
|
||||||
|
SCM_COL (port) += slen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pt->rw_random)
|
||||||
|
pt->rw_active = SCM_PORT_READ;
|
||||||
|
|
||||||
return scm_cons (line, term);
|
return scm_cons (line, term);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,56 +352,7 @@ SCM
|
||||||
scm_ftell (object)
|
scm_ftell (object)
|
||||||
SCM object;
|
SCM object;
|
||||||
{
|
{
|
||||||
if (SCM_INUMP (object))
|
return scm_lseek (object, SCM_INUM0, SCM_MAKINUM (SEEK_CUR));
|
||||||
{
|
|
||||||
int fdes = SCM_INUM (object);
|
|
||||||
fpos_t pos;
|
|
||||||
|
|
||||||
pos = lseek (fdes, 0, SEEK_CUR);
|
|
||||||
if (pos == -1)
|
|
||||||
scm_syserror (s_ftell);
|
|
||||||
return scm_long2num (pos);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
struct scm_fport *fp;
|
|
||||||
struct scm_port_table *pt;
|
|
||||||
int fdes;
|
|
||||||
fpos_t pos;
|
|
||||||
|
|
||||||
object = SCM_COERCE_OUTPORT (object);
|
|
||||||
SCM_ASSERT (SCM_NIMP (object) && SCM_OPFPORTP (object),
|
|
||||||
object, SCM_ARG1, s_ftell);
|
|
||||||
fp = SCM_FSTREAM (object);
|
|
||||||
pt = SCM_PTAB_ENTRY (object);
|
|
||||||
fdes = fp->fdes;
|
|
||||||
pos = lseek (fdes, 0, SEEK_CUR);
|
|
||||||
if (pos == -1)
|
|
||||||
scm_syserror (s_ftell);
|
|
||||||
/* the seek will only have succeeded if fdes is random access,
|
|
||||||
in which case only one buffer can be filled. */
|
|
||||||
if (pt->write_pos > pt->write_buf)
|
|
||||||
{
|
|
||||||
pos += pt->write_pos - pt->write_buf;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pos -= pt->read_end - pt->read_pos;
|
|
||||||
if (SCM_CRDYP (object))
|
|
||||||
pos -= SCM_N_READY_CHARS (object);
|
|
||||||
}
|
|
||||||
return scm_long2num (pos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clear the three buffers in a port. */
|
|
||||||
#define SCM_CLEAR_BUFFERS(port, pt)\
|
|
||||||
{\
|
|
||||||
if (pt->write_pos > pt->write_buf)\
|
|
||||||
scm_fflush (port);\
|
|
||||||
pt->read_pos = pt->read_end = pt->read_buf;\
|
|
||||||
pt->write_needs_seek = 0;\
|
|
||||||
SCM_CLRDY (port);\
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_PROC (s_fseek, "fseek", 3, 0, 0, scm_fseek);
|
SCM_PROC (s_fseek, "fseek", 3, 0, 0, scm_fseek);
|
||||||
|
@ -403,35 +363,8 @@ scm_fseek (object, offset, whence)
|
||||||
SCM offset;
|
SCM offset;
|
||||||
SCM whence;
|
SCM whence;
|
||||||
{
|
{
|
||||||
int rv;
|
scm_lseek (object, offset, whence);
|
||||||
long loff;
|
|
||||||
|
|
||||||
object = SCM_COERCE_OUTPORT (object);
|
|
||||||
|
|
||||||
loff = scm_num2long (offset, (char *)SCM_ARG2, s_fseek);
|
|
||||||
SCM_ASSERT (SCM_INUMP (whence), whence, SCM_ARG3, s_fseek);
|
|
||||||
if (SCM_NIMP (object) && SCM_OPFPORTP (object))
|
|
||||||
{
|
|
||||||
struct scm_fport *fp = SCM_FSTREAM (object);
|
|
||||||
struct scm_port_table *pt = SCM_PTAB_ENTRY (object);
|
|
||||||
|
|
||||||
/* clear the three buffers. the write buffer should be flushed
|
|
||||||
before changing the position. */
|
|
||||||
if (fp->random)
|
|
||||||
{
|
|
||||||
SCM_CLEAR_BUFFERS (object, pt);
|
|
||||||
} /* if not random, lseek will fail. */
|
|
||||||
rv = lseek (fp->fdes, loff, SCM_INUM (whence));
|
|
||||||
if (rv == -1)
|
|
||||||
scm_syserror (s_fseek);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SCM_ASSERT (SCM_INUMP (object), object, SCM_ARG1, s_fseek);
|
|
||||||
rv = lseek (SCM_INUM (object), loff, SCM_INUM (whence));
|
|
||||||
if (rv == -1)
|
|
||||||
scm_syserror (s_fseek);
|
|
||||||
}
|
|
||||||
return SCM_UNSPECIFIED;
|
return SCM_UNSPECIFIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,18 +388,20 @@ scm_redirect_port (old, new)
|
||||||
newfd = fp->fdes;
|
newfd = fp->fdes;
|
||||||
if (oldfd != newfd)
|
if (oldfd != newfd)
|
||||||
{
|
{
|
||||||
struct scm_port_table *pt = SCM_PTAB_ENTRY (new);
|
scm_port *pt = SCM_PTAB_ENTRY (new);
|
||||||
|
scm_port *old_pt = SCM_PTAB_ENTRY (old);
|
||||||
|
scm_ptobfuns *ptob = &scm_ptobs[SCM_PTOBNUM (new)];
|
||||||
|
|
||||||
/* must flush to old fdes. don't clear all buffers here
|
/* must flush to old fdes. */
|
||||||
in case dup2 fails. */
|
if (pt->rw_active == SCM_PORT_WRITE)
|
||||||
if (pt->write_pos > pt->write_buf)
|
ptob->fflush (new);
|
||||||
scm_fflush (new);
|
else if (pt->rw_active == SCM_PORT_READ)
|
||||||
|
ptob->read_flush (new);
|
||||||
ans = dup2 (oldfd, newfd);
|
ans = dup2 (oldfd, newfd);
|
||||||
if (ans == -1)
|
if (ans == -1)
|
||||||
scm_syserror (s_redirect_port);
|
scm_syserror (s_redirect_port);
|
||||||
fp->random = SCM_FDES_RANDOM_P (fp->fdes);
|
pt->rw_random = old_pt->rw_random;
|
||||||
/* continue using existing buffers, even if inappropriate. */
|
/* continue using existing buffers, even if inappropriate. */
|
||||||
SCM_CLEAR_BUFFERS (new, pt);
|
|
||||||
}
|
}
|
||||||
return SCM_UNSPECIFIED;
|
return SCM_UNSPECIFIED;
|
||||||
}
|
}
|
||||||
|
@ -624,11 +559,6 @@ scm_fdes_to_ports (fd)
|
||||||
void
|
void
|
||||||
scm_init_ioext ()
|
scm_init_ioext ()
|
||||||
{
|
{
|
||||||
/* fseek() symbols. */
|
|
||||||
scm_sysintern ("SEEK_SET", SCM_MAKINUM (SEEK_SET));
|
|
||||||
scm_sysintern ("SEEK_CUR", SCM_MAKINUM (SEEK_CUR));
|
|
||||||
scm_sysintern ("SEEK_END", SCM_MAKINUM (SEEK_END));
|
|
||||||
|
|
||||||
#include "ioext.x"
|
#include "ioext.x"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue