1 | /*
2 | * Copyright (c) 2007-2014, Lloyd Hilaiel <me@lloyd.io>
3 | *
4 | * Permission to use, copy, modify, and/or distribute this software for any
5 | * purpose with or without fee is hereby granted, provided that the above
6 | * copyright notice and this permission notice appear in all copies.
7 | *
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 | */
16 |
17 | /**
18 | * A JSON text lexical analyzer.
19 | *
20 | * Common and shared declarations for the lexer.
21 | **/
22 |
23 | #ifndef __YAJL_LEX_H__
24 | #define __YAJL_LEX_H__
25 |
26 | #include "yajl/yajl_common.h"
27 |
28 | typedef enum {
29 | yajl_tok_bool,
30 | yajl_tok_colon,
31 | yajl_tok_comma,
32 | yajl_tok_eof,
33 | yajl_tok_error,
34 | yajl_tok_left_brace,
35 | yajl_tok_left_bracket,
36 | yajl_tok_null,
37 | yajl_tok_right_brace,
38 | yajl_tok_right_bracket,
39 |
40 | /*+ we differentiate between integers and doubles to allow the
41 | * parser to interpret the number without re-scanning +*/
42 | yajl_tok_integer,
43 | yajl_tok_double,
44 |
45 | /*+ we differentiate between strings which require further processing,
46 | * and strings that do not +*/
47 | yajl_tok_string,
48 | yajl_tok_string_with_escapes,
49 |
50 | /*+ comment tokens are not currently returned to the parser, ever +*/
51 | yajl_tok_comment
52 | } yajl_tok;
53 |
54 | typedef struct yajl_lexer_t * yajl_lexer;
55 |
56 | yajl_lexer yajl_lex_alloc(yajl_alloc_funcs * alloc,
57 | /* bool */ int allowComments,
58 | /* bool */ int validateUTF8);
59 | void yajl_lex_free(yajl_lexer lexer);
60 | yajl_tok yajl_lex_lex(yajl_lexer lexer, const unsigned char * jsonText,
61 | size_t jsonTextLen, size_t * offset,
62 | const unsigned char ** outBuf, size_t * outLen);
63 | yajl_tok yajl_lex_peek(yajl_lexer lexer, const unsigned char * jsonText,
64 | size_t jsonTextLen, size_t offset);
65 |
66 |
67 | typedef enum {
68 | yajl_lex_e_ok = 0,
69 | yajl_lex_string_invalid_utf8,
70 | yajl_lex_string_invalid_escaped_char,
71 | yajl_lex_string_invalid_json_char,
72 | yajl_lex_string_invalid_hex_char,
73 | yajl_lex_invalid_char,
74 | yajl_lex_invalid_string,
75 | yajl_lex_missing_integer_after_decimal,
76 | yajl_lex_missing_integer_after_exponent,
77 | yajl_lex_missing_integer_after_minus,
78 | yajl_lex_unallowed_comment
79 | } yajl_lex_error;
80 |
81 | const char * yajl_lex_error_to_string(yajl_lex_error error);
82 | yajl_lex_error yajl_lex_get_error(yajl_lexer lexer);
83 | size_t yajl_lex_current_line(yajl_lexer lexer);
84 | size_t yajl_lex_current_char(yajl_lexer lexer);
85 |
86 | #endif