| yajl_common.h | | yajl_common.h | |
| /* | | /* | |
|
| * Copyright 2010, Lloyd Hilaiel. | | * Copyright (c) 2007-2011, Lloyd Hilaiel <lloyd@hilaiel.com> | |
| * | | | |
| * Redistribution and use in source and binary forms, with or without | | | |
| * modification, are permitted provided that the following conditions are | | | |
| * met: | | | |
| * | | | |
| * 1. Redistributions of source code must retain the above copyright | | | |
| * notice, this list of conditions and the following disclaimer. | | | |
| * | | | |
| * 2. Redistributions in binary form must reproduce the above copyright | | | |
| * notice, this list of conditions and the following disclaimer in | | | |
| * the documentation and/or other materials provided with the | | | |
| * distribution. | | | |
| * | | * | |
|
| * 3. Neither the name of Lloyd Hilaiel nor the names of its | | * Permission to use, copy, modify, and/or distribute this software for any | |
| * contributors may be used to endorse or promote products derived | | * purpose with or without fee is hereby granted, provided that the above | |
| * from this software without specific prior written permission. | | * copyright notice and this permission notice appear in all copies. | |
| * | | * | |
|
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
| * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, | | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
| * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | | | |
| * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | | | |
| * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | | | |
| * POSSIBILITY OF SUCH DAMAGE. | | | |
| */ | | */ | |
| | | | |
| #ifndef __YAJL_COMMON_H__ | | #ifndef __YAJL_COMMON_H__ | |
| #define __YAJL_COMMON_H__ | | #define __YAJL_COMMON_H__ | |
| | | | |
|
| | | #include <stddef.h> | |
| | | | |
| #ifdef __cplusplus | | #ifdef __cplusplus | |
| extern "C" { | | extern "C" { | |
| #endif | | #endif | |
| | | | |
| #define YAJL_MAX_DEPTH 128 | | #define YAJL_MAX_DEPTH 128 | |
| | | | |
| /* msft dll export gunk. To build a DLL on windows, you | | /* msft dll export gunk. To build a DLL on windows, you | |
| * must define WIN32, YAJL_SHARED, and YAJL_BUILD. To use a shared | | * must define WIN32, YAJL_SHARED, and YAJL_BUILD. To use a shared | |
| * DLL, you must define YAJL_SHARED and WIN32 */ | | * DLL, you must define YAJL_SHARED and WIN32 */ | |
| #if defined(WIN32) && defined(YAJL_SHARED) | | #if defined(WIN32) && defined(YAJL_SHARED) | |
| | | | |
| skipping to change at line 61 | | skipping to change at line 47 | |
| #else | | #else | |
| # if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303 | | # if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303 | |
| # define YAJL_API __attribute__ ((visibility("default"))) | | # define YAJL_API __attribute__ ((visibility("default"))) | |
| # else | | # else | |
| # define YAJL_API | | # define YAJL_API | |
| # endif | | # endif | |
| #endif | | #endif | |
| | | | |
| /** pointer to a malloc function, supporting client overriding memory | | /** pointer to a malloc function, supporting client overriding memory | |
| * allocation routines */ | | * allocation routines */ | |
|
| typedef void * (*yajl_malloc_func)(void *ctx, unsigned int sz); | | typedef void * (*yajl_malloc_func)(void *ctx, size_t sz); | |
| | | | |
| /** pointer to a free function, supporting client overriding memory | | /** pointer to a free function, supporting client overriding memory | |
| * allocation routines */ | | * allocation routines */ | |
| typedef void (*yajl_free_func)(void *ctx, void * ptr); | | typedef void (*yajl_free_func)(void *ctx, void * ptr); | |
| | | | |
| /** pointer to a realloc function which can resize an allocation. */ | | /** pointer to a realloc function which can resize an allocation. */ | |
|
| typedef void * (*yajl_realloc_func)(void *ctx, void * ptr, unsigned int sz)
; | | typedef void * (*yajl_realloc_func)(void *ctx, void * ptr, size_t sz); | |
| | | | |
| /** A structure which can be passed to yajl_*_alloc routines to allow the | | /** A structure which can be passed to yajl_*_alloc routines to allow the | |
| * client to specify memory allocation functions to be used. */ | | * client to specify memory allocation functions to be used. */ | |
| typedef struct | | typedef struct | |
| { | | { | |
| /** pointer to a function that can allocate uninitialized memory */ | | /** pointer to a function that can allocate uninitialized memory */ | |
| yajl_malloc_func malloc; | | yajl_malloc_func malloc; | |
| /** pointer to a function that can resize memory allocations */ | | /** pointer to a function that can resize memory allocations */ | |
| yajl_realloc_func realloc; | | yajl_realloc_func realloc; | |
| /** pointer to a function that can free memory allocated using | | /** pointer to a function that can free memory allocated using | |
| | | | |
End of changes. 6 change blocks. |
| 29 lines changed or deleted | | 15 lines changed or added | |
|
| yajl_gen.h | | yajl_gen.h | |
| /* | | /* | |
|
| * Copyright 2010, Lloyd Hilaiel. | | * Copyright (c) 2007-2011, Lloyd Hilaiel <lloyd@hilaiel.com> | |
| * | | | |
| * Redistribution and use in source and binary forms, with or without | | | |
| * modification, are permitted provided that the following conditions are | | | |
| * met: | | | |
| * | | | |
| * 1. Redistributions of source code must retain the above copyright | | | |
| * notice, this list of conditions and the following disclaimer. | | | |
| * | | | |
| * 2. Redistributions in binary form must reproduce the above copyright | | | |
| * notice, this list of conditions and the following disclaimer in | | | |
| * the documentation and/or other materials provided with the | | | |
| * distribution. | | | |
| * | | * | |
|
| * 3. Neither the name of Lloyd Hilaiel nor the names of its | | * Permission to use, copy, modify, and/or distribute this software for any | |
| * contributors may be used to endorse or promote products derived | | * purpose with or without fee is hereby granted, provided that the above | |
| * from this software without specific prior written permission. | | * copyright notice and this permission notice appear in all copies. | |
| * | | * | |
|
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
| * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, | | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
| * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | | | |
| * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | | | |
| * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | | | |
| * POSSIBILITY OF SUCH DAMAGE. | | | |
| */ | | */ | |
| | | | |
| /** | | /** | |
| * \file yajl_gen.h | | * \file yajl_gen.h | |
| * Interface to YAJL's JSON generation facilities. | | * Interface to YAJL's JSON generation facilities. | |
| */ | | */ | |
| | | | |
| #include <yajl/yajl_common.h> | | #include <yajl/yajl_common.h> | |
| | | | |
| #ifndef __YAJL_GEN_H__ | | #ifndef __YAJL_GEN_H__ | |
| #define __YAJL_GEN_H__ | | #define __YAJL_GEN_H__ | |
| | | | |
|
| | | #include <stddef.h> | |
| | | | |
| #ifdef __cplusplus | | #ifdef __cplusplus | |
| extern "C" { | | extern "C" { | |
| #endif | | #endif | |
| /** generator status codes */ | | /** generator status codes */ | |
| typedef enum { | | typedef enum { | |
| /** no error */ | | /** no error */ | |
| yajl_gen_status_ok = 0, | | yajl_gen_status_ok = 0, | |
| /** at a point where a map key is generated, a function other than | | /** at a point where a map key is generated, a function other than | |
| * yajl_gen_string was called */ | | * yajl_gen_string was called */ | |
| yajl_gen_keys_must_be_strings, | | yajl_gen_keys_must_be_strings, | |
| | | | |
| skipping to change at line 66 | | skipping to change at line 52 | |
| /** A generator function (yajl_gen_XXX) was called while in an erro
r | | /** A generator function (yajl_gen_XXX) was called while in an erro
r | |
| * state */ | | * state */ | |
| yajl_gen_in_error_state, | | yajl_gen_in_error_state, | |
| /** A complete JSON document has been generated */ | | /** A complete JSON document has been generated */ | |
| yajl_gen_generation_complete, | | yajl_gen_generation_complete, | |
| /** yajl_gen_double was passed an invalid floating point value | | /** yajl_gen_double was passed an invalid floating point value | |
| * (infinity or NaN). */ | | * (infinity or NaN). */ | |
| yajl_gen_invalid_number, | | yajl_gen_invalid_number, | |
| /** A print callback was passed in, so there is no internal | | /** A print callback was passed in, so there is no internal | |
| * buffer to get from */ | | * buffer to get from */ | |
|
| yajl_gen_no_buf | | yajl_gen_no_buf, | |
| | | /** returned from yajl_gen_string() when the yajl_gen_validate_utf8 | |
| | | * option is enabled and an invalid was passed by client code. | |
| | | */ | |
| | | yajl_gen_invalid_string | |
| } yajl_gen_status; | | } yajl_gen_status; | |
| | | | |
| /** an opaque handle to a generator */ | | /** an opaque handle to a generator */ | |
| typedef struct yajl_gen_t * yajl_gen; | | typedef struct yajl_gen_t * yajl_gen; | |
| | | | |
| /** a callback used for "printing" the results. */ | | /** a callback used for "printing" the results. */ | |
| typedef void (*yajl_print_t)(void * ctx, | | typedef void (*yajl_print_t)(void * ctx, | |
| const char * str, | | const char * str, | |
|
| unsigned int len); | | size_t len); | |
| | | | |
|
| /** configuration structure for the generator */ | | /** configuration parameters for the parser, these may be passed to | |
| typedef struct { | | * yajl_gen_config() along with option specific argument(s). In gener | |
| | | al, | |
| | | * all configuration parameters default to *off*. */ | |
| | | typedef enum { | |
| /** generate indented (beautiful) output */ | | /** generate indented (beautiful) output */ | |
|
| unsigned int beautify; | | yajl_gen_beautify = 0x01, | |
| /** an opportunity to define an indent string. such as \\t or | | /** | |
| * some number of spaces. default is four spaces ' '. This | | * Set an indent string which is used when yajl_gen_beautify | |
| * member is only relevant when beautify is true */ | | * is enabled. Maybe something like \\t or some number of | |
| const char * indentString; | | * spaces. The default is four spaces ' '. | |
| } yajl_gen_config; | | */ | |
| | | yajl_gen_indent_string = 0x02, | |
| | | /** | |
| | | * Set a function and context argument that should be used to | |
| | | * output generated json. the function should conform to the | |
| | | * yajl_print_t prototype while the context argument is a | |
| | | * void * of your choosing. | |
| | | * | |
| | | * example: | |
| | | * yajl_gen_config(g, yajl_gen_print_callback, myFunc, myVoidPtr) | |
| | | ; | |
| | | */ | |
| | | yajl_gen_print_callback = 0x04, | |
| | | /** | |
| | | * Normally the generator does not validate that strings you | |
| | | * pass to it via yajl_gen_string() are valid UTF8. Enabling | |
| | | * this option will cause it to do so. | |
| | | */ | |
| | | yajl_gen_validate_utf8 = 0x08, | |
| | | /** | |
| | | * the forward solidus (slash or '/' in human) is not required to b | |
| | | e | |
| | | * escaped in json text. By default, YAJL will not escape it in th | |
| | | e | |
| | | * iterest of saving bytes. Setting this flag will cause YAJL to | |
| | | * always escape '/' in generated JSON strings. | |
| | | */ | |
| | | yajl_gen_escape_solidus = 0x10 | |
| | | } yajl_gen_option; | |
| | | | |
|
| /** allocate a generator handle | | /** allow the modification of generator options subsequent to handle | |
| * \param config a pointer to a structure containing parameters which | | * allocation (via yajl_alloc) | |
| * configure the behavior of the json generator | | * \returns zero in case of errors, non-zero otherwise | |
| * \param allocFuncs an optional pointer to a structure which allows | | | |
| * the client to overide the memory allocation | | | |
| * used by yajl. May be NULL, in which case | | | |
| * malloc/free/realloc will be used. | | | |
| * | | | |
| * \returns an allocated handle on success, NULL on failure (bad param | | | |
| s) | | | |
| */ | | */ | |
|
| YAJL_API yajl_gen yajl_gen_alloc(const yajl_gen_config * config, | | YAJL_API int yajl_gen_config(yajl_gen g, yajl_gen_option opt, ...); | |
| const yajl_alloc_funcs * allocFuncs); | | | |
| | | | |
|
| /** allocate a generator handle that will print to the specified | | /** allocate a generator handle | |
| * callback rather than storing the results in an internal buffer. | | | |
| * \param callback a pointer to a printer function. May be NULL | | | |
| * in which case, the results will be store in an | | | |
| * internal buffer. | | | |
| * \param config a pointer to a structure containing parameters | | | |
| * which configure the behavior of the json | | | |
| * generator. | | | |
| * \param allocFuncs an optional pointer to a structure which allows | | * \param allocFuncs an optional pointer to a structure which allows | |
| * the client to overide the memory allocation | | * the client to overide the memory allocation | |
| * used by yajl. May be NULL, in which case | | * used by yajl. May be NULL, in which case | |
| * malloc/free/realloc will be used. | | * malloc/free/realloc will be used. | |
|
| * \param ctx a context pointer that will be passed to the | | | |
| * printer callback. | | | |
| * | | * | |
| * \returns an allocated handle on success, NULL on failure (bad param
s) | | * \returns an allocated handle on success, NULL on failure (bad param
s) | |
| */ | | */ | |
|
| YAJL_API yajl_gen yajl_gen_alloc2(const yajl_print_t callback, | | YAJL_API yajl_gen yajl_gen_alloc(const yajl_alloc_funcs * allocFuncs); | |
| const yajl_gen_config * config, | | | |
| const yajl_alloc_funcs * allocFuncs, | | | |
| void * ctx); | | | |
| | | | |
| /** free a generator handle */ | | /** free a generator handle */ | |
| YAJL_API void yajl_gen_free(yajl_gen handle); | | YAJL_API void yajl_gen_free(yajl_gen handle); | |
| | | | |
|
| YAJL_API yajl_gen_status yajl_gen_integer(yajl_gen hand, long int numbe
r); | | YAJL_API yajl_gen_status yajl_gen_integer(yajl_gen hand, long long int
number); | |
| /** generate a floating point number. number may not be infinity or | | /** generate a floating point number. number may not be infinity or | |
| * NaN, as these have no representation in JSON. In these cases the | | * NaN, as these have no representation in JSON. In these cases the | |
| * generator will return 'yajl_gen_invalid_number' */ | | * generator will return 'yajl_gen_invalid_number' */ | |
| YAJL_API yajl_gen_status yajl_gen_double(yajl_gen hand, double number); | | YAJL_API yajl_gen_status yajl_gen_double(yajl_gen hand, double number); | |
| YAJL_API yajl_gen_status yajl_gen_number(yajl_gen hand, | | YAJL_API yajl_gen_status yajl_gen_number(yajl_gen hand, | |
| const char * num, | | const char * num, | |
|
| unsigned int len); | | size_t len); | |
| YAJL_API yajl_gen_status yajl_gen_string(yajl_gen hand, | | YAJL_API yajl_gen_status yajl_gen_string(yajl_gen hand, | |
| const unsigned char * str, | | const unsigned char * str, | |
|
| unsigned int len); | | size_t len); | |
| YAJL_API yajl_gen_status yajl_gen_null(yajl_gen hand); | | YAJL_API yajl_gen_status yajl_gen_null(yajl_gen hand); | |
| YAJL_API yajl_gen_status yajl_gen_bool(yajl_gen hand, int boolean); | | YAJL_API yajl_gen_status yajl_gen_bool(yajl_gen hand, int boolean); | |
| YAJL_API yajl_gen_status yajl_gen_map_open(yajl_gen hand); | | YAJL_API yajl_gen_status yajl_gen_map_open(yajl_gen hand); | |
| YAJL_API yajl_gen_status yajl_gen_map_close(yajl_gen hand); | | YAJL_API yajl_gen_status yajl_gen_map_close(yajl_gen hand); | |
| YAJL_API yajl_gen_status yajl_gen_array_open(yajl_gen hand); | | YAJL_API yajl_gen_status yajl_gen_array_open(yajl_gen hand); | |
| YAJL_API yajl_gen_status yajl_gen_array_close(yajl_gen hand); | | YAJL_API yajl_gen_status yajl_gen_array_close(yajl_gen hand); | |
| | | | |
| /** access the null terminated generator buffer. If incrementally | | /** access the null terminated generator buffer. If incrementally | |
| * outputing JSON, one should call yajl_gen_clear to clear the | | * outputing JSON, one should call yajl_gen_clear to clear the | |
| * buffer. This allows stream generation. */ | | * buffer. This allows stream generation. */ | |
| YAJL_API yajl_gen_status yajl_gen_get_buf(yajl_gen hand, | | YAJL_API yajl_gen_status yajl_gen_get_buf(yajl_gen hand, | |
| const unsigned char ** buf, | | const unsigned char ** buf, | |
|
| unsigned int * len); | | size_t * len); | |
| | | | |
| /** clear yajl's output buffer, but maintain all internal generation | | /** clear yajl's output buffer, but maintain all internal generation | |
| * state. This function will not "reset" the generator state, and is | | * state. This function will not "reset" the generator state, and is | |
| * intended to enable incremental JSON outputing. */ | | * intended to enable incremental JSON outputing. */ | |
| YAJL_API void yajl_gen_clear(yajl_gen hand); | | YAJL_API void yajl_gen_clear(yajl_gen hand); | |
| | | | |
| #ifdef __cplusplus | | #ifdef __cplusplus | |
| } | | } | |
| #endif | | #endif | |
| | | | |
| | | | |
End of changes. 17 change blocks. |
| 67 lines changed or deleted | | 68 lines changed or added | |
|
| yajl_parse.h | | yajl_parse.h | |
| /* | | /* | |
|
| * Copyright 2010, Lloyd Hilaiel. | | * Copyright (c) 2007-2011, Lloyd Hilaiel <lloyd@hilaiel.com> | |
| * | | | |
| * Redistribution and use in source and binary forms, with or without | | | |
| * modification, are permitted provided that the following conditions are | | | |
| * met: | | | |
| * | | | |
| * 1. Redistributions of source code must retain the above copyright | | | |
| * notice, this list of conditions and the following disclaimer. | | | |
| * | | | |
| * 2. Redistributions in binary form must reproduce the above copyright | | | |
| * notice, this list of conditions and the following disclaimer in | | | |
| * the documentation and/or other materials provided with the | | | |
| * distribution. | | | |
| * | | * | |
|
| * 3. Neither the name of Lloyd Hilaiel nor the names of its | | * Permission to use, copy, modify, and/or distribute this software for any | |
| * contributors may be used to endorse or promote products derived | | * purpose with or without fee is hereby granted, provided that the above | |
| * from this software without specific prior written permission. | | * copyright notice and this permission notice appear in all copies. | |
| * | | * | |
|
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
| * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, | | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
| * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | | | |
| * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | | | |
| * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | | | |
| * POSSIBILITY OF SUCH DAMAGE. | | | |
| */ | | */ | |
| | | | |
| /** | | /** | |
| * \file yajl_parse.h | | * \file yajl_parse.h | |
|
| * Interface to YAJL's JSON parsing facilities. | | * Interface to YAJL's JSON stream parsing facilities. | |
| */ | | */ | |
| | | | |
| #include <yajl/yajl_common.h> | | #include <yajl/yajl_common.h> | |
| | | | |
| #ifndef __YAJL_PARSE_H__ | | #ifndef __YAJL_PARSE_H__ | |
| #define __YAJL_PARSE_H__ | | #define __YAJL_PARSE_H__ | |
| | | | |
|
| | | #include <stddef.h> | |
| | | | |
| #ifdef __cplusplus | | #ifdef __cplusplus | |
| extern "C" { | | extern "C" { | |
| #endif | | #endif | |
| /** error codes returned from this interface */ | | /** error codes returned from this interface */ | |
| typedef enum { | | typedef enum { | |
| /** no error was encountered */ | | /** no error was encountered */ | |
| yajl_status_ok, | | yajl_status_ok, | |
| /** a client callback returned zero, stopping the parse */ | | /** a client callback returned zero, stopping the parse */ | |
| yajl_status_client_canceled, | | yajl_status_client_canceled, | |
|
| /** The parse cannot yet complete because more json input text | | | |
| * is required, call yajl_parse with the next buffer of input text | | | |
| . | | | |
| * (pertinent only when stream parsing) */ | | | |
| yajl_status_insufficient_data, | | | |
| /** An error occured during the parse. Call yajl_get_error for | | /** An error occured during the parse. Call yajl_get_error for | |
| * more information about the encountered error */ | | * more information about the encountered error */ | |
| yajl_status_error | | yajl_status_error | |
| } yajl_status; | | } yajl_status; | |
| | | | |
| /** attain a human readable, english, string for an error */ | | /** attain a human readable, english, string for an error */ | |
| YAJL_API const char * yajl_status_to_string(yajl_status code); | | YAJL_API const char * yajl_status_to_string(yajl_status code); | |
| | | | |
| /** an opaque handle to a parser */ | | /** an opaque handle to a parser */ | |
| typedef struct yajl_handle_t * yajl_handle; | | typedef struct yajl_handle_t * yajl_handle; | |
| | | | |
| skipping to change at line 78 | | skipping to change at line 60 | |
| * parsed, you are called back to do something with the data. The | | * parsed, you are called back to do something with the data. The | |
| * functions in this table indicate the various events for which | | * functions in this table indicate the various events for which | |
| * you will be called back. Each callback accepts a "context" | | * you will be called back. Each callback accepts a "context" | |
| * pointer, this is a void * that is passed into the yajl_parse | | * pointer, this is a void * that is passed into the yajl_parse | |
| * function which the client code may use to pass around context. | | * function which the client code may use to pass around context. | |
| * | | * | |
| * All callbacks return an integer. If non-zero, the parse will | | * All callbacks return an integer. If non-zero, the parse will | |
| * continue. If zero, the parse will be canceled and | | * continue. If zero, the parse will be canceled and | |
| * yajl_status_client_canceled will be returned from the parse. | | * yajl_status_client_canceled will be returned from the parse. | |
| * | | * | |
|
| * Note about handling of numbers: | | * \attention { | |
| * yajl will only convert numbers that can be represented in a doubl | | * A note about the handling of numbers: | |
| e | | * | |
| * or a long int. All other numbers will be passed to the client | | * yajl will only convert numbers that can be represented in a | |
| * in string form using the yajl_number callback. Furthermore, if | | * double or a 64 bit (long long) int. All other numbers will | |
| * yajl_number is not NULL, it will always be used to return numbers | | * be passed to the client in string form using the yajl_number | |
| , | | * callback. Furthermore, if yajl_number is not NULL, it will | |
| * that is yajl_integer and yajl_double will be ignored. If | | * always be used to return numbers, that is yajl_integer and | |
| * yajl_number is NULL but one of yajl_integer or yajl_double are | | * yajl_double will be ignored. If yajl_number is NULL but one | |
| * defined, parsing of a number larger than is representable | | * of yajl_integer or yajl_double are defined, parsing of a | |
| * in a double or long int will result in a parse error. | | * number larger than is representable in a double or 64 bit | |
| | | * integer will result in a parse error. | |
| | | * } | |
| */ | | */ | |
| typedef struct { | | typedef struct { | |
| int (* yajl_null)(void * ctx); | | int (* yajl_null)(void * ctx); | |
| int (* yajl_boolean)(void * ctx, int boolVal); | | int (* yajl_boolean)(void * ctx, int boolVal); | |
|
| int (* yajl_integer)(void * ctx, long integerVal); | | int (* yajl_integer)(void * ctx, long long integerVal); | |
| int (* yajl_double)(void * ctx, double doubleVal); | | int (* yajl_double)(void * ctx, double doubleVal); | |
| /** A callback which passes the string representation of the number | | /** A callback which passes the string representation of the number | |
| * back to the client. Will be used for all numbers when present
*/ | | * back to the client. Will be used for all numbers when present
*/ | |
| int (* yajl_number)(void * ctx, const char * numberVal, | | int (* yajl_number)(void * ctx, const char * numberVal, | |
|
| unsigned int numberLen); | | size_t numberLen); | |
| | | | |
| /** strings are returned as pointers into the JSON text when, | | /** strings are returned as pointers into the JSON text when, | |
| * possible, as a result, they are _not_ null padded */ | | * possible, as a result, they are _not_ null padded */ | |
| int (* yajl_string)(void * ctx, const unsigned char * stringVal, | | int (* yajl_string)(void * ctx, const unsigned char * stringVal, | |
|
| unsigned int stringLen); | | size_t stringLen); | |
| | | | |
| int (* yajl_start_map)(void * ctx); | | int (* yajl_start_map)(void * ctx); | |
| int (* yajl_map_key)(void * ctx, const unsigned char * key, | | int (* yajl_map_key)(void * ctx, const unsigned char * key, | |
|
| unsigned int stringLen); | | size_t stringLen); | |
| int (* yajl_end_map)(void * ctx); | | int (* yajl_end_map)(void * ctx); | |
| | | | |
| int (* yajl_start_array)(void * ctx); | | int (* yajl_start_array)(void * ctx); | |
| int (* yajl_end_array)(void * ctx); | | int (* yajl_end_array)(void * ctx); | |
| } yajl_callbacks; | | } yajl_callbacks; | |
| | | | |
|
| /** configuration structure for the generator */ | | | |
| typedef struct { | | | |
| /** if nonzero, javascript style comments will be allowed in | | | |
| * the json input, both slash star and slash slash */ | | | |
| unsigned int allowComments; | | | |
| /** if nonzero, invalid UTF8 strings will cause a parse | | | |
| * error */ | | | |
| unsigned int checkUTF8; | | | |
| } yajl_parser_config; | | | |
| | | | |
| /** allocate a parser handle | | /** allocate a parser handle | |
| * \param callbacks a yajl callbacks structure specifying the | | * \param callbacks a yajl callbacks structure specifying the | |
| * functions to call when different JSON entities | | * functions to call when different JSON entities | |
| * are encountered in the input text. May be NULL, | | * are encountered in the input text. May be NULL, | |
| * which is only useful for validation. | | * which is only useful for validation. | |
|
| * \param config configuration parameters for the parse. | | * \param afs memory allocation functions, may be NULL for to u | |
| | | se | |
| | | * C runtime library routines (malloc and friends) | |
| * \param ctx a context pointer that will be passed to callback
s. | | * \param ctx a context pointer that will be passed to callback
s. | |
| */ | | */ | |
| YAJL_API yajl_handle yajl_alloc(const yajl_callbacks * callbacks, | | YAJL_API yajl_handle yajl_alloc(const yajl_callbacks * callbacks, | |
|
| const yajl_parser_config * config, | | yajl_alloc_funcs * afs, | |
| const yajl_alloc_funcs * allocFuncs, | | | |
| void * ctx); | | void * ctx); | |
| | | | |
|
| | | /** configuration parameters for the parser, these may be passed to | |
| | | * yajl_config() along with option specific argument(s). In general, | |
| | | * all configuration parameters default to *off*. */ | |
| | | typedef enum { | |
| | | /** Ignore javascript style comments present in | |
| | | * JSON input. Non-standard, but rather fun | |
| | | * arguments: toggled off with integer zero, on otherwise. | |
| | | * | |
| | | * example: | |
| | | * yajl_config(h, yajl_allow_comments, 1); // turn comment suppo | |
| | | rt on | |
| | | */ | |
| | | yajl_allow_comments = 0x01, | |
| | | /** | |
| | | * When set the parser will verify that all strings in JSON input a | |
| | | re | |
| | | * valid UTF8 and will emit a parse error if this is not so. When | |
| | | set, | |
| | | * this option makes parsing slightly more expensive (~7% depending | |
| | | * on processor and compiler in use) | |
| | | * | |
| | | * example: | |
| | | * yajl_config(h, yajl_dont_validate_strings, 1); // disable utf8 | |
| | | checking | |
| | | */ | |
| | | yajl_dont_validate_strings = 0x02, | |
| | | /** | |
| | | * By default, upon calls to yajl_complete_parse(), yajl will | |
| | | * ensure the entire input text was consumed and will raise an erro | |
| | | r | |
| | | * otherwise. Enabling this flag will cause yajl to disable this | |
| | | * check. This can be useful when parsing json out of a that conta | |
| | | ins more | |
| | | * than a single JSON document. | |
| | | */ | |
| | | yajl_allow_trailing_garbage = 0x04, | |
| | | /** | |
| | | * Allow multiple values to be parsed by a single handle. The | |
| | | * entire text must be valid JSON, and values can be seperated | |
| | | * by any kind of whitespace. This flag will change the | |
| | | * behavior of the parser, and cause it continue parsing after | |
| | | * a value is parsed, rather than transitioning into a | |
| | | * complete state. This option can be useful when parsing multiple | |
| | | * values from an input stream. | |
| | | */ | |
| | | yajl_allow_multiple_values = 0x08, | |
| | | /** | |
| | | * When yajl_complete_parse() is called the parser will | |
| | | * check that the top level value was completely consumed. I.E., | |
| | | * if called whilst in the middle of parsing a value | |
| | | * yajl will enter an error state (premature EOF). Setting this | |
| | | * flag suppresses that check and the corresponding error. | |
| | | */ | |
| | | yajl_allow_partial_values = 0x10 | |
| | | } yajl_option; | |
| | | | |
| | | /** allow the modification of parser options subsequent to handle | |
| | | * allocation (via yajl_alloc) | |
| | | * \returns zero in case of errors, non-zero otherwise | |
| | | */ | |
| | | YAJL_API int yajl_config(yajl_handle h, yajl_option opt, ...); | |
| | | | |
| /** free a parser handle */ | | /** free a parser handle */ | |
| YAJL_API void yajl_free(yajl_handle handle); | | YAJL_API void yajl_free(yajl_handle handle); | |
| | | | |
| /** Parse some json! | | /** Parse some json! | |
| * \param hand - a handle to the json parser allocated with yajl_alloc | | * \param hand - a handle to the json parser allocated with yajl_alloc | |
| * \param jsonText - a pointer to the UTF8 json text to be parsed | | * \param jsonText - a pointer to the UTF8 json text to be parsed | |
| * \param jsonTextLength - the length, in bytes, of input text | | * \param jsonTextLength - the length, in bytes, of input text | |
| */ | | */ | |
| YAJL_API yajl_status yajl_parse(yajl_handle hand, | | YAJL_API yajl_status yajl_parse(yajl_handle hand, | |
| const unsigned char * jsonText, | | const unsigned char * jsonText, | |
|
| unsigned int jsonTextLength); | | size_t jsonTextLength); | |
| | | | |
| /** Parse any remaining buffered json. | | /** Parse any remaining buffered json. | |
| * Since yajl is a stream-based parser, without an explicit end of | | * 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 | | * 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, | | * 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 | | * yajl can't know whether another digit is next or some character | |
| * that would terminate the integer token. | | * that would terminate the integer token. | |
| * | | * | |
| * \param hand - a handle to the json parser allocated with yajl_alloc | | * \param hand - a handle to the json parser allocated with yajl_alloc | |
| */ | | */ | |
|
| YAJL_API yajl_status yajl_parse_complete(yajl_handle hand); | | YAJL_API yajl_status yajl_complete_parse(yajl_handle hand); | |
| | | | |
| /** get an error string describing the state of the | | /** get an error string describing the state of the | |
| * parse. | | * parse. | |
| * | | * | |
| * If verbose is non-zero, the message will include the JSON | | * If verbose is non-zero, the message will include the JSON | |
| * text where the error occured, along with an arrow pointing to | | * text where the error occured, along with an arrow pointing to | |
| * the specific char. | | * the specific char. | |
| * | | * | |
| * \returns A dynamically allocated string will be returned which shou
ld | | * \returns A dynamically allocated string will be returned which shou
ld | |
| * be freed with yajl_free_error | | * be freed with yajl_free_error | |
| */ | | */ | |
| YAJL_API unsigned char * yajl_get_error(yajl_handle hand, int verbose, | | YAJL_API unsigned char * yajl_get_error(yajl_handle hand, int verbose, | |
| const unsigned char * jsonText, | | const unsigned char * jsonText, | |
|
| unsigned int jsonTextLength); | | size_t jsonTextLength); | |
| | | | |
| /** | | /** | |
| * get the amount of data consumed from the last chunk passed to YAJL. | | * 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 | | * In the case of a successful parse this can help you understand if | |
| * the entire buffer was consumed (which will allow you to handle | | * the entire buffer was consumed (which will allow you to handle | |
|
| * "junk at end of input". | | * "junk at end of input"). | |
| * | | * | |
| * In the event an error is encountered during parsing, this function | | * In the event an error is encountered during parsing, this function | |
| * affords the client a way to get the offset into the most recent | | * 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 | | * chunk where the error occured. 0 will be returned if no error | |
| * was encountered. | | * was encountered. | |
| */ | | */ | |
|
| YAJL_API unsigned int yajl_get_bytes_consumed(yajl_handle hand); | | YAJL_API size_t yajl_get_bytes_consumed(yajl_handle hand); | |
| | | | |
| /** free an error returned from yajl_get_error */ | | /** free an error returned from yajl_get_error */ | |
| YAJL_API void yajl_free_error(yajl_handle hand, unsigned char * str); | | YAJL_API void yajl_free_error(yajl_handle hand, unsigned char * str); | |
| | | | |
| #ifdef __cplusplus | | #ifdef __cplusplus | |
| } | | } | |
| #endif | | #endif | |
| | | | |
| #endif | | #endif | |
| | | | |
End of changes. 20 change blocks. |
| 66 lines changed or deleted | | 102 lines changed or added | |
|