diff options
Diffstat (limited to 'src/libjson/neoas-json-lexer-and-parser.h')
-rw-r--r-- | src/libjson/neoas-json-lexer-and-parser.h | 551 |
1 files changed, 551 insertions, 0 deletions
diff --git a/src/libjson/neoas-json-lexer-and-parser.h b/src/libjson/neoas-json-lexer-and-parser.h new file mode 100644 index 0000000..81d204c --- /dev/null +++ b/src/libjson/neoas-json-lexer-and-parser.h @@ -0,0 +1,551 @@ +#ifndef NEOAS_JSON_LEXER_AND_PARSER_H_INCLUDED +# define NEOAS_JSON_LEXER_AND_PARSER_H_INCLUDED + +# include <stdbool.h> +# include <stddef.h> +# include <sys/types.h> + +struct memory_allocator; + +struct json_lexer_and_parser; + +static inline int json_lexer_and_parser_init (const struct memory_allocator + *allocator, + struct json_lexer_and_parser + *lexer_and_parser); + +static inline void json_lexer_and_parser_deinit (struct json_lexer_and_parser + *lexer_and_parser); + +static inline void json_lexer_and_parser_set (struct json_lexer_and_parser + *lexer_and_parser, + int (*handle_null) (void *), + int (*handle_bool) (void *, + bool), + int (*handle_number) (void *, + double), + int (*handle_string) (void *, + size_t, + const char + *), + int (*handle_object_start) (void + *, + void + **), + int (*object_next_key) (void *, + void *, + size_t, + const + char *), + int (*handle_object_stop) (void + *, + void + *), + int (*handle_array_start) (void + *, + void + **), + int (*array_next_key) (void *, + void *, + size_t), + int (*handle_array_stop) (void + *, + void + *), + int (*handle_syntax_error) (void + *), + int (*handle_grammar_error) + (void *), + int (*handle_rejected_input) + (void *, char c), + void *context); + +static inline int json_lexer_and_parser_push (struct json_lexer_and_parser + *lexer_and_parser, char c); + +static inline int json_lexer_and_parser_terminate (struct + json_lexer_and_parser + *lexer_and_parser); + +static inline int json_lexer_and_parser_lex (const struct memory_allocator + *allocator, + ssize_t (*pull) (void *, + size_t request, + void *data), + void *pull_context, + int (*handle_null) (void *), + int (*handle_bool) (void *, + bool), + int (*handle_number) (void *, + double), + int (*handle_string) (void *, + size_t, + const char + *), + int (*handle_object_start) (void + *, + void + **), + int (*object_next_key) (void *, + void *, + size_t, + const + char *), + int (*handle_object_stop) (void + *, + void + *), + int (*handle_array_start) (void + *, + void + **), + int (*array_next_key) (void *, + void *, + size_t), + int (*handle_array_stop) (void *, + void + *), + int (*handle_syntax_error) (void + *), + int (*handle_grammar_error) (void + *), + int (*handle_rejected_input) + (void *, char c), void *context); + +static inline int json_lexer_and_parser_string (const struct memory_allocator + *allocator, size_t n, + const char *str, + int (*handle_null) (void *), + int (*handle_bool) (void *, + bool), + int (*handle_number) (void *, + double), + int (*handle_string) (void *, + size_t, + const + char *), + int (*handle_object_start) + (void *, void **), + int (*object_next_key) (void + *, + void + *, + size_t, + const + char + *), + int (*handle_object_stop) + (void *, void *), + int (*handle_array_start) + (void *, void **), + int (*array_next_key) (void *, + void *, + size_t), + int (*handle_array_stop) (void + *, + void + *), + int (*handle_syntax_error) + (void *), + int (*handle_grammar_error) + (void *), + int (*handle_rejected_input) + (void *, char c), + void *context); + +# include "neoas-json-lexer.h" +# include "neoas-json-parser.h" + +struct json_lexer_and_parser +{ + struct json_lexer lexer; + struct json_parser parser; + int (*handle_null) (void *); + int (*handle_bool) (void *, bool); + int (*handle_number) (void *, double); + int (*handle_string) (void *, size_t, const char *); + int (*handle_object_start) (void *, void **); + int (*object_next_key) (void *, void *, size_t, const char *); + int (*handle_object_stop) (void *, void *); + int (*handle_array_start) (void *, void **); + int (*array_next_key) (void *, void *, size_t); + int (*handle_array_stop) (void *, void *); + int (*handle_syntax_error) (void *); + int (*handle_grammar_error) (void *); + int (*handle_rejected_input) (void *, char c); + void *context; +}; + +static inline int +json_lexer_and_parser_init (const struct memory_allocator *allocator, + struct json_lexer_and_parser *lexer_and_parser) +{ + int l = json_lexer_init (allocator, &(lexer_and_parser->lexer)); + int p = json_parser_init (allocator, &(lexer_and_parser->parser)); + if (l || p) + { + json_lexer_deinit (&(lexer_and_parser->lexer)); + json_parser_deinit (&(lexer_and_parser->parser)); + return -1; + } + return 0; +} + +static inline void +json_lexer_and_parser_deinit (struct json_lexer_and_parser *lexer_and_parser) +{ + json_lexer_deinit (&(lexer_and_parser->lexer)); + json_parser_deinit (&(lexer_and_parser->parser)); +} + +static inline int +json_lexer_and_parser_lexer_handle_null (void *context) +{ + struct json_lexer_and_parser *lp = context; + return json_parser_push_null (&(lp->parser)); +} + +static inline int +json_lexer_and_parser_lexer_handle_bool (void *context, bool value) +{ + struct json_lexer_and_parser *lp = context; + return json_parser_push_bool (&(lp->parser), value); +} + +static inline int +json_lexer_and_parser_lexer_handle_number (void *context, double value) +{ + struct json_lexer_and_parser *lp = context; + return json_parser_push_number (&(lp->parser), value); +} + +static inline int +json_lexer_and_parser_lexer_handle_string (void *context, size_t len, + const char *str) +{ + struct json_lexer_and_parser *lp = context; + return json_parser_push_string (&(lp->parser), len, str); +} + +static inline int +json_lexer_and_parser_lexer_handle_object_start (void *context) +{ + struct json_lexer_and_parser *lp = context; + return json_parser_push_object_start (&(lp->parser)); +} + +static inline int +json_lexer_and_parser_lexer_handle_object_assoc (void *context) +{ + struct json_lexer_and_parser *lp = context; + return json_parser_push_object_assoc (&(lp->parser)); +} + +static inline int +json_lexer_and_parser_lexer_handle_object_stop (void *context) +{ + struct json_lexer_and_parser *lp = context; + return json_parser_push_object_stop (&(lp->parser)); +} + +static inline int +json_lexer_and_parser_lexer_handle_array_start (void *context) +{ + struct json_lexer_and_parser *lp = context; + return json_parser_push_array_start (&(lp->parser)); +} + +static inline int +json_lexer_and_parser_lexer_handle_array_stop (void *context) +{ + struct json_lexer_and_parser *lp = context; + return json_parser_push_array_stop (&(lp->parser)); +} + +static inline int +json_lexer_and_parser_lexer_handle_next (void *context) +{ + struct json_lexer_and_parser *lp = context; + return json_parser_push_next (&(lp->parser)); +} + +static inline int +json_lexer_and_parser_lexer_handle_syntax_error (void *context) +{ + struct json_lexer_and_parser *lp = context; + return lp->handle_syntax_error (lp->context); +} + +static inline int +json_lexer_and_parser_lexer_handle_rejected_input (void *context, char c) +{ + struct json_lexer_and_parser *lp = context; + return lp->handle_rejected_input (lp->context, c); +} + +static inline int +json_lexer_and_parser_parser_handle_null (void *context) +{ + struct json_lexer_and_parser *lp = context; + return lp->handle_null (lp->context); +} + +static inline int +json_lexer_and_parser_parser_handle_bool (void *context, bool value) +{ + struct json_lexer_and_parser *lp = context; + return lp->handle_bool (lp->context, value); +} + +static inline int +json_lexer_and_parser_parser_handle_number (void *context, double value) +{ + struct json_lexer_and_parser *lp = context; + return lp->handle_number (lp->context, value); +} + +static inline int +json_lexer_and_parser_parser_handle_string (void *context, size_t len, + const char *str) +{ + struct json_lexer_and_parser *lp = context; + return lp->handle_string (lp->context, len, str); +} + +static inline int +json_lexer_and_parser_parser_handle_object_start (void *context, + void **user_data) +{ + struct json_lexer_and_parser *lp = context; + return lp->handle_object_start (lp->context, user_data); +} + +static inline int +json_lexer_and_parser_parser_handle_object_next_key (void *context, + void *user_data, + size_t len, + const char *key) +{ + struct json_lexer_and_parser *lp = context; + return lp->object_next_key (lp->context, user_data, len, key); +} + +static inline int +json_lexer_and_parser_parser_handle_object_stop (void *context, + void *user_data) +{ + struct json_lexer_and_parser *lp = context; + return lp->handle_object_stop (lp->context, user_data); +} + +static inline int +json_lexer_and_parser_parser_handle_array_start (void *context, + void **user_data) +{ + struct json_lexer_and_parser *lp = context; + return lp->handle_array_start (lp->context, user_data); +} + +static inline int +json_lexer_and_parser_parser_handle_array_next_key (void *context, + void *user_data, + size_t index) +{ + struct json_lexer_and_parser *lp = context; + return lp->array_next_key (lp->context, user_data, index); +} + +static inline int +json_lexer_and_parser_parser_handle_array_stop (void *context, + void *user_data) +{ + struct json_lexer_and_parser *lp = context; + return lp->handle_array_stop (lp->context, user_data); +} + +static inline int +json_lexer_and_parser_parser_handle_grammar_error (void *context) +{ + struct json_lexer_and_parser *lp = context; + return lp->handle_grammar_error (lp->context); +} + +static inline void +json_lexer_and_parser_set (struct json_lexer_and_parser *lexer_and_parser, + int (*handle_null) (void *), + int (*handle_bool) (void *, bool), + int (*handle_number) (void *, double), + int (*handle_string) (void *, size_t, + const char *), + int (*handle_object_start) (void *, void **), + int (*object_next_key) (void *, void *, size_t, + const char *), + int (*handle_object_stop) (void *, void *), + int (*handle_array_start) (void *, void **), + int (*array_next_key) (void *, void *, size_t), + int (*handle_array_stop) (void *, void *), + int (*handle_syntax_error) (void *), + int (*handle_grammar_error) (void *), + int (*handle_rejected_input) (void *, char c), + void *context) +{ + lexer_and_parser->handle_null = handle_null; + lexer_and_parser->handle_bool = handle_bool; + lexer_and_parser->handle_number = handle_number; + lexer_and_parser->handle_string = handle_string; + lexer_and_parser->handle_object_start = handle_object_start; + lexer_and_parser->object_next_key = object_next_key; + lexer_and_parser->handle_object_stop = handle_object_stop; + lexer_and_parser->handle_array_start = handle_array_start; + lexer_and_parser->array_next_key = array_next_key; + lexer_and_parser->handle_array_stop = handle_array_stop; + lexer_and_parser->handle_syntax_error = handle_syntax_error; + lexer_and_parser->handle_grammar_error = handle_grammar_error; + lexer_and_parser->handle_rejected_input = handle_rejected_input; + lexer_and_parser->context = context; + json_lexer_set (&(lexer_and_parser->lexer), + json_lexer_and_parser_lexer_handle_null, + json_lexer_and_parser_lexer_handle_bool, + json_lexer_and_parser_lexer_handle_number, + json_lexer_and_parser_lexer_handle_string, + json_lexer_and_parser_lexer_handle_object_start, + json_lexer_and_parser_lexer_handle_object_assoc, + json_lexer_and_parser_lexer_handle_object_stop, + json_lexer_and_parser_lexer_handle_array_start, + json_lexer_and_parser_lexer_handle_array_stop, + json_lexer_and_parser_lexer_handle_next, + json_lexer_and_parser_lexer_handle_syntax_error, + json_lexer_and_parser_lexer_handle_rejected_input, + lexer_and_parser); + json_parser_set (&(lexer_and_parser->parser), + json_lexer_and_parser_parser_handle_null, + json_lexer_and_parser_parser_handle_bool, + json_lexer_and_parser_parser_handle_number, + json_lexer_and_parser_parser_handle_string, + json_lexer_and_parser_parser_handle_object_start, + json_lexer_and_parser_parser_handle_object_next_key, + json_lexer_and_parser_parser_handle_object_stop, + json_lexer_and_parser_parser_handle_array_start, + json_lexer_and_parser_parser_handle_array_next_key, + json_lexer_and_parser_parser_handle_array_stop, + json_lexer_and_parser_parser_handle_grammar_error, + lexer_and_parser); +} + +static inline int +json_lexer_and_parser_push (struct json_lexer_and_parser *lexer_and_parser, + char c) +{ + return json_lexer_push (&(lexer_and_parser->lexer), c); +} + +static inline int +json_lexer_and_parser_terminate (struct json_lexer_and_parser + *lexer_and_parser) +{ + return json_lexer_terminate (&(lexer_and_parser->lexer)); +} + +static inline int +json_lexer_and_parser_lex (const struct memory_allocator *allocator, + ssize_t (*pull) (void *, size_t request, + void *data), void *pull_context, + int (*handle_null) (void *), + int (*handle_bool) (void *, bool), + int (*handle_number) (void *, double), + int (*handle_string) (void *, size_t, + const char *), + int (*handle_object_start) (void *, void **), + int (*object_next_key) (void *, void *, size_t, + const char *), + int (*handle_object_stop) (void *, void *), + int (*handle_array_start) (void *, void **), + int (*array_next_key) (void *, void *, size_t), + int (*handle_array_stop) (void *, void *), + int (*handle_syntax_error) (void *), + int (*handle_grammar_error) (void *), + int (*handle_rejected_input) (void *, char c), + void *context) +{ + struct json_lexer_and_parser lp; + if (json_lexer_and_parser_init (allocator, &lp) < 0) + { + return -1; + } + json_lexer_and_parser_set (&lp, handle_null, handle_bool, handle_number, + handle_string, handle_object_start, + object_next_key, handle_object_stop, + handle_array_start, array_next_key, + handle_array_stop, handle_syntax_error, + handle_grammar_error, handle_rejected_input, + context); + int error = json_lexer_lex (allocator, pull, pull_context, + json_lexer_and_parser_lexer_handle_null, + json_lexer_and_parser_lexer_handle_bool, + json_lexer_and_parser_lexer_handle_number, + json_lexer_and_parser_lexer_handle_string, + json_lexer_and_parser_lexer_handle_object_start, + json_lexer_and_parser_lexer_handle_object_assoc, + json_lexer_and_parser_lexer_handle_object_stop, + json_lexer_and_parser_lexer_handle_array_start, + json_lexer_and_parser_lexer_handle_array_stop, + json_lexer_and_parser_lexer_handle_next, + json_lexer_and_parser_lexer_handle_syntax_error, + json_lexer_and_parser_lexer_handle_rejected_input, + &lp); + json_lexer_and_parser_deinit (&lp); + return error; +} + +static inline int +json_lexer_and_parser_string (const struct memory_allocator *allocator, + size_t n, + const char *str, + int (*handle_null) (void *), + int (*handle_bool) (void *, bool), + int (*handle_number) (void *, double), + int (*handle_string) (void *, size_t, + const char *), + int (*handle_object_start) (void *, void **), + int (*object_next_key) (void *, void *, size_t, + const char *), + int (*handle_object_stop) (void *, void *), + int (*handle_array_start) (void *, void **), + int (*array_next_key) (void *, void *, size_t), + int (*handle_array_stop) (void *, void *), + int (*handle_syntax_error) (void *), + int (*handle_grammar_error) (void *), + int (*handle_rejected_input) (void *, char c), + void *context) +{ + struct json_lexer_and_parser lp; + if (json_lexer_and_parser_init (allocator, &lp) < 0) + { + return -1; + } + json_lexer_and_parser_set (&lp, handle_null, handle_bool, handle_number, + handle_string, handle_object_start, + object_next_key, handle_object_stop, + handle_array_start, array_next_key, + handle_array_stop, handle_syntax_error, + handle_grammar_error, handle_rejected_input, + context); + int error = json_lexer_string (allocator, n, str, + json_lexer_and_parser_lexer_handle_null, + json_lexer_and_parser_lexer_handle_bool, + json_lexer_and_parser_lexer_handle_number, + json_lexer_and_parser_lexer_handle_string, + json_lexer_and_parser_lexer_handle_object_start, + json_lexer_and_parser_lexer_handle_object_assoc, + json_lexer_and_parser_lexer_handle_object_stop, + json_lexer_and_parser_lexer_handle_array_start, + json_lexer_and_parser_lexer_handle_array_stop, + json_lexer_and_parser_lexer_handle_next, + json_lexer_and_parser_lexer_handle_syntax_error, + json_lexer_and_parser_lexer_handle_rejected_input, + &lp); + json_lexer_and_parser_deinit (&lp); + return error; +} + +#endif /* NEOAS_JSON_LEXER_AND_PARSER_H_INCLUDED */ |