[gambit-list] input-port-byte-position

John MacFarlane jgm at berkeley.edu
Tue Oct 17 19:48:59 EDT 2006


Thanks for your quick response.  Here's what I'm seeing now, after
recompiling with the changes you suggested: 

% gsi/gsi
Gambit Version 4.0 beta 20

> (define f (open-input-file "README"))
> (input-port-byte-position f)
0
> (read-char f)
#\R
> (input-port-byte-position f)
1024
> (read-char f)
#\E
> (input-port-byte-position f)
1024
> (read-char f)
#\A
> (input-port-byte-position f)
1024
> (input-port-byte-position f 0)
0
> (read-char f)
#\R
> (input-port-byte-position f)
1024

A different problem, but still a problem.  Any ideas?

JM

+++ Marc Feeley [Oct 17 06 14:20 ]:
> Thanks for the bug report.  The problem is in the function  
> ___device_file_seek_raw_virt in lib/os_io.c (the new position was not  
> being returned).  Please update that function as follows and  
> recompile Gambit, and the system will be consistent with the  
> documentation.
> 
> Marc
> 
> ___HIDDEN ___SCMOBJ ___device_file_seek_raw_virt
>    ___P((___device_stream *self,
>          ___stream_index *pos,
>          int whence),
>         (self,
>          pos,
>          whence)
> ___device_stream *self;
> ___stream_index *pos;
> int whence;)
> {
>   ___device_file *d = ___CAST(___device_file*,self);
> 
>   if (d->base.base.read_stage == ___STAGE_OPEN ||
>       d->base.base.write_stage == ___STAGE_OPEN)
>     {
> #ifndef USE_POSIX
> #ifndef USE_WIN32
> 
>       int new_pos;
>       FILE *stream = d->stream;
> 
>       if (stream == 0)
>         stream = stdout;
> 
>       if (fseek (stream, *pos, whence) < 0 ||
>           (new_pos = ftell (stream)) < 0)
>         return err_code_from_errno ();
> 
>       *pos = new_pos;    /************** ADD THIS *******************/
> 
> #endif
> #endif
> 
> #ifdef USE_POSIX
> 
>       int new_pos;
> 
>       if ((new_pos = lseek (d->fd, *pos, whence)) < 0)
>         return err_code_from_errno ();
> 
>       *pos = new_pos;    /************** ADD THIS *******************/
> 
> #endif
> 
> #ifdef USE_WIN32
> 
> ...
> 
> #endif
>     }
> 
>   return ___FIX(___NO_ERR);
> }
> 



More information about the Gambit-list mailing list