Add DBuf , buffer API

This commit is contained in:
Nils O. Selåsdal
2013-07-07 22:10:41 +02:00
parent 3c5688ad54
commit 2bd5f9f5b9
4 changed files with 319 additions and 1 deletions
+111
View File
@@ -0,0 +1,111 @@
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "ucore/dbuf.h"
void
uc_dbuf_free(DBuf *buf)
{
if(buf != NULL)
free(buf->bufstart);
}
int
uc_dbuf_init(DBuf *buf,size_t initlen)
{
unsigned char *tmp = malloc(initlen);
if(tmp == NULL)
return -1;
buf->start = buf->bufstart = buf->end = tmp;
buf->bufend = tmp + initlen;
return 0;
}
size_t
uc_dbuf_len(DBuf *buf)
{
return buf->end - buf->start;
}
size_t
uc_dbuf_buflen(DBuf *buf)
{
return buf->bufend - buf->bufstart;
}
size_t
uc_dbuf_remaining(DBuf *buf)
{
return buf->bufend - buf->end;
}
int
uc_dbuf_ensure(DBuf *buf,size_t capacity)
{
size_t sz,remaining,len;
remaining = uc_dbuf_remaining(buf);
if(remaining >= capacity)
return 0;
len = uc_dbuf_len(buf);
sz = buf->start - buf->bufstart;
memmove(buf->bufstart,buf->start,len);
if(sz + remaining < capacity) {
size_t newlen = uc_dbuf_buflen(buf) + capacity;
void *tmp = realloc(buf->bufstart,newlen);
if(tmp == NULL)
return 1;
buf->bufstart = tmp;
buf->bufend = buf->bufstart + newlen;
}
buf->start = buf->bufstart;
buf->end = buf->start + len;
return 0;
}
void
uc_dbuf_trim(DBuf *buf)
{
size_t len = uc_dbuf_len(buf);
void *tmp;
if(len == 0)
return;
memmove(buf->bufstart,buf->start,len);
tmp = realloc(buf->bufstart,len);
if(tmp != NULL)
buf->bufstart = tmp;
buf->start = buf->bufstart;
buf->bufend = buf->end = buf->bufstart + len;
}
int
uc_dbuf_take(DBuf *buf,size_t len)
{
size_t buflen = uc_dbuf_len(buf);
if(len == buflen) {
buf->start = buf->end = buf->bufstart;
} else if (len < buflen) {
buf->start = buf->start + len;
} else {
//should maybe assert. This is a serious offence
return 1;
}
return 0;
}
void
uc_dbuf_added(DBuf *buf,size_t len)
{
assert(len <= uc_dbuf_remaining(buf));
buf->end +=len;
}