Github user zellerh commented on a diff in the pull request: https://github.com/apache/incubator-trafodion/pull/833#discussion_r87902377 --- Diff: core/sql/common/json.h --- @@ -0,0 +1,124 @@ +#ifndef JSON_H +#define JSON_H + +#include "stringinfo.h" + +#ifndef NULL +#define NULL ((void *) 0) +#endif + +#ifndef true +#define true ((bool) 1) +#endif + +#ifndef false +#define false ((bool) 0) +#endif + +#define HIGHBIT (0x80) +#define IS_HIGHBIT_SET(ch) ((unsigned char)(ch) & HIGHBIT) + +typedef enum +{ + JSON_TOKEN_INVALID, + JSON_TOKEN_STRING, + JSON_TOKEN_NUMBER, + JSON_TOKEN_OBJECT_START, + JSON_TOKEN_OBJECT_END, + JSON_TOKEN_ARRAY_START, + JSON_TOKEN_ARRAY_END, + JSON_TOKEN_COMMA, + JSON_TOKEN_COLON, + JSON_TOKEN_TRUE, + JSON_TOKEN_FALSE, + JSON_TOKEN_NULL, + JSON_TOKEN_END +} JsonTokenType; + +typedef enum /* contexts of JSON parser */ +{ + JSON_OK = 0, + JSON_INVALID_TOKEN, + JSON_INVALID_VALUE, /* expecting a value */ + JSON_INVALID_STRING, /* expecting a string (for a field name) */ + JSON_INVALID_ARRAY_START, /* saw '[', expecting value or ']' */ + JSON_INVALID_ARRAY_NEXT, /* saw array element, expecting ',' or ']' */ + JSON_INVALID_OBJECT_START, /* saw '{', expecting label or '}' */ + JSON_INVALID_OBJECT_LABEL, /* saw object label, expecting ':' */ + JSON_INVALID_OBJECT_NEXT, /* saw object value, expecting ',' or '}' */ + JSON_INVALID_OBJECT_COMMA, /* saw object ',', expecting next label */ + JSON_INVALID_END, /* saw the end of a document, expect nothing */ + JSON_END_PREMATURELY, /*the input ended prematurely*/ + JSON_UNEXPECTED_ERROR +} JsonReturnType; + +/* + * All the fields in this structure should be treated as read-only. + * + * If strval is not null, then it should contain the de-escaped value + * of the lexeme if it's a string. Otherwise most of these field names + * should be self-explanatory. + * + * line_number and line_start are principally for use by the parser's + * error reporting routines. + * token_terminator and prev_token_terminator point to the character + * AFTER the end of the token, i.e. where there would be a nul byte + * if we were using nul-terminated strings. + */ +typedef struct JsonLexContext +{ + char *input; + int input_length; + char *token_start; + char *token_terminator; + char *prev_token_terminator; + JsonTokenType token_type; + int lex_level; + int line_number; + char *line_start; + StringInfo strval; +} JsonLexContext; + +typedef JsonReturnType (*json_struct_action) (void *state); +typedef JsonReturnType (*json_ofield_action) (void *state, char *fname, bool isnull); +typedef JsonReturnType (*json_aelem_action) (void *state, bool isnull); +typedef JsonReturnType (*json_scalar_action) (void *state, char *token, JsonTokenType tokentype); + +/* + * Semantic Action structure for use in parsing json. + * Any of these actions can be NULL, in which case nothing is done at that + * point, Likewise, semstate can be NULL. Using an all-NULL structure amounts + * to doing a pure parse with no side-effects, and is therefore exactly + * what the json input routines do. + * + * The 'fname' and 'token' strings passed to these actions are palloc'd. --- End diff -- The comments talk about palloc, but we really use malloc in this code. See another comment about whether malloc is the right thing to use.
--- If your project is set up for it, you can reply to this email and have your reply appear on GitHub as well. If your project does not have this feature enabled and wishes so, or if the feature is enabled but not working, please contact infrastructure at infrastruct...@apache.org or file a JIRA ticket with INFRA. ---