summaryrefslogtreecommitdiff
path: root/c/sbuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'c/sbuffer.h')
-rw-r--r--c/sbuffer.h37
1 files changed, 27 insertions, 10 deletions
diff --git a/c/sbuffer.h b/c/sbuffer.h
index 3694dbd..8dae103 100644
--- a/c/sbuffer.h
+++ b/c/sbuffer.h
@@ -21,14 +21,18 @@
#include <stdlib.h>
#include <string.h>
+#ifndef MSGPACK_SBUFFER_INIT_SIZE
+#define MSGPACK_SBUFFER_INIT_SIZE 2048
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
-typedef struct {
- char* ptr;
+typedef struct msgpack_sbuffer {
size_t size;
- size_t capacity;
+ char* data;
+ size_t alloc;
} msgpack_sbuffer;
static inline void msgpack_sbuffer_init(msgpack_sbuffer* sbuf)
@@ -38,27 +42,40 @@ static inline void msgpack_sbuffer_init(msgpack_sbuffer* sbuf)
static inline void msgpack_sbuffer_destroy(msgpack_sbuffer* sbuf)
{
- free(sbuf->ptr);
+ free(sbuf->data);
}
static inline int msgpack_sbuffer_write(void* data, const char* buf, unsigned int len)
{
msgpack_sbuffer* sbuf = (msgpack_sbuffer*)data;
- if(sbuf->capacity - sbuf->size < len) {
- size_t nsize = (sbuf->capacity ? sbuf->capacity*2 : 2048);
+
+ if(sbuf->alloc - sbuf->size < len) {
+ size_t nsize = (sbuf->alloc) ?
+ sbuf->alloc * 2 : MSGPACK_SBUFFER_INIT_SIZE;
+
while(nsize < sbuf->size + len) { nsize *= 2; }
- void* tmp = realloc(sbuf->ptr, nsize);
+ void* tmp = realloc(sbuf->data, nsize);
if(!tmp) { return -1; }
- sbuf->ptr = (char*)tmp;
- sbuf->capacity = nsize;
+ sbuf->data = (char*)tmp;
+ sbuf->alloc = nsize;
}
- memcpy(sbuf->ptr + sbuf->size, buf, len);
+
+ memcpy(sbuf->data + sbuf->size, buf, len);
sbuf->size += len;
return 0;
}
+static inline char* msgpack_sbuffer_release(msgpack_sbuffer* sbuf)
+{
+ char* tmp = sbuf->data;
+ sbuf->data = NULL;
+ sbuf->size = 0;
+ sbuf->alloc = NULL;
+ return tmp;
+}
+
#ifdef __cplusplus
}