c: msgpack_sbuffer; cpp: msgpack::sbuffer

This commit is contained in:
frsyuki
2009-03-01 00:59:15 +09:00
parent 00dcad17b9
commit 76f18a0ea6
4 changed files with 73 additions and 39 deletions

View File

@@ -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
}