stmbl/shared/ringbuf.c

139 lines
2.7 KiB
C

#include "ringbuf.h"
/**
* Read a single byte from a buffer
*
* \param rb pointer to ringbuffer struct
* \param data pointer to data byte
* \return number of bytes read (0 if buffer was empty)
*/
int rb_getc(struct ringbuf *rb, char *data)
{
if (!rb->len)
return 0;
*data = rb->buf[rb->pos++];
if (rb->pos >= rb->bufsize)
rb->pos -= rb->bufsize;
rb->len--;
return 1;
}
/**
* Write a single byte to a buffer
*
* \param rb pointer to ringbuffer struct
* \param data pointer to data byte
* \return number of bytes written (0 if buffer was full)
*/
int rb_putc(struct ringbuf *rb, const char data)
{
if (rb->len >= rb->bufsize)
return 0;
unsigned i = rb->pos + rb->len;
if (i >= rb->bufsize)
i -= rb->bufsize;
rb->buf[i] = data;
rb->len++;
return 1;
}
/**
* Read from a buffer
*
*/
int rb_read(struct ringbuf *rb, void *data, int len)
{
if (len > rb->len)
len = rb->len;
int len1 = len;
if (rb->pos + len1 >= rb->bufsize) {
int len2 = (rb->pos + len1) - rb->bufsize;
len1 -= len2;
memcpy((char*)data + len1, rb->buf, len2);
}
memcpy(data, rb->buf + rb->pos, len1);
rb->len -= len;
rb->pos += len;
if (rb->pos > rb->bufsize)
rb->pos -= rb->bufsize;
return len;
}
/**
* Write to a buffer
*
* \param rb pointer to ringbuffer struct
* \param data pointer to data byte
* \return number of bytes written (0 if buffer was full)
*
*/
int rb_write(struct ringbuf *rb, const void *data, int len)
{
int i = 0;
char* d_ptr = (char*)data;
while(len > 0 && rb_putc(rb, *d_ptr++)){
len--;
i++;
}
return(i);
// if (len > rb->bufsize - rb->len)
// len = rb->bufsize - rb->len;
//
// int len1 = len;
// if (rb->pos + rb->len + len1 >= rb->bufsize) {
// int len2 = (rb->pos + rb->len + len1) - rb->bufsize;
// len1 -= len2;
// memcpy(rb->buf, (char*)data + len1, len2);
// }
//
// memcpy(rb->buf + rb->pos + rb->len, data, len1);
//
// rb->len += len;
// return len;
}
int rb_getline(struct ringbuf *rb, char *ptr, int len){
int ret = 0;
char c;
if (rb->len == 0){
return 0;
}
while(rb_getc(rb, &c) && ret < len){
ret++;
*ptr++ = c;
if(c == '\n'){
*--ptr = '\0';
return ret;
}
}
rb_undo(rb, ret);
return 0;
}
int rb_undo(struct ringbuf *rb, int len){
if(len == 0){
return(0);
}
if (rb->len + len > rb->bufsize){
return(0);
}
if(rb->pos < len){
rb->pos = rb->pos + rb->bufsize - len;
}
else{
rb->pos = rb->pos - len;
}
rb->len = rb->len + len;
return(len);
}