This is Unofficial EPICS BASE Doxygen Site
yajl.c File Reference
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <assert.h>
#include "yajl_parse.h"
#include "yajl_lex.h"
#include "yajl_parser.h"
#include "yajl_alloc.h"
+ Include dependency graph for yajl.c:

Go to the source code of this file.

Functions

const char * yajl_status_to_string (yajl_status stat)
 
yajl_handle yajl_alloc (const yajl_callbacks *callbacks, yajl_alloc_funcs *afs, void *ctx)
 
int yajl_config (yajl_handle h, yajl_option opt,...)
 
void yajl_free (yajl_handle handle)
 
yajl_status yajl_parse (yajl_handle hand, const unsigned char *jsonText, size_t jsonTextLen)
 
yajl_status yajl_complete_parse (yajl_handle hand)
 
unsigned char * yajl_get_error (yajl_handle hand, int verbose, const unsigned char *jsonText, size_t jsonTextLen)
 
size_t yajl_get_bytes_consumed (yajl_handle hand)
 
void yajl_free_error (yajl_handle hand, unsigned char *str)
 

Function Documentation

yajl_handle yajl_alloc ( const yajl_callbacks callbacks,
yajl_alloc_funcs afs,
void *  ctx 
)

Allocate a parser handle

Parameters
callbacksA yajl callbacks structure specifying the functions to call when different JSON entities are encountered in the input text. May be NULL, which is only useful for validation.
afsmemory allocation functions, may be NULL for to use C runtime library routines (malloc and friends)
ctxa context pointer that will be passed to callbacks.

Definition at line 46 of file yajl.c.

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 }
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
#define yajl_bs_push(obs, byte)
yajl_buf yajl_buf_alloc(yajl_alloc_funcs *alloc)
Definition: yajl_buf.c:56
#define NULL
Definition: catime.c:38
void yajl_set_default_alloc_funcs(yajl_alloc_funcs *yaf)
Definition: yajl_alloc.c:43
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
yajl_buf decodeBuf
Definition: yajl_parser.h:52
#define yajl_bs_init(obs, _yaf)
struct yajl_handle_t * yajl_handle
Definition: yajl_parse.h:46
const yajl_callbacks * callbacks
Definition: yajl_parser.h:43
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
yajl_status yajl_complete_parse ( yajl_handle  hand)

Parse any remaining buffered json. Since yajl is a stream-based parser, without an explicit end of input, yajl sometimes can't decide if content at the end of the stream is valid or not. For example, if "1" has been fed in, yajl can't know whether another digit is next or some character that would terminate the integer token.

Parameters
hand- a handle to the json parser allocated with yajl_alloc()

Definition at line 142 of file yajl.c.

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 }
yajl_alloc_funcs alloc
Definition: yajl_parser.h:56
#define NULL
Definition: catime.c:38
yajl_lexer lexer
Definition: yajl_parser.h:45
yajl_lexer yajl_lex_alloc(yajl_alloc_funcs *alloc, unsigned int allowComments, unsigned int validateUTF8)
Definition: yajl_lex.c:104
yajl_status yajl_do_finish(yajl_handle hand)
Definition: yajl_parser.c:160
unsigned int flags
Definition: yajl_parser.h:58
int yajl_config ( yajl_handle  h,
yajl_option  opt,
  ... 
)

Allow the modification of parser options subsequent to handle allocation (via yajl_alloc())

Returns
zero in case of errors, non-zero otherwise

Definition at line 85 of file yajl.c.

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 }
unsigned int flags
Definition: yajl_parser.h:58
void yajl_free ( yajl_handle  handle)

Free a parser handle

Definition at line 109 of file yajl.c.

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 }
yajl_alloc_funcs alloc
Definition: yajl_parser.h:56
#define YA_FREE(afs, ptr)
Definition: yajl_alloc.h:33
#define NULL
Definition: catime.c:38
#define yajl_bs_free(obs)
yajl_lexer lexer
Definition: yajl_parser.h:45
yajl_buf decodeBuf
Definition: yajl_parser.h:52
void yajl_buf_free(yajl_buf buf)
Definition: yajl_buf.c:68
void yajl_lex_free(yajl_lexer lxr)
Definition: yajl_lex.c:121
yajl_bytestack stateStack
Definition: yajl_parser.h:54
void yajl_free_error ( yajl_handle  hand,
unsigned char *  str 
)

Free an error returned from yajl_get_error()

Definition at line 175 of file yajl.c.

176 {
177  /* use memory allocation functions if set */
178  YA_FREE(&(hand->alloc), str);
179 }
yajl_alloc_funcs alloc
Definition: yajl_parser.h:56
#define YA_FREE(afs, ptr)
Definition: yajl_alloc.h:33
#define str(v)
size_t yajl_get_bytes_consumed ( yajl_handle  hand)

Get the amount of data consumed from the last chunk passed to YAJL.

In the case of a successful parse this can help you understand if the entire buffer was consumed (which will allow you to handle "junk at end of input").

In the event an error is encountered during parsing, this function affords the client a way to get the offset into the most recent chunk where the error occured. 0 will be returned if no error was encountered.

Definition at line 167 of file yajl.c.

168 {
169  if (!hand) return 0;
170  else return hand->bytesConsumed;
171 }
size_t bytesConsumed
Definition: yajl_parser.h:50
unsigned char* yajl_get_error ( yajl_handle  hand,
int  verbose,
const unsigned char *  jsonText,
size_t  jsonTextLength 
)

Get an error string describing the state of the parse.

If verbose is non-zero, the message will include the JSON text where the error occured, along with an arrow pointing to the specific char.

Returns
A dynamically allocated string will be returned which should be freed with yajl_free_error()

Definition at line 160 of file yajl.c.

162 {
163  return yajl_render_error_string(hand, jsonText, jsonTextLen, verbose);
164 }
unsigned char * yajl_render_error_string(yajl_handle hand, const unsigned char *jsonText, size_t jsonTextLen, int verbose)
Definition: yajl_parser.c:66
void verbose(void)
Definition: verbose.c:27
yajl_status yajl_parse ( yajl_handle  hand,
const unsigned char *  jsonText,
size_t  jsonTextLength 
)

Parse some json!

Parameters
hand- a handle to the json parser allocated with yajl_alloc()
jsonText- a pointer to the UTF8 json text to be parsed
jsonTextLength- the length, in bytes, of input text

Definition at line 121 of file yajl.c.

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 }
yajl_alloc_funcs alloc
Definition: yajl_parser.h:56
pvd::Status status
#define NULL
Definition: catime.c:38
yajl_status yajl_do_parse(yajl_handle hand, const unsigned char *jsonText, size_t jsonTextLen)
Definition: yajl_parser.c:187
yajl_lexer lexer
Definition: yajl_parser.h:45
yajl_lexer yajl_lex_alloc(yajl_alloc_funcs *alloc, unsigned int allowComments, unsigned int validateUTF8)
Definition: yajl_lex.c:104
yajl_status
Definition: yajl_parse.h:32
unsigned int flags
Definition: yajl_parser.h:58
const char* yajl_status_to_string ( yajl_status  code)

Attain a human readable, english, string for an error

Definition at line 28 of file yajl.c.

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 }