diff options
| author | frsyuki <frsyuki@users.sourceforge.jp> | 2010-04-18 00:08:03 +0900 |
|---|---|---|
| committer | frsyuki <frsyuki@users.sourceforge.jp> | 2010-04-18 00:08:03 +0900 |
| commit | ab8e0c9e31585b24f1d4cbfb1e73b0ce249e408a (patch) | |
| tree | 042100bffb170e6bec88cc497345bd4074e2f067 /cpp/msgpack/sbuffer.h | |
| parent | c3f43fb0cf14f596a9ebb1c30b0417b3a8ba9958 (diff) | |
| download | msgpack-python-ab8e0c9e31585b24f1d4cbfb1e73b0ce249e408a.tar.gz | |
c,cpp: reforms source tree
Diffstat (limited to 'cpp/msgpack/sbuffer.h')
| -rw-r--r-- | cpp/msgpack/sbuffer.h | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/cpp/msgpack/sbuffer.h b/cpp/msgpack/sbuffer.h new file mode 100644 index 0000000..bc0a8fd --- /dev/null +++ b/cpp/msgpack/sbuffer.h @@ -0,0 +1,86 @@ +/* + * MessagePack for C simple buffer implementation + * + * Copyright (C) 2008-2009 FURUHASHI Sadayuki + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef MSGPACK_SBUFFER_H__ +#define MSGPACK_SBUFFER_H__ + +#include <stdlib.h> +#include <string.h> + +#ifndef MSGPACK_SBUFFER_INIT_SIZE +#define MSGPACK_SBUFFER_INIT_SIZE 8192 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +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 int msgpack_sbuffer_write(void* data, const char* buf, unsigned int len) +{ + msgpack_sbuffer* sbuf = (msgpack_sbuffer*)data; + + 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->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; +} + + +#ifdef __cplusplus +} +#endif + +#endif /* msgpack/sbuffer.h */ + |
