static int DaoStringStream_Read( DaoStream *stream, DString *data, int count ) { DaoStringStream *self = (DaoStringStream*) stream; DString_Reset( data, 0 ); if( self->offset >= self->base.buffer->size ) return -1; if( count >= 0 ){ DString_SubString( self->base.buffer, data, self->offset, count ); self->offset += data->size; }else if( count == -1 ){ int delim = '\n'; daoint pos = DString_FindChar( self->base.buffer, delim, self->offset ); if( self->offset == 0 && (pos == DAO_NULLPOS || pos == self->base.buffer->size-1) ){ DString_Append( data, self->base.buffer ); self->offset = self->base.buffer->size; }else if( pos == DAO_NULLPOS ){ DString_SubString( self->base.buffer, data, pos, -1 ); self->offset = self->base.buffer->size; }else{ DString_SubString( self->base.buffer, data, pos, pos - self->offset + 1 ); self->offset = pos + 1; } if( self->base.mode & DAO_STREAM_AUTOCONV ) DString_ToUTF8( data ); return self->offset < self->base.buffer->size; }else{ if( self->offset == 0 ){ DString_Assign( data, self->base.buffer ); }else{ DString_SubString( self->base.buffer, data, self->offset, -1 ); } self->offset += data->size; } return data->size; }
static void DaoIO_Read( DaoProcess *proc, DaoValue *p[], int N ) { DaoStream *self = proc->stdioStream; DString *ds = DaoProcess_PutChars( proc, "" ); int ch, size, amount = -1; /* amount=-2: all; amount=-1: line; amount>=0: bytes; */ char buf[IO_BUF_SIZE]; if( self == NULL ) self = proc->vmSpace->stdioStream; if( N > 0 ){ self = (DaoStream*) p[0]; amount = -2; } if( DaoIO_CheckMode( self, proc, DAO_STREAM_READABLE ) == 0 ) return; if( N > 1 ){ if( p[1]->type == DAO_INTEGER ){ amount = p[1]->xInteger.value; if( amount < 0 ){ DaoProcess_RaiseError( proc, NULL, "cannot read negative amount!" ); return; } }else{ amount = - 1 - p[1]->xEnum.value; } } DString_Reset( ds, 0 ); self->Read( self, ds, amount ); if( self->mode & DAO_STREAM_AUTOCONV ) DString_ToUTF8( ds ); }