You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
6.5 KiB
226 lines
6.5 KiB
/* See JSON_parser.c for copyright information and licensing. */ |
|
|
|
#ifndef JSON_PARSER_H |
|
#define JSON_PARSER_H |
|
|
|
/* JSON_parser.h */ |
|
|
|
|
|
#include <stddef.h> |
|
|
|
/* Windows DLL stuff */ |
|
#ifdef JSON_PARSER_DLL |
|
# ifdef _MSC_VER |
|
# ifdef JSON_PARSER_DLL_EXPORTS |
|
# define JSON_PARSER_DLL_API __declspec(dllexport) |
|
# else |
|
# define JSON_PARSER_DLL_API __declspec(dllimport) |
|
# endif |
|
# else |
|
# define JSON_PARSER_DLL_API |
|
# endif |
|
#else |
|
# define JSON_PARSER_DLL_API |
|
#endif |
|
|
|
/* Determine the integer type use to parse non-floating point numbers */ |
|
#if __STDC_VERSION__ >= 199901L || HAVE_LONG_LONG == 1 |
|
typedef long long JSON_int_t; |
|
#define JSON_PARSER_INTEGER_SSCANF_TOKEN "%lld" |
|
#define JSON_PARSER_INTEGER_SPRINTF_TOKEN "%lld" |
|
#else |
|
typedef long JSON_int_t; |
|
#define JSON_PARSER_INTEGER_SSCANF_TOKEN "%ld" |
|
#define JSON_PARSER_INTEGER_SPRINTF_TOKEN "%ld" |
|
#endif |
|
|
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
typedef enum |
|
{ |
|
JSON_E_NONE = 0, |
|
JSON_E_INVALID_CHAR, |
|
JSON_E_INVALID_KEYWORD, |
|
JSON_E_INVALID_ESCAPE_SEQUENCE, |
|
JSON_E_INVALID_UNICODE_SEQUENCE, |
|
JSON_E_INVALID_NUMBER, |
|
JSON_E_NESTING_DEPTH_REACHED, |
|
JSON_E_UNBALANCED_COLLECTION, |
|
JSON_E_EXPECTED_KEY, |
|
JSON_E_EXPECTED_COLON, |
|
JSON_E_OUT_OF_MEMORY |
|
} JSON_error; |
|
|
|
typedef enum |
|
{ |
|
JSON_T_NONE = 0, |
|
JSON_T_ARRAY_BEGIN, |
|
JSON_T_ARRAY_END, |
|
JSON_T_OBJECT_BEGIN, |
|
JSON_T_OBJECT_END, |
|
JSON_T_INTEGER, |
|
JSON_T_FLOAT, |
|
JSON_T_NULL, |
|
JSON_T_TRUE, |
|
JSON_T_FALSE, |
|
JSON_T_STRING, |
|
JSON_T_KEY, |
|
JSON_T_MAX |
|
} JSON_type; |
|
|
|
typedef struct JSON_value_struct { |
|
union { |
|
JSON_int_t integer_value; |
|
|
|
double float_value; |
|
|
|
struct { |
|
const char* value; |
|
size_t length; |
|
} str; |
|
} vu; |
|
} JSON_value; |
|
|
|
typedef struct JSON_parser_struct* JSON_parser; |
|
|
|
/*! \brief JSON parser callback |
|
|
|
\param ctx The pointer passed to new_JSON_parser. |
|
\param type An element of JSON_type but not JSON_T_NONE. |
|
\param value A representation of the parsed value. This parameter is NULL for |
|
JSON_T_ARRAY_BEGIN, JSON_T_ARRAY_END, JSON_T_OBJECT_BEGIN, JSON_T_OBJECT_END, |
|
JSON_T_NULL, JSON_T_TRUE, and JSON_T_FALSE. String values are always returned |
|
as zero-terminated C strings. |
|
|
|
\return Non-zero if parsing should continue, else zero. |
|
*/ |
|
typedef int (*JSON_parser_callback)(void* ctx, int type, const JSON_value* value); |
|
|
|
|
|
/** |
|
A typedef for allocator functions semantically compatible with malloc(). |
|
*/ |
|
typedef void* (*JSON_malloc_t)(size_t n); |
|
/** |
|
A typedef for deallocator functions semantically compatible with free(). |
|
*/ |
|
typedef void (*JSON_free_t)(void* mem); |
|
|
|
/*! \brief The structure used to configure a JSON parser object |
|
*/ |
|
typedef struct { |
|
/** Pointer to a callback, called when the parser has something to tell |
|
the user. This parameter may be NULL. In this case the input is |
|
merely checked for validity. |
|
*/ |
|
JSON_parser_callback callback; |
|
/** |
|
Callback context - client-specified data to pass to the |
|
callback function. This parameter may be NULL. |
|
*/ |
|
void* callback_ctx; |
|
/** Specifies the levels of nested JSON to allow. Negative numbers yield unlimited nesting. |
|
If negative, the parser can parse arbitrary levels of JSON, otherwise |
|
the depth is the limit. |
|
*/ |
|
int depth; |
|
/** |
|
To allow C style comments in JSON, set to non-zero. |
|
*/ |
|
int allow_comments; |
|
/** |
|
To decode floating point numbers manually set this parameter to |
|
non-zero. |
|
*/ |
|
int handle_floats_manually; |
|
/** |
|
The memory allocation routine, which must be semantically |
|
compatible with malloc(3). If set to NULL, malloc(3) is used. |
|
|
|
If this is set to a non-NULL value then the 'free' member MUST be |
|
set to the proper deallocation counterpart for this function. |
|
Failure to do so results in undefined behaviour at deallocation |
|
time. |
|
*/ |
|
JSON_malloc_t malloc; |
|
/** |
|
The memory deallocation routine, which must be semantically |
|
compatible with free(3). If set to NULL, free(3) is used. |
|
|
|
If this is set to a non-NULL value then the 'alloc' member MUST be |
|
set to the proper allocation counterpart for this function. |
|
Failure to do so results in undefined behaviour at deallocation |
|
time. |
|
*/ |
|
JSON_free_t free; |
|
} JSON_config; |
|
|
|
/*! \brief Initializes the JSON parser configuration structure to default values. |
|
|
|
The default configuration is |
|
- 127 levels of nested JSON (depends on JSON_PARSER_STACK_SIZE, see json_parser.c) |
|
- no parsing, just checking for JSON syntax |
|
- no comments |
|
- Uses realloc() for memory de/allocation. |
|
|
|
\param config. Used to configure the parser. |
|
*/ |
|
JSON_PARSER_DLL_API void init_JSON_config(JSON_config * config); |
|
|
|
/*! \brief Create a JSON parser object |
|
|
|
\param config. Used to configure the parser. Set to NULL to use |
|
the default configuration. See init_JSON_config. Its contents are |
|
copied by this function, so it need not outlive the returned |
|
object. |
|
|
|
\return The parser object, which is owned by the caller and must eventually |
|
be freed by calling delete_JSON_parser(). |
|
*/ |
|
JSON_PARSER_DLL_API JSON_parser new_JSON_parser(JSON_config const* config); |
|
|
|
/*! \brief Destroy a previously created JSON parser object. */ |
|
JSON_PARSER_DLL_API void delete_JSON_parser(JSON_parser jc); |
|
|
|
/*! \brief Parse a character. |
|
|
|
\return Non-zero, if all characters passed to this function are part of are valid JSON. |
|
*/ |
|
JSON_PARSER_DLL_API int JSON_parser_char(JSON_parser jc, int next_char); |
|
|
|
/*! \brief Finalize parsing. |
|
|
|
Call this method once after all input characters have been consumed. |
|
|
|
\return Non-zero, if all parsed characters are valid JSON, zero otherwise. |
|
*/ |
|
JSON_PARSER_DLL_API int JSON_parser_done(JSON_parser jc); |
|
|
|
/*! \brief Determine if a given string is valid JSON white space |
|
|
|
\return Non-zero if the string is valid, zero otherwise. |
|
*/ |
|
JSON_PARSER_DLL_API int JSON_parser_is_legal_white_space_string(const char* s); |
|
|
|
/*! \brief Gets the last error that occurred during the use of JSON_parser. |
|
|
|
\return A value from the JSON_error enum. |
|
*/ |
|
JSON_PARSER_DLL_API int JSON_parser_get_last_error(JSON_parser jc); |
|
|
|
/*! \brief Re-sets the parser to prepare it for another parse run. |
|
|
|
\return True (non-zero) on success, 0 on error (e.g. !jc). |
|
*/ |
|
JSON_PARSER_DLL_API int JSON_parser_reset(JSON_parser jc); |
|
|
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
|
|
#endif /* JSON_PARSER_H */
|
|
|