Line data Source code
1 : /***** 2 : Header file for a json lexical scanner 3 : *****/ 4 : 5 : #include "../../util/fd_util.h" 6 : 7 : // Lexical token value 8 0 : #define JSON_TOKEN_LBRACKET 1 /* [ */ 9 0 : #define JSON_TOKEN_RBRACKET 2 /* ] */ 10 0 : #define JSON_TOKEN_LBRACE 3 /* { */ 11 0 : #define JSON_TOKEN_RBRACE 4 /* } */ 12 0 : #define JSON_TOKEN_COLON 5 /* : */ 13 0 : #define JSON_TOKEN_COMMA 6 /* , */ 14 0 : #define JSON_TOKEN_NULL 7 /* null */ 15 0 : #define JSON_TOKEN_BOOL 8 /* true or false */ 16 0 : #define JSON_TOKEN_INTEGER 9 17 0 : #define JSON_TOKEN_FLOAT 10 18 0 : #define JSON_TOKEN_STRING 11 19 : 20 0 : #define JSON_TOKEN_END 0 /* end of input */ 21 0 : #define JSON_TOKEN_ERROR -1 22 : 23 : // Lexical state 24 : struct json_lex_state { 25 : // Input json text 26 : const char* json; 27 : ulong json_sz; 28 : 29 : // Current position in text 30 : ulong pos; 31 : // Last token parsed 32 : long last_tok; 33 : 34 : // Value of last boolean 35 : int last_bool; 36 : // Value of last string, number (as text), or error message. UTF-8 encoded. 37 : char* last_str; 38 : ulong last_str_sz; 39 : ulong last_str_alloc; 40 : char last_str_firstbuf[512]; 41 : }; 42 : typedef struct json_lex_state json_lex_state_t; 43 : 44 : // Initialize a lexical state given some json text 45 : void json_lex_state_new(json_lex_state_t* state, 46 : const char* json, 47 : ulong json_sz); 48 : 49 : void json_lex_state_delete(json_lex_state_t* state); 50 : 51 : // Retrieve the next token 52 : long json_lex_next_token(json_lex_state_t* state); 53 : 54 : // Get the last lexical text result. This can be a string, number (as 55 : // text), or error message. 56 : const char* json_lex_get_text(json_lex_state_t* state, ulong* sz); 57 : 58 : // Convert the string to an integer (assuming decimal representation) 59 : long json_lex_as_int(json_lex_state_t* lex); 60 : 61 : // Convert the string to a float 62 : double json_lex_as_float(json_lex_state_t* lex); 63 : 64 : // Replaces the string with the result of a formatted printf. 65 : void json_lex_sprintf(json_lex_state_t* lex, const char* format, ...) 66 : __attribute__ ((format (printf, 2, 3)));