From c6e010138791b69c87dc53931480895bda2d5ba2 Mon Sep 17 00:00:00 2001 From: kramm Date: Wed, 12 Feb 2003 21:19:21 +0000 Subject: [PATCH] added ringbuffer routines. --- src/q.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- src/q.h | 13 ++++++++- 2 files changed, 101 insertions(+), 4 deletions(-) diff --git a/src/q.c b/src/q.c index 9142eec..1e01b56 100644 --- a/src/q.c +++ b/src/q.c @@ -82,7 +82,7 @@ static int mem_put_(mem_t*m,void*data, int length, int null) while(m->len < m->pos) m->len += 64; - m->buffer = m->buffer?realloc(m->buffer,m->len):malloc(m->len); + m->buffer = m->buffer?(char*)realloc(m->buffer,m->len):(char*)malloc(m->len); } memcpy(&m->buffer[n], data, length); if(null) @@ -98,7 +98,93 @@ int mem_putstring(mem_t*m,string_t str) return mem_put_(m, str.str, str.len, 1); } -// ------------------------------- string_t ------------------------------------ +// ------------------------------- ringbuffer_t ------------------------------- + +typedef struct _ringbuffer_internal_t +{ + unsigned char*buffer; + int readpos; + int writepos; + int buffersize; + int available; +} ringbuffer_internal_t; + +void ringbuffer_init(ringbuffer_t*r) +{ + ringbuffer_internal_t*i = (ringbuffer_internal_t*)malloc(sizeof(ringbuffer_internal_t)); + memset(r, 0, sizeof(ringbuffer_t)); + memset(i, 0, sizeof(ringbuffer_internal_t)); + r->internal = i; + i->buffer = (unsigned char*)malloc(1024); + i->buffersize = 1024; +} +int ringbuffer_read(ringbuffer_t*r, void*buf, int len) +{ + unsigned char* data = (unsigned char*)buf; + ringbuffer_internal_t*i = (ringbuffer_internal_t*)r->internal; + if(i->available < len) + len = i->available; + if(!len) + return 0; + if(i->readpos + len > i->buffersize) { + int read1 = i->buffersize-i->readpos; + memcpy(data, &i->buffer[i->readpos], read1); + memcpy(&data[read1], &i->buffer[0], len - read1); + i->readpos = len - read1; + } else { + memcpy(data, &i->buffer[i->readpos], len); + i->readpos += len; + i->readpos %= i->buffersize; + } + i->available -= len; + return len; +} +void ringbuffer_put(ringbuffer_t*r, void*buf, int len) +{ + unsigned char* data = (unsigned char*)buf; + ringbuffer_internal_t*i = (ringbuffer_internal_t*)r->internal; + +/* if( (i->writepos < i->readpos && i->writepos + len >= i->readpos) || + (i->writepos > i->readpos && i->writepos + len >= i->buffersize && + (i->writepos + len) % i->buffersize >= i->readpos) + ) */ + if(i->buffersize - i->available < len) + { + unsigned char* buf2; + int newbuffersize = i->buffersize; + newbuffersize*=3;newbuffersize/=2; /*grow by 50% each time */ + + if(newbuffersize < i->available + len) + newbuffersize = i->available + len; + + buf2 = (unsigned char*)malloc(newbuffersize); + ringbuffer_read(r, buf2, i->available); + free(i->buffer); + i->buffer = buf2; + i->buffersize = newbuffersize; + i->writepos = 0; + i->readpos = i->available; + } + if(i->writepos + len > i->buffersize) { + int read1 = i->buffersize-i->writepos; + memcpy(&i->buffer[i->writepos], data, read1); + memcpy(&i->buffer[0], &data[read1], len - read1); + i->writepos = len - read1; + } else { + memcpy(&i->buffer[i->writepos], data, len); + i->writepos += len; + i->writepos %= i->buffersize; + } + i->available += len; +} +void ringbuffer_clear(ringbuffer_t*r) +{ + ringbuffer_internal_t*i = (ringbuffer_internal_t*)r->internal; + free(i->buffer); + free(i); +} + +// ------------------------------- string_t ----------------------------------- void string_set2(string_t*str, char*text, int len) { @@ -273,7 +359,7 @@ void map_destroy(map_t*map) free(map); } -// ------------------------------- dictionary_t -------------------------------------- +// ------------------------------- dictionary_t ------------------------------- typedef struct _dictionary_internal_t { diff --git a/src/q.h b/src/q.h index cffd63b..21ac51e 100644 --- a/src/q.h +++ b/src/q.h @@ -19,6 +19,12 @@ typedef struct _mem_t { int pos; } mem_t; +typedef struct _ringbuffer_t +{ + void*internal; + int size; +} ringbuffer_t; + /* non-nul terminated string */ typedef struct _string_t { char*str; @@ -36,7 +42,7 @@ typedef struct _dictionary_t { } dictionary_t; /* array of strings */ -typedef struct stringarray_t +typedef struct _stringarray_t { void*internal; } stringarray_t; @@ -47,6 +53,11 @@ int mem_putstring(mem_t*m, string_t str); void mem_clear(mem_t*mem); void mem_destroy(mem_t*mem); +void ringbuffer_init(ringbuffer_t*r); +void ringbuffer_put(ringbuffer_t*r, void*buf, int size); +int ringbuffer_read(ringbuffer_t*r, void*buf, int size); +void ringbuffer_clear(ringbuffer_t*r); + void string_set(string_t*str, char*text); void string_set2(string_t*str, char*text, int len); void string_dup(string_t*str, const char*text); -- 1.7.10.4