libyajl2 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,175 @@
1
+ /*
2
+ * Copyright (c) 2007-2014, Lloyd Hilaiel <me@lloyd.io>
3
+ *
4
+ * Permission to use, copy, modify, and/or distribute this software for any
5
+ * purpose with or without fee is hereby granted, provided that the above
6
+ * copyright notice and this permission notice appear in all copies.
7
+ *
8
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+ */
16
+
17
+ #include "api/yajl_parse.h"
18
+ #include "yajl_lex.h"
19
+ #include "yajl_parser.h"
20
+ #include "yajl_alloc.h"
21
+
22
+ #include <stdlib.h>
23
+ #include <string.h>
24
+ #include <stdarg.h>
25
+ #include <assert.h>
26
+
27
+ const char *
28
+ yajl_status_to_string(yajl_status stat)
29
+ {
30
+ const char * statStr = "unknown";
31
+ switch (stat) {
32
+ case yajl_status_ok:
33
+ statStr = "ok, no error";
34
+ break;
35
+ case yajl_status_client_canceled:
36
+ statStr = "client canceled parse";
37
+ break;
38
+ case yajl_status_error:
39
+ statStr = "parse error";
40
+ break;
41
+ }
42
+ return statStr;
43
+ }
44
+
45
+ yajl_handle
46
+ yajl_alloc(const yajl_callbacks * callbacks,
47
+ yajl_alloc_funcs * afs,
48
+ void * ctx)
49
+ {
50
+ yajl_handle hand = NULL;
51
+ yajl_alloc_funcs afsBuffer;
52
+
53
+ /* first order of business is to set up memory allocation routines */
54
+ if (afs != NULL) {
55
+ if (afs->malloc == NULL || afs->realloc == NULL || afs->free == NULL)
56
+ {
57
+ return NULL;
58
+ }
59
+ } else {
60
+ yajl_set_default_alloc_funcs(&afsBuffer);
61
+ afs = &afsBuffer;
62
+ }
63
+
64
+ hand = (yajl_handle) YA_MALLOC(afs, sizeof(struct yajl_handle_t));
65
+
66
+ /* copy in pointers to allocation routines */
67
+ memcpy((void *) &(hand->alloc), (void *) afs, sizeof(yajl_alloc_funcs));
68
+
69
+ hand->callbacks = callbacks;
70
+ hand->ctx = ctx;
71
+ hand->lexer = NULL;
72
+ hand->bytesConsumed = 0;
73
+ hand->decodeBuf = yajl_buf_alloc(&(hand->alloc));
74
+ hand->flags = 0;
75
+ yajl_bs_init(hand->stateStack, &(hand->alloc));
76
+ yajl_bs_push(hand->stateStack, yajl_state_start);
77
+
78
+ return hand;
79
+ }
80
+
81
+ int
82
+ yajl_config(yajl_handle h, yajl_option opt, ...)
83
+ {
84
+ int rv = 1;
85
+ va_list ap;
86
+ va_start(ap, opt);
87
+
88
+ switch(opt) {
89
+ case yajl_allow_comments:
90
+ case yajl_dont_validate_strings:
91
+ case yajl_allow_trailing_garbage:
92
+ case yajl_allow_multiple_values:
93
+ case yajl_allow_partial_values:
94
+ if (va_arg(ap, int)) h->flags |= opt;
95
+ else h->flags &= ~opt;
96
+ break;
97
+ default:
98
+ rv = 0;
99
+ }
100
+ va_end(ap);
101
+
102
+ return rv;
103
+ }
104
+
105
+ void
106
+ yajl_free(yajl_handle handle)
107
+ {
108
+ yajl_bs_free(handle->stateStack);
109
+ yajl_buf_free(handle->decodeBuf);
110
+ if (handle->lexer) {
111
+ yajl_lex_free(handle->lexer);
112
+ handle->lexer = NULL;
113
+ }
114
+ YA_FREE(&(handle->alloc), handle);
115
+ }
116
+
117
+ yajl_status
118
+ yajl_parse(yajl_handle hand, const unsigned char * jsonText,
119
+ size_t jsonTextLen)
120
+ {
121
+ yajl_status status;
122
+
123
+ /* lazy allocation of the lexer */
124
+ if (hand->lexer == NULL) {
125
+ hand->lexer = yajl_lex_alloc(&(hand->alloc),
126
+ hand->flags & yajl_allow_comments,
127
+ !(hand->flags & yajl_dont_validate_strings));
128
+ }
129
+
130
+ status = yajl_do_parse(hand, jsonText, jsonTextLen);
131
+ return status;
132
+ }
133
+
134
+
135
+ yajl_status
136
+ yajl_complete_parse(yajl_handle hand)
137
+ {
138
+ /* The lexer is lazy allocated in the first call to parse. if parse is
139
+ * never called, then no data was provided to parse at all. This is a
140
+ * "premature EOF" error unless yajl_allow_partial_values is specified.
141
+ * allocating the lexer now is the simplest possible way to handle this
142
+ * case while preserving all the other semantics of the parser
143
+ * (multiple values, partial values, etc). */
144
+ if (hand->lexer == NULL) {
145
+ hand->lexer = yajl_lex_alloc(&(hand->alloc),
146
+ hand->flags & yajl_allow_comments,
147
+ !(hand->flags & yajl_dont_validate_strings));
148
+ }
149
+
150
+ return yajl_do_finish(hand);
151
+ }
152
+
153
+ unsigned char *
154
+ yajl_get_error(yajl_handle hand, int verbose,
155
+ const unsigned char * jsonText, size_t jsonTextLen)
156
+ {
157
+ return yajl_render_error_string(hand, jsonText, jsonTextLen, verbose);
158
+ }
159
+
160
+ size_t
161
+ yajl_get_bytes_consumed(yajl_handle hand)
162
+ {
163
+ if (!hand) return 0;
164
+ else return hand->bytesConsumed;
165
+ }
166
+
167
+
168
+ void
169
+ yajl_free_error(yajl_handle hand, unsigned char * str)
170
+ {
171
+ /* use memory allocation functions if set */
172
+ YA_FREE(&(hand->alloc), str);
173
+ }
174
+
175
+ /* XXX: add utility routines to parse from file */
@@ -0,0 +1,52 @@
1
+ /*
2
+ * Copyright (c) 2007-2014, Lloyd Hilaiel <me@lloyd.io>
3
+ *
4
+ * Permission to use, copy, modify, and/or distribute this software for any
5
+ * purpose with or without fee is hereby granted, provided that the above
6
+ * copyright notice and this permission notice appear in all copies.
7
+ *
8
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+ */
16
+
17
+ /**
18
+ * \file yajl_alloc.h
19
+ * default memory allocation routines for yajl which use malloc/realloc and
20
+ * free
21
+ */
22
+
23
+ #include "yajl_alloc.h"
24
+ #include <stdlib.h>
25
+
26
+ static void * yajl_internal_malloc(void *ctx, size_t sz)
27
+ {
28
+ (void)ctx;
29
+ return malloc(sz);
30
+ }
31
+
32
+ static void * yajl_internal_realloc(void *ctx, void * previous,
33
+ size_t sz)
34
+ {
35
+ (void)ctx;
36
+ return realloc(previous, sz);
37
+ }
38
+
39
+ static void yajl_internal_free(void *ctx, void * ptr)
40
+ {
41
+ (void)ctx;
42
+ free(ptr);
43
+ }
44
+
45
+ void yajl_set_default_alloc_funcs(yajl_alloc_funcs * yaf)
46
+ {
47
+ yaf->malloc = yajl_internal_malloc;
48
+ yaf->free = yajl_internal_free;
49
+ yaf->realloc = yajl_internal_realloc;
50
+ yaf->ctx = NULL;
51
+ }
52
+
@@ -0,0 +1,34 @@
1
+ /*
2
+ * Copyright (c) 2007-2014, Lloyd Hilaiel <me@lloyd.io>
3
+ *
4
+ * Permission to use, copy, modify, and/or distribute this software for any
5
+ * purpose with or without fee is hereby granted, provided that the above
6
+ * copyright notice and this permission notice appear in all copies.
7
+ *
8
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+ */
16
+
17
+ /**
18
+ * \file yajl_alloc.h
19
+ * default memory allocation routines for yajl which use malloc/realloc and
20
+ * free
21
+ */
22
+
23
+ #ifndef __YAJL_ALLOC_H__
24
+ #define __YAJL_ALLOC_H__
25
+
26
+ #include "api/yajl_common.h"
27
+
28
+ #define YA_MALLOC(afs, sz) (afs)->malloc((afs)->ctx, (sz))
29
+ #define YA_FREE(afs, ptr) (afs)->free((afs)->ctx, (ptr))
30
+ #define YA_REALLOC(afs, ptr, sz) (afs)->realloc((afs)->ctx, (ptr), (sz))
31
+
32
+ void yajl_set_default_alloc_funcs(yajl_alloc_funcs * yaf);
33
+
34
+ #endif
@@ -0,0 +1,103 @@
1
+ /*
2
+ * Copyright (c) 2007-2014, Lloyd Hilaiel <me@lloyd.io>
3
+ *
4
+ * Permission to use, copy, modify, and/or distribute this software for any
5
+ * purpose with or without fee is hereby granted, provided that the above
6
+ * copyright notice and this permission notice appear in all copies.
7
+ *
8
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+ */
16
+
17
+ #include "yajl_buf.h"
18
+
19
+ #include <assert.h>
20
+ #include <stdlib.h>
21
+ #include <string.h>
22
+
23
+ #define YAJL_BUF_INIT_SIZE 2048
24
+
25
+ struct yajl_buf_t {
26
+ size_t len;
27
+ size_t used;
28
+ unsigned char * data;
29
+ yajl_alloc_funcs * alloc;
30
+ };
31
+
32
+ static
33
+ void yajl_buf_ensure_available(yajl_buf buf, size_t want)
34
+ {
35
+ size_t need;
36
+
37
+ assert(buf != NULL);
38
+
39
+ /* first call */
40
+ if (buf->data == NULL) {
41
+ buf->len = YAJL_BUF_INIT_SIZE;
42
+ buf->data = (unsigned char *) YA_MALLOC(buf->alloc, buf->len);
43
+ buf->data[0] = 0;
44
+ }
45
+
46
+ need = buf->len;
47
+
48
+ while (want >= (need - buf->used)) need <<= 1;
49
+
50
+ if (need != buf->len) {
51
+ buf->data = (unsigned char *) YA_REALLOC(buf->alloc, buf->data, need);
52
+ buf->len = need;
53
+ }
54
+ }
55
+
56
+ yajl_buf yajl_buf_alloc(yajl_alloc_funcs * alloc)
57
+ {
58
+ yajl_buf b = YA_MALLOC(alloc, sizeof(struct yajl_buf_t));
59
+ memset((void *) b, 0, sizeof(struct yajl_buf_t));
60
+ b->alloc = alloc;
61
+ return b;
62
+ }
63
+
64
+ void yajl_buf_free(yajl_buf buf)
65
+ {
66
+ assert(buf != NULL);
67
+ if (buf->data) YA_FREE(buf->alloc, buf->data);
68
+ YA_FREE(buf->alloc, buf);
69
+ }
70
+
71
+ void yajl_buf_append(yajl_buf buf, const void * data, size_t len)
72
+ {
73
+ yajl_buf_ensure_available(buf, len);
74
+ if (len > 0) {
75
+ assert(data != NULL);
76
+ memcpy(buf->data + buf->used, data, len);
77
+ buf->used += len;
78
+ buf->data[buf->used] = 0;
79
+ }
80
+ }
81
+
82
+ void yajl_buf_clear(yajl_buf buf)
83
+ {
84
+ buf->used = 0;
85
+ if (buf->data) buf->data[buf->used] = 0;
86
+ }
87
+
88
+ const unsigned char * yajl_buf_data(yajl_buf buf)
89
+ {
90
+ return buf->data;
91
+ }
92
+
93
+ size_t yajl_buf_len(yajl_buf buf)
94
+ {
95
+ return buf->used;
96
+ }
97
+
98
+ void
99
+ yajl_buf_truncate(yajl_buf buf, size_t len)
100
+ {
101
+ assert(len <= buf->used);
102
+ buf->used = len;
103
+ }
@@ -0,0 +1,57 @@
1
+ /*
2
+ * Copyright (c) 2007-2014, Lloyd Hilaiel <me@lloyd.io>
3
+ *
4
+ * Permission to use, copy, modify, and/or distribute this software for any
5
+ * purpose with or without fee is hereby granted, provided that the above
6
+ * copyright notice and this permission notice appear in all copies.
7
+ *
8
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+ */
16
+
17
+ #ifndef __YAJL_BUF_H__
18
+ #define __YAJL_BUF_H__
19
+
20
+ #include "api/yajl_common.h"
21
+ #include "yajl_alloc.h"
22
+
23
+ /*
24
+ * Implementation/performance notes. If this were moved to a header
25
+ * only implementation using #define's where possible we might be
26
+ * able to sqeeze a little performance out of the guy by killing function
27
+ * call overhead. YMMV.
28
+ */
29
+
30
+ /**
31
+ * yajl_buf is a buffer with exponential growth. the buffer ensures that
32
+ * you are always null padded.
33
+ */
34
+ typedef struct yajl_buf_t * yajl_buf;
35
+
36
+ /* allocate a new buffer */
37
+ yajl_buf yajl_buf_alloc(yajl_alloc_funcs * alloc);
38
+
39
+ /* free the buffer */
40
+ void yajl_buf_free(yajl_buf buf);
41
+
42
+ /* append a number of bytes to the buffer */
43
+ void yajl_buf_append(yajl_buf buf, const void * data, size_t len);
44
+
45
+ /* empty the buffer */
46
+ void yajl_buf_clear(yajl_buf buf);
47
+
48
+ /* get a pointer to the beginning of the buffer */
49
+ const unsigned char * yajl_buf_data(yajl_buf buf);
50
+
51
+ /* get the length of the buffer */
52
+ size_t yajl_buf_len(yajl_buf buf);
53
+
54
+ /* truncate the buffer */
55
+ void yajl_buf_truncate(yajl_buf buf, size_t len);
56
+
57
+ #endif
@@ -0,0 +1,69 @@
1
+ /*
2
+ * Copyright (c) 2007-2014, Lloyd Hilaiel <me@lloyd.io>
3
+ *
4
+ * Permission to use, copy, modify, and/or distribute this software for any
5
+ * purpose with or without fee is hereby granted, provided that the above
6
+ * copyright notice and this permission notice appear in all copies.
7
+ *
8
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+ */
16
+
17
+ /*
18
+ * A header only implementation of a simple stack of bytes, used in YAJL
19
+ * to maintain parse state.
20
+ */
21
+
22
+ #ifndef __YAJL_BYTESTACK_H__
23
+ #define __YAJL_BYTESTACK_H__
24
+
25
+ #include "api/yajl_common.h"
26
+
27
+ #define YAJL_BS_INC 128
28
+
29
+ typedef struct yajl_bytestack_t
30
+ {
31
+ unsigned char * stack;
32
+ size_t size;
33
+ size_t used;
34
+ yajl_alloc_funcs * yaf;
35
+ } yajl_bytestack;
36
+
37
+ /* initialize a bytestack */
38
+ #define yajl_bs_init(obs, _yaf) { \
39
+ (obs).stack = NULL; \
40
+ (obs).size = 0; \
41
+ (obs).used = 0; \
42
+ (obs).yaf = (_yaf); \
43
+ } \
44
+
45
+
46
+ /* initialize a bytestack */
47
+ #define yajl_bs_free(obs) \
48
+ if ((obs).stack) (obs).yaf->free((obs).yaf->ctx, (obs).stack);
49
+
50
+ #define yajl_bs_current(obs) \
51
+ (assert((obs).used > 0), (obs).stack[(obs).used - 1])
52
+
53
+ #define yajl_bs_push(obs, byte) { \
54
+ if (((obs).size - (obs).used) == 0) { \
55
+ (obs).size += YAJL_BS_INC; \
56
+ (obs).stack = (obs).yaf->realloc((obs).yaf->ctx,\
57
+ (void *) (obs).stack, (obs).size);\
58
+ } \
59
+ (obs).stack[((obs).used)++] = (byte); \
60
+ }
61
+
62
+ /* removes the top item of the stack, returns nothing */
63
+ #define yajl_bs_pop(obs) { ((obs).used)--; }
64
+
65
+ #define yajl_bs_set(obs, byte) \
66
+ (obs).stack[((obs).used) - 1] = (byte);
67
+
68
+
69
+ #endif