yajl - JSON library working with the compiler. URL: http://lloyd.github.com/yajl/

Dependencies:   mbed

Committer:
rolf
Date:
Wed Nov 18 17:56:51 2009 +0000
Revision:
0:34f4a53d4ca3

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rolf 0:34f4a53d4ca3 1 /*
rolf 0:34f4a53d4ca3 2 * Copyright 2007-2009, Lloyd Hilaiel.
rolf 0:34f4a53d4ca3 3 *
rolf 0:34f4a53d4ca3 4 * Redistribution and use in source and binary forms, with or without
rolf 0:34f4a53d4ca3 5 * modification, are permitted provided that the following conditions are
rolf 0:34f4a53d4ca3 6 * met:
rolf 0:34f4a53d4ca3 7 *
rolf 0:34f4a53d4ca3 8 * 1. Redistributions of source code must retain the above copyright
rolf 0:34f4a53d4ca3 9 * notice, this list of conditions and the following disclaimer.
rolf 0:34f4a53d4ca3 10 *
rolf 0:34f4a53d4ca3 11 * 2. Redistributions in binary form must reproduce the above copyright
rolf 0:34f4a53d4ca3 12 * notice, this list of conditions and the following disclaimer in
rolf 0:34f4a53d4ca3 13 * the documentation and/or other materials provided with the
rolf 0:34f4a53d4ca3 14 * distribution.
rolf 0:34f4a53d4ca3 15 *
rolf 0:34f4a53d4ca3 16 * 3. Neither the name of Lloyd Hilaiel nor the names of its
rolf 0:34f4a53d4ca3 17 * contributors may be used to endorse or promote products derived
rolf 0:34f4a53d4ca3 18 * from this software without specific prior written permission.
rolf 0:34f4a53d4ca3 19 *
rolf 0:34f4a53d4ca3 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
rolf 0:34f4a53d4ca3 21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
rolf 0:34f4a53d4ca3 22 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
rolf 0:34f4a53d4ca3 23 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
rolf 0:34f4a53d4ca3 24 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
rolf 0:34f4a53d4ca3 25 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
rolf 0:34f4a53d4ca3 26 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
rolf 0:34f4a53d4ca3 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
rolf 0:34f4a53d4ca3 28 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
rolf 0:34f4a53d4ca3 29 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
rolf 0:34f4a53d4ca3 30 * POSSIBILITY OF SUCH DAMAGE.
rolf 0:34f4a53d4ca3 31 */
rolf 0:34f4a53d4ca3 32
rolf 0:34f4a53d4ca3 33 #ifdef __cplusplus
rolf 0:34f4a53d4ca3 34 extern "C" {
rolf 0:34f4a53d4ca3 35 #endif
rolf 0:34f4a53d4ca3 36
rolf 0:34f4a53d4ca3 37 #include "yajl_buf.h"
rolf 0:34f4a53d4ca3 38
rolf 0:34f4a53d4ca3 39 #include <assert.h>
rolf 0:34f4a53d4ca3 40 #include <stdlib.h>
rolf 0:34f4a53d4ca3 41 #include <string.h>
rolf 0:34f4a53d4ca3 42
rolf 0:34f4a53d4ca3 43 #define YAJL_BUF_INIT_SIZE 2048
rolf 0:34f4a53d4ca3 44
rolf 0:34f4a53d4ca3 45 struct yajl_buf_t {
rolf 0:34f4a53d4ca3 46 unsigned int len;
rolf 0:34f4a53d4ca3 47 unsigned int used;
rolf 0:34f4a53d4ca3 48 unsigned char * data;
rolf 0:34f4a53d4ca3 49 yajl_alloc_funcs * alloc;
rolf 0:34f4a53d4ca3 50 };
rolf 0:34f4a53d4ca3 51
rolf 0:34f4a53d4ca3 52 static
rolf 0:34f4a53d4ca3 53 void yajl_buf_ensure_available(yajl_buf buf, unsigned int want)
rolf 0:34f4a53d4ca3 54 {
rolf 0:34f4a53d4ca3 55 unsigned int need;
rolf 0:34f4a53d4ca3 56
rolf 0:34f4a53d4ca3 57 assert(buf != NULL);
rolf 0:34f4a53d4ca3 58
rolf 0:34f4a53d4ca3 59 /* first call */
rolf 0:34f4a53d4ca3 60 if (buf->data == NULL) {
rolf 0:34f4a53d4ca3 61 buf->len = YAJL_BUF_INIT_SIZE;
rolf 0:34f4a53d4ca3 62 buf->data = (unsigned char *) YA_MALLOC(buf->alloc, buf->len);
rolf 0:34f4a53d4ca3 63 buf->data[0] = 0;
rolf 0:34f4a53d4ca3 64 }
rolf 0:34f4a53d4ca3 65
rolf 0:34f4a53d4ca3 66 need = buf->len;
rolf 0:34f4a53d4ca3 67
rolf 0:34f4a53d4ca3 68 while (want >= (need - buf->used)) need <<= 1;
rolf 0:34f4a53d4ca3 69
rolf 0:34f4a53d4ca3 70 if (need != buf->len) {
rolf 0:34f4a53d4ca3 71 buf->data = (unsigned char *) YA_REALLOC(buf->alloc, buf->data, need);
rolf 0:34f4a53d4ca3 72 buf->len = need;
rolf 0:34f4a53d4ca3 73 }
rolf 0:34f4a53d4ca3 74 }
rolf 0:34f4a53d4ca3 75
rolf 0:34f4a53d4ca3 76 yajl_buf yajl_buf_alloc(yajl_alloc_funcs * alloc)
rolf 0:34f4a53d4ca3 77 {
rolf 0:34f4a53d4ca3 78 yajl_buf b = (yajl_buf)YA_MALLOC(alloc, sizeof(struct yajl_buf_t));
rolf 0:34f4a53d4ca3 79 memset((void *) b, 0, sizeof(struct yajl_buf_t));
rolf 0:34f4a53d4ca3 80 b->alloc = alloc;
rolf 0:34f4a53d4ca3 81 return b;
rolf 0:34f4a53d4ca3 82 }
rolf 0:34f4a53d4ca3 83
rolf 0:34f4a53d4ca3 84 void yajl_buf_free(yajl_buf buf)
rolf 0:34f4a53d4ca3 85 {
rolf 0:34f4a53d4ca3 86 assert(buf != NULL);
rolf 0:34f4a53d4ca3 87 if (buf->data) YA_FREE(buf->alloc, buf->data);
rolf 0:34f4a53d4ca3 88 YA_FREE(buf->alloc, buf);
rolf 0:34f4a53d4ca3 89 }
rolf 0:34f4a53d4ca3 90
rolf 0:34f4a53d4ca3 91 void yajl_buf_append(yajl_buf buf, const void * data, unsigned int len)
rolf 0:34f4a53d4ca3 92 {
rolf 0:34f4a53d4ca3 93 yajl_buf_ensure_available(buf, len);
rolf 0:34f4a53d4ca3 94 if (len > 0) {
rolf 0:34f4a53d4ca3 95 assert(data != NULL);
rolf 0:34f4a53d4ca3 96 memcpy(buf->data + buf->used, data, len);
rolf 0:34f4a53d4ca3 97 buf->used += len;
rolf 0:34f4a53d4ca3 98 buf->data[buf->used] = 0;
rolf 0:34f4a53d4ca3 99 }
rolf 0:34f4a53d4ca3 100 }
rolf 0:34f4a53d4ca3 101
rolf 0:34f4a53d4ca3 102 void yajl_buf_clear(yajl_buf buf)
rolf 0:34f4a53d4ca3 103 {
rolf 0:34f4a53d4ca3 104 buf->used = 0;
rolf 0:34f4a53d4ca3 105 if (buf->data) buf->data[buf->used] = 0;
rolf 0:34f4a53d4ca3 106 }
rolf 0:34f4a53d4ca3 107
rolf 0:34f4a53d4ca3 108 const unsigned char * yajl_buf_data(yajl_buf buf)
rolf 0:34f4a53d4ca3 109 {
rolf 0:34f4a53d4ca3 110 return buf->data;
rolf 0:34f4a53d4ca3 111 }
rolf 0:34f4a53d4ca3 112
rolf 0:34f4a53d4ca3 113 unsigned int yajl_buf_len(yajl_buf buf)
rolf 0:34f4a53d4ca3 114 {
rolf 0:34f4a53d4ca3 115 return buf->used;
rolf 0:34f4a53d4ca3 116 }
rolf 0:34f4a53d4ca3 117
rolf 0:34f4a53d4ca3 118 void
rolf 0:34f4a53d4ca3 119 yajl_buf_truncate(yajl_buf buf, unsigned int len)
rolf 0:34f4a53d4ca3 120 {
rolf 0:34f4a53d4ca3 121 assert(len <= buf->used);
rolf 0:34f4a53d4ca3 122 buf->used = len;
rolf 0:34f4a53d4ca3 123 }
rolf 0:34f4a53d4ca3 124
rolf 0:34f4a53d4ca3 125 #ifdef __cplusplus
rolf 0:34f4a53d4ca3 126 }
rolf 0:34f4a53d4ca3 127 #endif