123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- /*
- * 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 */
|