From: Sam S. <sd...@gn...> - 2003-10-11 05:17:50
|
> * Basim Al-Shaikhli <on...@tz...g> [2003-10-10 20:45:15 +0200]: > > i think (feel free to correct me if i'm wrong) there's a bug in > ext:read-byte-sequence with the :no-hang option it seems to loose the > first read byte. indeed - please try the appended patch. -- Sam Steingold (http://www.podval.org/~sds) running w2k <http://www.camera.org> <http://www.iris.org.il> <http://www.memri.org/> <http://www.mideasttruth.com/> <http://www.honestreporting.com> Good judgment comes from experience and experience comes from bad judgment. --- stream.d.~1.384.~ 2003-10-09 19:17:53.189923800 -0400 +++ stream.d 2003-10-11 01:12:20.566761600 -0400 @@ -4948,18 +4948,28 @@ return true; } -local uintB* low_read_array_unbuffered_handle (object stream, uintB* byteptr, - uintL len, bool no_hang) { - if (UnbufferedStream_status(stream) < 0) # already EOF? - return byteptr; - while (UnbufferedStream_status(stream) > 0) { # bytebuf contains valid bytes? +local inline uintB* UnbufferedStream_pop_all +(object stream, uintB* byteptr, uintL *len) +{ /* pop bytebuf into byteptr */ + while (UnbufferedStream_status(stream) > 0) { /* have valid bytes? */ UnbufferedStreamLow_pop_byte(stream,b); *byteptr++ = b; - len--; - if (len == 0) + if (--*len == 0) + break; + } return byteptr; } + +local uintB* low_read_array_unbuffered_handle (object stream, uintB* byteptr, + uintL len, bool no_hang) { + if (UnbufferedStream_status(stream) < 0) /* already EOF? */ + return byteptr; + byteptr = UnbufferedStream_pop_all(stream,byteptr,&len); + if (len == 0) return byteptr; if (!no_hang || ls_avail_p(low_listen_unbuffered_handle(stream))) { + /* low_listen_unbuffered_handle could add to bytebuf */ + byteptr = UnbufferedStream_pop_all(stream,byteptr,&len); + if (len == 0) return byteptr; var Handle handle = TheHandle(TheStream(stream)->strm_ichannel); run_time_stop(); /* hold run time clock */ begin_system_call(); |