int iomb_read(mval *v,int4 t) { io_desc *io_ptr; d_mb_struct *mb_ptr; int status; assert(stringpool.free >= stringpool.base); assert(stringpool.free <= stringpool.top); io_ptr = io_curr_device.in; mb_ptr = (d_mb_struct *) io_ptr->dev_sp; if (stringpool.free + mb_ptr->maxmsg > stringpool.top) stp_gcol (mb_ptr->maxmsg); v->str.addr = (char *)stringpool.free; status = TRUE; assert (io_ptr->state == dev_open); if (mb_ptr->in_top == mb_ptr->in_pos) status = iomb_dataread(t); memcpy(v->str.addr,mb_ptr->in_pos,(v->str.len = INTCAST(mb_ptr->in_top - mb_ptr->in_pos))); mb_ptr->in_pos = mb_ptr->in_top = mb_ptr->inbuf; io_ptr->dollar.x = 0; io_ptr->dollar.y++; return status; }
int iomb_readfl(mval *v, int4 length, int4 t) { int status; io_desc *io_ptr; d_mb_struct *mb_ptr; int len; status = TRUE; io_ptr = io_curr_device.in; mb_ptr = (d_mb_struct *) io_ptr->dev_sp; assert (io_ptr->state == dev_open); if((mb_ptr->in_top - mb_ptr->in_pos) < length) { status = iomb_dataread(t); } if(( len = (int)(mb_ptr->in_top - mb_ptr->in_pos)) > length) { len = length; } memcpy(v->str.addr, mb_ptr->in_pos, len); v->str.len = len; mb_ptr->in_pos += len; io_ptr->dollar.x += len; return status; }
short iomb_rdone(mint *v,int4 t) { short status; io_desc *io_ptr; d_mb_struct *mb_ptr; status = TRUE; io_ptr = io_curr_device.in; mb_ptr = (d_mb_struct *) io_ptr->dev_sp; assert (io_ptr->state == dev_open); if(mb_ptr->in_top == mb_ptr->in_pos) status = iomb_dataread(t); if (!status) { *v = -1; return status; } *v = *mb_ptr->in_pos++; io_ptr->dollar.x++; return TRUE; }
int iomb_rdone(mint *v,int4 t) { short not_timed_out; io_desc *io_ptr; d_mb_struct *mb_ptr; io_ptr = io_curr_device.in; assert (io_ptr->state == dev_open); mb_ptr = (d_mb_struct *) io_ptr->dev_sp; if (mb_ptr->in_top == mb_ptr->in_pos) not_timed_out = iomb_dataread(t); else not_timed_out = TRUE; if (not_timed_out && (mb_ptr->in_top != mb_ptr->in_pos)) { *v = *mb_ptr->in_pos++; if ((++io_ptr->dollar.x > io_ptr->width) && io_ptr->wrap) { io_ptr->dollar.y += (io_ptr->dollar.x / io_ptr->width); if(io_ptr->length) io_ptr->dollar.y %= io_ptr->length; io_ptr->dollar.x %= io_ptr->width; } } else { *v = -1; if (io_ptr->dollar.zeof) { io_ptr->dollar.x = 0; io_ptr->dollar.y++; } } return not_timed_out; }