111 lines
2.2 KiB
C
111 lines
2.2 KiB
C
/*
|
|
* MessagePack for C simple buffer implementation
|
|
*
|
|
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
*
|
|
* Distributed under the Boost Software License, Version 1.0.
|
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
|
* http://www.boost.org/LICENSE_1_0.txt)
|
|
*/
|
|
#ifndef MSGPACK_SBUFFER_H
|
|
#define MSGPACK_SBUFFER_H
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/**
|
|
* @defgroup msgpack_sbuffer Simple buffer
|
|
* @ingroup msgpack_buffer
|
|
* @{
|
|
*/
|
|
|
|
typedef struct msgpack_sbuffer {
|
|
size_t size;
|
|
char* data;
|
|
size_t alloc;
|
|
} msgpack_sbuffer;
|
|
|
|
static inline void msgpack_sbuffer_init(msgpack_sbuffer* sbuf)
|
|
{
|
|
memset(sbuf, 0, sizeof(msgpack_sbuffer));
|
|
}
|
|
|
|
static inline void msgpack_sbuffer_destroy(msgpack_sbuffer* sbuf)
|
|
{
|
|
free(sbuf->data);
|
|
}
|
|
|
|
static inline msgpack_sbuffer* msgpack_sbuffer_new(void)
|
|
{
|
|
return (msgpack_sbuffer*)calloc(1, sizeof(msgpack_sbuffer));
|
|
}
|
|
|
|
static inline void msgpack_sbuffer_free(msgpack_sbuffer* sbuf)
|
|
{
|
|
if(sbuf == NULL) { return; }
|
|
msgpack_sbuffer_destroy(sbuf);
|
|
free(sbuf);
|
|
}
|
|
|
|
#ifndef MSGPACK_SBUFFER_INIT_SIZE
|
|
#define MSGPACK_SBUFFER_INIT_SIZE 8192
|
|
#endif
|
|
|
|
static inline int msgpack_sbuffer_write(void* data, const char* buf, size_t len)
|
|
{
|
|
msgpack_sbuffer* sbuf = (msgpack_sbuffer*)data;
|
|
|
|
if(sbuf->alloc - sbuf->size < len) {
|
|
void* tmp;
|
|
size_t nsize = (sbuf->alloc) ?
|
|
sbuf->alloc * 2 : MSGPACK_SBUFFER_INIT_SIZE;
|
|
|
|
while(nsize < sbuf->size + len) {
|
|
size_t tmp_nsize = nsize * 2;
|
|
if (tmp_nsize <= nsize) {
|
|
nsize = sbuf->size + len;
|
|
break;
|
|
}
|
|
nsize = tmp_nsize;
|
|
}
|
|
|
|
tmp = realloc(sbuf->data, nsize);
|
|
if(!tmp) { return -1; }
|
|
|
|
sbuf->data = (char*)tmp;
|
|
sbuf->alloc = nsize;
|
|
}
|
|
|
|
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->size = 0;
|
|
sbuf->data = NULL;
|
|
sbuf->alloc = 0;
|
|
return tmp;
|
|
}
|
|
|
|
static inline void msgpack_sbuffer_clear(msgpack_sbuffer* sbuf)
|
|
{
|
|
sbuf->size = 0;
|
|
}
|
|
|
|
/** @} */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* msgpack/sbuffer.h */
|