This is Unofficial EPICS BASE Doxygen Site
yajl.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2007-2011, Lloyd Hilaiel <lloyd@hilaiel.com>
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 <stdlib.h>
18 #include <string.h>
19 #include <stdarg.h>
20 #include <assert.h>
21 
22 #include "yajl_parse.h"
23 #include "yajl_lex.h"
24 #include "yajl_parser.h"
25 #include "yajl_alloc.h"
26 
27 const char *
29 {
30  const char * statStr = "unknown";
31  switch (stat) {
32  case yajl_status_ok:
33  statStr = "ok, no error";
34  break;
36  statStr = "client canceled parse";
37  break;
38  case yajl_status_error:
39  statStr = "parse error";
40  break;
41  }
42  return statStr;
43 }
44 
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  if (hand == NULL) {
66  return NULL;
67  }
68 
69  /* copy in pointers to allocation routines */
70  memcpy((void *) &(hand->alloc), (void *) afs, sizeof(yajl_alloc_funcs));
71 
72  hand->callbacks = callbacks;
73  hand->ctx = ctx;
74  hand->lexer = NULL;
75  hand->bytesConsumed = 0;
76  hand->decodeBuf = yajl_buf_alloc(&(hand->alloc));
77  hand->flags = 0;
78  yajl_bs_init(hand->stateStack, &(hand->alloc));
80 
81  return hand;
82 }
83 
84 int
86 {
87  int rv = 1;
88  va_list ap;
89  va_start(ap, opt);
90 
91  switch(opt) {
97  if (va_arg(ap, int)) h->flags |= opt;
98  else h->flags &= ~opt;
99  break;
100  default:
101  rv = 0;
102  }
103  va_end(ap);
104 
105  return rv;
106 }
107 
108 void
110 {
111  yajl_bs_free(handle->stateStack);
112  yajl_buf_free(handle->decodeBuf);
113  if (handle->lexer) {
114  yajl_lex_free(handle->lexer);
115  handle->lexer = NULL;
116  }
117  YA_FREE(&(handle->alloc), handle);
118 }
119 
121 yajl_parse(yajl_handle hand, const unsigned char * jsonText,
122  size_t jsonTextLen)
123 {
125 
126  /* lazy allocation of the lexer */
127  if (hand->lexer == NULL) {
128  hand->lexer = yajl_lex_alloc(&(hand->alloc),
129  hand->flags & yajl_allow_comments,
130  !(hand->flags & yajl_dont_validate_strings));
131  }
132  if (hand->lexer == NULL) {
133  return yajl_status_error;
134  }
135 
136  status = yajl_do_parse(hand, jsonText, jsonTextLen);
137  return status;
138 }
139 
140 
143 {
144  /* The lexer is lazy allocated in the first call to parse. if parse is
145  * never called, then no data was provided to parse at all. This is a
146  * "premature EOF" error unless yajl_allow_partial_values is specified.
147  * allocating the lexer now is the simplest possible way to handle this
148  * case while preserving all the other semantics of the parser
149  * (multiple values, partial values, etc). */
150  if (hand->lexer == NULL) {
151  hand->lexer = yajl_lex_alloc(&(hand->alloc),
152  hand->flags & yajl_allow_comments,
153  !(hand->flags & yajl_dont_validate_strings));
154  }
155 
156  return yajl_do_finish(hand);
157 }
158 
159 unsigned char *
161  const unsigned char * jsonText, size_t jsonTextLen)
162 {
163  return yajl_render_error_string(hand, jsonText, jsonTextLen, verbose);
164 }
165 
166 size_t
168 {
169  if (!hand) return 0;
170  else return hand->bytesConsumed;
171 }
172 
173 
174 void
175 yajl_free_error(yajl_handle hand, unsigned char * str)
176 {
177  /* use memory allocation functions if set */
178  YA_FREE(&(hand->alloc), str);
179 }
180 
181 /* XXX: add utility routines to parse from file */
yajl_alloc_funcs alloc
Definition: yajl_parser.h:56
yajl_free_func free
Definition: yajl_common.h:75
#define YA_MALLOC(afs, sz)
Definition: yajl_alloc.h:32
void yajl_free(yajl_handle handle)
Definition: yajl.c:109
#define YA_FREE(afs, ptr)
Definition: yajl_alloc.h:33
unsigned char * yajl_get_error(yajl_handle hand, int verbose, const unsigned char *jsonText, size_t jsonTextLen)
Definition: yajl.c:160
pvd::Status status
#define yajl_bs_push(obs, byte)
yajl_buf yajl_buf_alloc(yajl_alloc_funcs *alloc)
Definition: yajl_buf.c:56
int yajl_config(yajl_handle h, yajl_option opt,...)
Definition: yajl.c:85
#define NULL
Definition: catime.c:38
Memory allocation macros for yajl.
#define str(v)
void yajl_set_default_alloc_funcs(yajl_alloc_funcs *yaf)
Definition: yajl_alloc.c:43
unsigned char * yajl_render_error_string(yajl_handle hand, const unsigned char *jsonText, size_t jsonTextLen, int verbose)
Definition: yajl_parser.c:66
yajl_status yajl_do_parse(yajl_handle hand, const unsigned char *jsonText, size_t jsonTextLen)
Definition: yajl_parser.c:187
#define yajl_bs_free(obs)
yajl_realloc_func realloc
Definition: yajl_common.h:72
yajl_lexer lexer
Definition: yajl_parser.h:45
size_t bytesConsumed
Definition: yajl_parser.h:50
Interface to YAJL&#39;s JSON stream parsing facilities.
const char * yajl_status_to_string(yajl_status stat)
Definition: yajl.c:28
yajl_buf decodeBuf
Definition: yajl_parser.h:52
#define yajl_bs_init(obs, _yaf)
yajl_lexer yajl_lex_alloc(yajl_alloc_funcs *alloc, unsigned int allowComments, unsigned int validateUTF8)
Definition: yajl_lex.c:104
void yajl_free_error(yajl_handle hand, unsigned char *str)
Definition: yajl.c:175
void yajl_buf_free(yajl_buf buf)
Definition: yajl_buf.c:68
yajl_handle yajl_alloc(const yajl_callbacks *callbacks, yajl_alloc_funcs *afs, void *ctx)
Definition: yajl.c:46
yajl_status
Definition: yajl_parse.h:32
yajl_status yajl_parse(yajl_handle hand, const unsigned char *jsonText, size_t jsonTextLen)
Definition: yajl.c:121
void verbose(void)
Definition: verbose.c:27
yajl_status yajl_do_finish(yajl_handle hand)
Definition: yajl_parser.c:160
struct yajl_handle_t * yajl_handle
Definition: yajl_parse.h:46
yajl_status yajl_complete_parse(yajl_handle hand)
Definition: yajl.c:142
void yajl_lex_free(yajl_lexer lxr)
Definition: yajl_lex.c:121
const yajl_callbacks * callbacks
Definition: yajl_parser.h:43
yajl_option
Definition: yajl_parse.h:112
size_t yajl_get_bytes_consumed(yajl_handle hand)
Definition: yajl.c:167
yajl_malloc_func malloc
Definition: yajl_common.h:70
unsigned int flags
Definition: yajl_parser.h:58
yajl_bytestack stateStack
Definition: yajl_parser.h:54