summaryrefslogtreecommitdiff
path: root/src/libjson/neoas-json-lexer-and-parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjson/neoas-json-lexer-and-parser.h')
-rw-r--r--src/libjson/neoas-json-lexer-and-parser.h551
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 */