--- margi2/ringbuffy.c 2000/12/03 22:41:04 1.1 +++ margi2/ringbuffy.c 2001/03/29 23:12:01 1.2 @@ -88,6 +88,39 @@ int ring_write(ringbuffy *rbuf, const ch } +int ring_writek(ringbuffy *rbuf, const char *data, int count) +{ + + long diff, free, pos, rest; + + + if (count <=0 || !rbuf->buffy) return 0; + pos = rbuf->write_pos; + rest = rbuf->size - pos; + diff = rbuf->read_pos - pos; + free = (diff > 0) ? diff-4 : rbuf->size+diff-4; + + if ( free <= 0 ) return 0; + if ( free < count ) count = free; + + if (count >= rest){ + if(memcpy(rbuf->buffy+pos, data, rest)) + return -EFAULT; + if (count - rest) + if(memcpy(rbuf->buffy, data+rest, + count - rest)) + return -EFAULT; + rbuf->write_pos = count - rest; + } else { + memcpy(rbuf->buffy+pos, data, count); + rbuf->write_pos += count; + } + + return count; +} + + + int ring_read(ringbuffy *rbuf, char *data, int count) { @@ -147,11 +180,10 @@ int ring_read_direct(ringbuffy *rbuf, in long ring_read_rest(ringbuffy *rbuf){ - long diff, free, pos, rest; + long diff, free, pos; if (!rbuf->buffy) return 0; pos = rbuf->read_pos; - rest = rbuf->size - pos; diff = rbuf->write_pos - pos; free = (diff >= 0) ? diff : rbuf->size+diff; @@ -159,11 +191,10 @@ long ring_read_rest(ringbuffy *rbuf){ } long ring_write_rest(ringbuffy *rbuf){ - long diff, free, pos, rest; + long diff, free, pos; if (!rbuf->buffy) return 0; pos = rbuf->write_pos; - rest = rbuf->size - pos; diff = rbuf->read_pos - pos; free = (diff > 0) ? diff-4 : rbuf->size+diff-4;