ffi-yajl 0.0.4-universal-java → 0.1.0-universal-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +114 -30
  3. data/ext/ffi_yajl/ext/encoder/extconf.rb +5 -5
  4. data/ext/ffi_yajl/ext/parser/extconf.rb +5 -5
  5. data/lib/ffi_yajl/ffi.rb +2 -1
  6. data/lib/ffi_yajl/version.rb +1 -1
  7. data/spec/ffi_yajl/encoder_spec.rb +6 -6
  8. data/spec/ffi_yajl/json_gem_spec.rb +13 -13
  9. data/spec/ffi_yajl/parser_spec.rb +9 -9
  10. metadata +17 -175
  11. data/ext/libyajl2/extconf.rb +0 -60
  12. data/ext/libyajl2/vendored/.gitignore +0 -3
  13. data/ext/libyajl2/vendored/BUILDING +0 -23
  14. data/ext/libyajl2/vendored/BUILDING.win32 +0 -27
  15. data/ext/libyajl2/vendored/CMakeLists.txt +0 -79
  16. data/ext/libyajl2/vendored/COPYING +0 -13
  17. data/ext/libyajl2/vendored/ChangeLog +0 -175
  18. data/ext/libyajl2/vendored/README +0 -74
  19. data/ext/libyajl2/vendored/TODO +0 -9
  20. data/ext/libyajl2/vendored/YAJLDoc.cmake +0 -26
  21. data/ext/libyajl2/vendored/configure +0 -79
  22. data/ext/libyajl2/vendored/example/CMakeLists.txt +0 -23
  23. data/ext/libyajl2/vendored/example/README.md +0 -7
  24. data/ext/libyajl2/vendored/example/parse_config.c +0 -69
  25. data/ext/libyajl2/vendored/example/sample.config +0 -101
  26. data/ext/libyajl2/vendored/perf/CMakeLists.txt +0 -23
  27. data/ext/libyajl2/vendored/perf/documents.c +0 -1418
  28. data/ext/libyajl2/vendored/perf/documents.h +0 -28
  29. data/ext/libyajl2/vendored/perf/perftest.c +0 -134
  30. data/ext/libyajl2/vendored/reformatter/CMakeLists.txt +0 -39
  31. data/ext/libyajl2/vendored/reformatter/json_reformat.c +0 -194
  32. data/ext/libyajl2/vendored/src/CMakeLists.txt +0 -86
  33. data/ext/libyajl2/vendored/src/YAJL.dxy +0 -1258
  34. data/ext/libyajl2/vendored/src/api/yajl_common.h +0 -75
  35. data/ext/libyajl2/vendored/src/api/yajl_gen.h +0 -157
  36. data/ext/libyajl2/vendored/src/api/yajl_parse.h +0 -226
  37. data/ext/libyajl2/vendored/src/api/yajl_tree.h +0 -185
  38. data/ext/libyajl2/vendored/src/api/yajl_version.h.cmake +0 -23
  39. data/ext/libyajl2/vendored/src/yajl +0 -33
  40. data/ext/libyajl2/vendored/src/yajl.c +0 -175
  41. data/ext/libyajl2/vendored/src/yajl.pc.cmake +0 -9
  42. data/ext/libyajl2/vendored/src/yajl_alloc.c +0 -52
  43. data/ext/libyajl2/vendored/src/yajl_alloc.h +0 -34
  44. data/ext/libyajl2/vendored/src/yajl_buf.c +0 -103
  45. data/ext/libyajl2/vendored/src/yajl_buf.h +0 -57
  46. data/ext/libyajl2/vendored/src/yajl_bytestack.h +0 -69
  47. data/ext/libyajl2/vendored/src/yajl_encode.c +0 -220
  48. data/ext/libyajl2/vendored/src/yajl_encode.h +0 -34
  49. data/ext/libyajl2/vendored/src/yajl_gen.c +0 -354
  50. data/ext/libyajl2/vendored/src/yajl_lex.c +0 -763
  51. data/ext/libyajl2/vendored/src/yajl_lex.h +0 -117
  52. data/ext/libyajl2/vendored/src/yajl_parser.c +0 -498
  53. data/ext/libyajl2/vendored/src/yajl_parser.h +0 -78
  54. data/ext/libyajl2/vendored/src/yajl_tree.c +0 -503
  55. data/ext/libyajl2/vendored/src/yajl_version.c +0 -7
  56. data/ext/libyajl2/vendored/test/CMakeLists.txt +0 -23
  57. data/ext/libyajl2/vendored/test/cases/ac_difficult_json_c_test_case_with_comments.json +0 -1
  58. data/ext/libyajl2/vendored/test/cases/ac_difficult_json_c_test_case_with_comments.json.gold +0 -36
  59. data/ext/libyajl2/vendored/test/cases/ac_simple_with_comments.json +0 -11
  60. data/ext/libyajl2/vendored/test/cases/ac_simple_with_comments.json.gold +0 -9
  61. data/ext/libyajl2/vendored/test/cases/ag_false_then_garbage.json +0 -1
  62. data/ext/libyajl2/vendored/test/cases/ag_false_then_garbage.json.gold +0 -2
  63. data/ext/libyajl2/vendored/test/cases/ag_null_then_garbage.json +0 -1
  64. data/ext/libyajl2/vendored/test/cases/ag_null_then_garbage.json.gold +0 -2
  65. data/ext/libyajl2/vendored/test/cases/ag_true_then_garbage.json +0 -1
  66. data/ext/libyajl2/vendored/test/cases/ag_true_then_garbage.json.gold +0 -2
  67. data/ext/libyajl2/vendored/test/cases/am_eof.json +0 -1
  68. data/ext/libyajl2/vendored/test/cases/am_eof.json.gold +0 -4
  69. data/ext/libyajl2/vendored/test/cases/am_integers.json +0 -1
  70. data/ext/libyajl2/vendored/test/cases/am_integers.json.gold +0 -3
  71. data/ext/libyajl2/vendored/test/cases/am_multiple.json +0 -3
  72. data/ext/libyajl2/vendored/test/cases/am_multiple.json.gold +0 -5
  73. data/ext/libyajl2/vendored/test/cases/am_stuff.json +0 -7
  74. data/ext/libyajl2/vendored/test/cases/am_stuff.json.gold +0 -14
  75. data/ext/libyajl2/vendored/test/cases/ap_array_open.json +0 -1
  76. data/ext/libyajl2/vendored/test/cases/ap_array_open.json.gold +0 -2
  77. data/ext/libyajl2/vendored/test/cases/ap_eof_str.json +0 -1
  78. data/ext/libyajl2/vendored/test/cases/ap_eof_str.json.gold +0 -1
  79. data/ext/libyajl2/vendored/test/cases/ap_map_open.json +0 -1
  80. data/ext/libyajl2/vendored/test/cases/ap_map_open.json.gold +0 -2
  81. data/ext/libyajl2/vendored/test/cases/ap_partial_ok.json +0 -1
  82. data/ext/libyajl2/vendored/test/cases/ap_partial_ok.json.gold +0 -4
  83. data/ext/libyajl2/vendored/test/cases/array.json +0 -6
  84. data/ext/libyajl2/vendored/test/cases/array.json.gold +0 -22
  85. data/ext/libyajl2/vendored/test/cases/array_close.json +0 -1
  86. data/ext/libyajl2/vendored/test/cases/array_close.json.gold +0 -2
  87. data/ext/libyajl2/vendored/test/cases/bignums.json +0 -1
  88. data/ext/libyajl2/vendored/test/cases/bignums.json.gold +0 -5
  89. data/ext/libyajl2/vendored/test/cases/bogus_char.json +0 -4
  90. data/ext/libyajl2/vendored/test/cases/bogus_char.json.gold +0 -10
  91. data/ext/libyajl2/vendored/test/cases/codepoints_from_unicode_org.json +0 -1
  92. data/ext/libyajl2/vendored/test/cases/codepoints_from_unicode_org.json.gold +0 -2
  93. data/ext/libyajl2/vendored/test/cases/deep_arrays.json +0 -1
  94. data/ext/libyajl2/vendored/test/cases/deep_arrays.json.gold +0 -2049
  95. data/ext/libyajl2/vendored/test/cases/difficult_json_c_test_case.json +0 -1
  96. data/ext/libyajl2/vendored/test/cases/difficult_json_c_test_case.json.gold +0 -36
  97. data/ext/libyajl2/vendored/test/cases/doubles.json +0 -1
  98. data/ext/libyajl2/vendored/test/cases/doubles.json.gold +0 -7
  99. data/ext/libyajl2/vendored/test/cases/doubles_in_array.json +0 -1
  100. data/ext/libyajl2/vendored/test/cases/doubles_in_array.json.gold +0 -8
  101. data/ext/libyajl2/vendored/test/cases/empty_array.json +0 -1
  102. data/ext/libyajl2/vendored/test/cases/empty_array.json.gold +0 -3
  103. data/ext/libyajl2/vendored/test/cases/empty_string.json +0 -1
  104. data/ext/libyajl2/vendored/test/cases/empty_string.json.gold +0 -2
  105. data/ext/libyajl2/vendored/test/cases/escaped_bulgarian.json +0 -4
  106. data/ext/libyajl2/vendored/test/cases/escaped_bulgarian.json.gold +0 -7
  107. data/ext/libyajl2/vendored/test/cases/escaped_foobar.json +0 -1
  108. data/ext/libyajl2/vendored/test/cases/escaped_foobar.json.gold +0 -2
  109. data/ext/libyajl2/vendored/test/cases/false.json +0 -1
  110. data/ext/libyajl2/vendored/test/cases/false.json.gold +0 -2
  111. data/ext/libyajl2/vendored/test/cases/fg_false_then_garbage.json +0 -1
  112. data/ext/libyajl2/vendored/test/cases/fg_false_then_garbage.json.gold +0 -3
  113. data/ext/libyajl2/vendored/test/cases/fg_issue_7.json +0 -1
  114. data/ext/libyajl2/vendored/test/cases/fg_issue_7.json.gold +0 -3
  115. data/ext/libyajl2/vendored/test/cases/fg_null_then_garbage.json +0 -1
  116. data/ext/libyajl2/vendored/test/cases/fg_null_then_garbage.json.gold +0 -3
  117. data/ext/libyajl2/vendored/test/cases/fg_true_then_garbage.json +0 -1
  118. data/ext/libyajl2/vendored/test/cases/fg_true_then_garbage.json.gold +0 -3
  119. data/ext/libyajl2/vendored/test/cases/four_byte_utf8.json +0 -2
  120. data/ext/libyajl2/vendored/test/cases/four_byte_utf8.json.gold +0 -5
  121. data/ext/libyajl2/vendored/test/cases/high_overflow.json +0 -1
  122. data/ext/libyajl2/vendored/test/cases/high_overflow.json.gold +0 -2
  123. data/ext/libyajl2/vendored/test/cases/integers.json +0 -3
  124. data/ext/libyajl2/vendored/test/cases/integers.json.gold +0 -14
  125. data/ext/libyajl2/vendored/test/cases/invalid_utf8.json +0 -1
  126. data/ext/libyajl2/vendored/test/cases/invalid_utf8.json.gold +0 -3
  127. data/ext/libyajl2/vendored/test/cases/isolated_surrogate_marker.json +0 -1
  128. data/ext/libyajl2/vendored/test/cases/isolated_surrogate_marker.json.gold +0 -2
  129. data/ext/libyajl2/vendored/test/cases/leading_zero_in_number.json +0 -1
  130. data/ext/libyajl2/vendored/test/cases/leading_zero_in_number.json.gold +0 -5
  131. data/ext/libyajl2/vendored/test/cases/lonely_minus_sign.json +0 -7
  132. data/ext/libyajl2/vendored/test/cases/lonely_minus_sign.json.gold +0 -9
  133. data/ext/libyajl2/vendored/test/cases/lonely_number.json +0 -1
  134. data/ext/libyajl2/vendored/test/cases/lonely_number.json.gold +0 -2
  135. data/ext/libyajl2/vendored/test/cases/low_overflow.json +0 -1
  136. data/ext/libyajl2/vendored/test/cases/low_overflow.json.gold +0 -2
  137. data/ext/libyajl2/vendored/test/cases/map_close.json +0 -1
  138. data/ext/libyajl2/vendored/test/cases/map_close.json.gold +0 -2
  139. data/ext/libyajl2/vendored/test/cases/missing_integer_after_decimal_point.json +0 -1
  140. data/ext/libyajl2/vendored/test/cases/missing_integer_after_decimal_point.json.gold +0 -2
  141. data/ext/libyajl2/vendored/test/cases/missing_integer_after_exponent.json +0 -1
  142. data/ext/libyajl2/vendored/test/cases/missing_integer_after_exponent.json.gold +0 -2
  143. data/ext/libyajl2/vendored/test/cases/multiple.json +0 -3
  144. data/ext/libyajl2/vendored/test/cases/multiple.json.gold +0 -4
  145. data/ext/libyajl2/vendored/test/cases/non_utf8_char_in_string.json +0 -1
  146. data/ext/libyajl2/vendored/test/cases/non_utf8_char_in_string.json.gold +0 -8
  147. data/ext/libyajl2/vendored/test/cases/np_partial_bad.json +0 -1
  148. data/ext/libyajl2/vendored/test/cases/np_partial_bad.json.gold +0 -5
  149. data/ext/libyajl2/vendored/test/cases/null.json +0 -1
  150. data/ext/libyajl2/vendored/test/cases/null.json.gold +0 -2
  151. data/ext/libyajl2/vendored/test/cases/nulls_and_bools.json +0 -5
  152. data/ext/libyajl2/vendored/test/cases/nulls_and_bools.json.gold +0 -9
  153. data/ext/libyajl2/vendored/test/cases/simple.json +0 -5
  154. data/ext/libyajl2/vendored/test/cases/simple.json.gold +0 -9
  155. data/ext/libyajl2/vendored/test/cases/simple_with_comments.json +0 -11
  156. data/ext/libyajl2/vendored/test/cases/simple_with_comments.json.gold +0 -5
  157. data/ext/libyajl2/vendored/test/cases/string_invalid_escape.json +0 -1
  158. data/ext/libyajl2/vendored/test/cases/string_invalid_escape.json.gold +0 -3
  159. data/ext/libyajl2/vendored/test/cases/string_invalid_hex_char.json +0 -1
  160. data/ext/libyajl2/vendored/test/cases/string_invalid_hex_char.json.gold +0 -2
  161. data/ext/libyajl2/vendored/test/cases/string_with_escapes.json +0 -3
  162. data/ext/libyajl2/vendored/test/cases/string_with_escapes.json.gold +0 -7
  163. data/ext/libyajl2/vendored/test/cases/string_with_invalid_newline.json +0 -2
  164. data/ext/libyajl2/vendored/test/cases/string_with_invalid_newline.json.gold +0 -2
  165. data/ext/libyajl2/vendored/test/cases/three_byte_utf8.json +0 -1
  166. data/ext/libyajl2/vendored/test/cases/three_byte_utf8.json.gold +0 -7
  167. data/ext/libyajl2/vendored/test/cases/true.json +0 -1
  168. data/ext/libyajl2/vendored/test/cases/true.json.gold +0 -2
  169. data/ext/libyajl2/vendored/test/cases/unescaped_bulgarian.json +0 -1
  170. data/ext/libyajl2/vendored/test/cases/unescaped_bulgarian.json.gold +0 -4
  171. data/ext/libyajl2/vendored/test/cases/zerobyte.json +0 -1
  172. data/ext/libyajl2/vendored/test/cases/zerobyte.json.gold +0 -0
  173. data/ext/libyajl2/vendored/test/run_tests.sh +0 -94
  174. data/ext/libyajl2/vendored/test/yajl_test.c +0 -281
  175. data/ext/libyajl2/vendored/verify/CMakeLists.txt +0 -39
  176. data/ext/libyajl2/vendored/verify/json_verify.c +0 -116
  177. data/lib/libyajl.so +0 -0
  178. data/lib/libyajl.so.2 +0 -0
  179. data/lib/libyajl.so.2.0.5 +0 -0
  180. data/lib/libyajl_s.a +0 -0
@@ -1,117 +0,0 @@
1
- /*
2
- * Copyright (c) 2007-2011, Lloyd Hilaiel <lloyd@hilaiel.com>
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
- #ifndef __YAJL_LEX_H__
18
- #define __YAJL_LEX_H__
19
-
20
- #include "api/yajl_common.h"
21
-
22
- typedef enum {
23
- yajl_tok_bool,
24
- yajl_tok_colon,
25
- yajl_tok_comma,
26
- yajl_tok_eof,
27
- yajl_tok_error,
28
- yajl_tok_left_brace,
29
- yajl_tok_left_bracket,
30
- yajl_tok_null,
31
- yajl_tok_right_brace,
32
- yajl_tok_right_bracket,
33
-
34
- /* we differentiate between integers and doubles to allow the
35
- * parser to interpret the number without re-scanning */
36
- yajl_tok_integer,
37
- yajl_tok_double,
38
-
39
- /* we differentiate between strings which require further processing,
40
- * and strings that do not */
41
- yajl_tok_string,
42
- yajl_tok_string_with_escapes,
43
-
44
- /* comment tokens are not currently returned to the parser, ever */
45
- yajl_tok_comment
46
- } yajl_tok;
47
-
48
- typedef struct yajl_lexer_t * yajl_lexer;
49
-
50
- yajl_lexer yajl_lex_alloc(yajl_alloc_funcs * alloc,
51
- unsigned int allowComments,
52
- unsigned int validateUTF8);
53
-
54
- void yajl_lex_free(yajl_lexer lexer);
55
-
56
- /**
57
- * run/continue a lex. "offset" is an input/output parameter.
58
- * It should be initialized to zero for a
59
- * new chunk of target text, and upon subsetquent calls with the same
60
- * target text should passed with the value of the previous invocation.
61
- *
62
- * the client may be interested in the value of offset when an error is
63
- * returned from the lexer. This allows the client to render useful
64
- n * error messages.
65
- *
66
- * When you pass the next chunk of data, context should be reinitialized
67
- * to zero.
68
- *
69
- * Finally, the output buffer is usually just a pointer into the jsonText,
70
- * however in cases where the entity being lexed spans multiple chunks,
71
- * the lexer will buffer the entity and the data returned will be
72
- * a pointer into that buffer.
73
- *
74
- * This behavior is abstracted from client code except for the performance
75
- * implications which require that the client choose a reasonable chunk
76
- * size to get adequate performance.
77
- */
78
- yajl_tok yajl_lex_lex(yajl_lexer lexer, const unsigned char * jsonText,
79
- size_t jsonTextLen, size_t * offset,
80
- const unsigned char ** outBuf, size_t * outLen);
81
-
82
- /** have a peek at the next token, but don't move the lexer forward */
83
- yajl_tok yajl_lex_peek(yajl_lexer lexer, const unsigned char * jsonText,
84
- size_t jsonTextLen, size_t offset);
85
-
86
-
87
- typedef enum {
88
- yajl_lex_e_ok = 0,
89
- yajl_lex_string_invalid_utf8,
90
- yajl_lex_string_invalid_escaped_char,
91
- yajl_lex_string_invalid_json_char,
92
- yajl_lex_string_invalid_hex_char,
93
- yajl_lex_invalid_char,
94
- yajl_lex_invalid_string,
95
- yajl_lex_missing_integer_after_decimal,
96
- yajl_lex_missing_integer_after_exponent,
97
- yajl_lex_missing_integer_after_minus,
98
- yajl_lex_unallowed_comment
99
- } yajl_lex_error;
100
-
101
- const char * yajl_lex_error_to_string(yajl_lex_error error);
102
-
103
- /** allows access to more specific information about the lexical
104
- * error when yajl_lex_lex returns yajl_tok_error. */
105
- yajl_lex_error yajl_lex_get_error(yajl_lexer lexer);
106
-
107
- /** get the current offset into the most recently lexed json string. */
108
- size_t yajl_lex_current_offset(yajl_lexer lexer);
109
-
110
- /** get the number of lines lexed by this lexer instance */
111
- size_t yajl_lex_current_line(yajl_lexer lexer);
112
-
113
- /** get the number of chars lexed by this lexer instance since the last
114
- * \n or \r */
115
- size_t yajl_lex_current_char(yajl_lexer lexer);
116
-
117
- #endif
@@ -1,498 +0,0 @@
1
- /*
2
- * Copyright (c) 2007-2011, Lloyd Hilaiel <lloyd@hilaiel.com>
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
- #include "api/yajl_parse.h"
18
- #include "yajl_lex.h"
19
- #include "yajl_parser.h"
20
- #include "yajl_encode.h"
21
- #include "yajl_bytestack.h"
22
-
23
- #include <stdlib.h>
24
- #include <limits.h>
25
- #include <errno.h>
26
- #include <stdio.h>
27
- #include <string.h>
28
- #include <ctype.h>
29
- #include <assert.h>
30
- #include <math.h>
31
-
32
- #define MAX_VALUE_TO_MULTIPLY ((LLONG_MAX / 10) + (LLONG_MAX % 10))
33
-
34
- /* same semantics as strtol */
35
- long long
36
- yajl_parse_integer(const unsigned char *number, unsigned int length)
37
- {
38
- long long ret = 0;
39
- long sign = 1;
40
- const unsigned char *pos = number;
41
- if (*pos == '-') { pos++; sign = -1; }
42
- if (*pos == '+') { pos++; }
43
-
44
- while (pos < number + length) {
45
- if ( ret > MAX_VALUE_TO_MULTIPLY ) {
46
- errno = ERANGE;
47
- return sign == 1 ? LLONG_MAX : LLONG_MIN;
48
- }
49
- ret *= 10;
50
- if (LLONG_MAX - ret < (*pos - '0')) {
51
- errno = ERANGE;
52
- return sign == 1 ? LLONG_MAX : LLONG_MIN;
53
- }
54
- if (*pos < '0' || *pos > '9') {
55
- errno = ERANGE;
56
- return sign == 1 ? LLONG_MAX : LLONG_MIN;
57
- }
58
- ret += (*pos++ - '0');
59
- }
60
-
61
- return sign * ret;
62
- }
63
-
64
- unsigned char *
65
- yajl_render_error_string(yajl_handle hand, const unsigned char * jsonText,
66
- size_t jsonTextLen, int verbose)
67
- {
68
- size_t offset = hand->bytesConsumed;
69
- unsigned char * str;
70
- const char * errorType = NULL;
71
- const char * errorText = NULL;
72
- char text[72];
73
- const char * arrow = " (right here) ------^\n";
74
-
75
- if (yajl_bs_current(hand->stateStack) == yajl_state_parse_error) {
76
- errorType = "parse";
77
- errorText = hand->parseError;
78
- } else if (yajl_bs_current(hand->stateStack) == yajl_state_lexical_error) {
79
- errorType = "lexical";
80
- errorText = yajl_lex_error_to_string(yajl_lex_get_error(hand->lexer));
81
- } else {
82
- errorType = "unknown";
83
- }
84
-
85
- {
86
- size_t memneeded = 0;
87
- memneeded += strlen(errorType);
88
- memneeded += strlen(" error");
89
- if (errorText != NULL) {
90
- memneeded += strlen(": ");
91
- memneeded += strlen(errorText);
92
- }
93
- str = (unsigned char *) YA_MALLOC(&(hand->alloc), memneeded + 2);
94
- if (!str) return NULL;
95
- str[0] = 0;
96
- strcat((char *) str, errorType);
97
- strcat((char *) str, " error");
98
- if (errorText != NULL) {
99
- strcat((char *) str, ": ");
100
- strcat((char *) str, errorText);
101
- }
102
- strcat((char *) str, "\n");
103
- }
104
-
105
- /* now we append as many spaces as needed to make sure the error
106
- * falls at char 41, if verbose was specified */
107
- if (verbose) {
108
- size_t start, end, i;
109
- size_t spacesNeeded;
110
-
111
- spacesNeeded = (offset < 30 ? 40 - offset : 10);
112
- start = (offset >= 30 ? offset - 30 : 0);
113
- end = (offset + 30 > jsonTextLen ? jsonTextLen : offset + 30);
114
-
115
- for (i=0;i<spacesNeeded;i++) text[i] = ' ';
116
-
117
- for (;start < end;start++, i++) {
118
- if (jsonText[start] != '\n' && jsonText[start] != '\r')
119
- {
120
- text[i] = jsonText[start];
121
- }
122
- else
123
- {
124
- text[i] = ' ';
125
- }
126
- }
127
- assert(i <= 71);
128
- text[i++] = '\n';
129
- text[i] = 0;
130
- {
131
- char * newStr = (char *)
132
- YA_MALLOC(&(hand->alloc), (unsigned int)(strlen((char *) str) +
133
- strlen((char *) text) +
134
- strlen(arrow) + 1));
135
- if (newStr) {
136
- newStr[0] = 0;
137
- strcat((char *) newStr, (char *) str);
138
- strcat((char *) newStr, text);
139
- strcat((char *) newStr, arrow);
140
- }
141
- YA_FREE(&(hand->alloc), str);
142
- str = (unsigned char *) newStr;
143
- }
144
- }
145
- return str;
146
- }
147
-
148
- /* check for client cancelation */
149
- #define _CC_CHK(x) \
150
- if (!(x)) { \
151
- yajl_bs_set(hand->stateStack, yajl_state_parse_error); \
152
- hand->parseError = \
153
- "client cancelled parse via callback return value"; \
154
- return yajl_status_client_canceled; \
155
- }
156
-
157
-
158
- yajl_status
159
- yajl_do_finish(yajl_handle hand)
160
- {
161
- yajl_status stat;
162
- stat = yajl_do_parse(hand,(const unsigned char *) " ",1);
163
-
164
- if (stat != yajl_status_ok) return stat;
165
-
166
- switch(yajl_bs_current(hand->stateStack))
167
- {
168
- case yajl_state_parse_error:
169
- case yajl_state_lexical_error:
170
- return yajl_status_error;
171
- case yajl_state_got_value:
172
- case yajl_state_parse_complete:
173
- return yajl_status_ok;
174
- default:
175
- if (!(hand->flags & yajl_allow_partial_values))
176
- {
177
- yajl_bs_set(hand->stateStack, yajl_state_parse_error);
178
- hand->parseError = "premature EOF";
179
- return yajl_status_error;
180
- }
181
- return yajl_status_ok;
182
- }
183
- }
184
-
185
- yajl_status
186
- yajl_do_parse(yajl_handle hand, const unsigned char * jsonText,
187
- size_t jsonTextLen)
188
- {
189
- yajl_tok tok;
190
- const unsigned char * buf;
191
- size_t bufLen;
192
- size_t * offset = &(hand->bytesConsumed);
193
-
194
- *offset = 0;
195
-
196
- around_again:
197
- switch (yajl_bs_current(hand->stateStack)) {
198
- case yajl_state_parse_complete:
199
- if (hand->flags & yajl_allow_multiple_values) {
200
- yajl_bs_set(hand->stateStack, yajl_state_got_value);
201
- goto around_again;
202
- }
203
- if (!(hand->flags & yajl_allow_trailing_garbage)) {
204
- if (*offset != jsonTextLen) {
205
- tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen,
206
- offset, &buf, &bufLen);
207
- if (tok != yajl_tok_eof) {
208
- yajl_bs_set(hand->stateStack, yajl_state_parse_error);
209
- hand->parseError = "trailing garbage";
210
- }
211
- goto around_again;
212
- }
213
- }
214
- return yajl_status_ok;
215
- case yajl_state_lexical_error:
216
- case yajl_state_parse_error:
217
- return yajl_status_error;
218
- case yajl_state_start:
219
- case yajl_state_got_value:
220
- case yajl_state_map_need_val:
221
- case yajl_state_array_need_val:
222
- case yajl_state_array_start: {
223
- /* for arrays and maps, we advance the state for this
224
- * depth, then push the state of the next depth.
225
- * If an error occurs during the parsing of the nesting
226
- * enitity, the state at this level will not matter.
227
- * a state that needs pushing will be anything other
228
- * than state_start */
229
-
230
- yajl_state stateToPush = yajl_state_start;
231
-
232
- tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen,
233
- offset, &buf, &bufLen);
234
-
235
- switch (tok) {
236
- case yajl_tok_eof:
237
- return yajl_status_ok;
238
- case yajl_tok_error:
239
- yajl_bs_set(hand->stateStack, yajl_state_lexical_error);
240
- goto around_again;
241
- case yajl_tok_string:
242
- if (hand->callbacks && hand->callbacks->yajl_string) {
243
- _CC_CHK(hand->callbacks->yajl_string(hand->ctx,
244
- buf, bufLen));
245
- }
246
- break;
247
- case yajl_tok_string_with_escapes:
248
- if (hand->callbacks && hand->callbacks->yajl_string) {
249
- yajl_buf_clear(hand->decodeBuf);
250
- yajl_string_decode(hand->decodeBuf, buf, bufLen);
251
- _CC_CHK(hand->callbacks->yajl_string(
252
- hand->ctx, yajl_buf_data(hand->decodeBuf),
253
- yajl_buf_len(hand->decodeBuf)));
254
- }
255
- break;
256
- case yajl_tok_bool:
257
- if (hand->callbacks && hand->callbacks->yajl_boolean) {
258
- _CC_CHK(hand->callbacks->yajl_boolean(hand->ctx,
259
- *buf == 't'));
260
- }
261
- break;
262
- case yajl_tok_null:
263
- if (hand->callbacks && hand->callbacks->yajl_null) {
264
- _CC_CHK(hand->callbacks->yajl_null(hand->ctx));
265
- }
266
- break;
267
- case yajl_tok_left_bracket:
268
- if (hand->callbacks && hand->callbacks->yajl_start_map) {
269
- _CC_CHK(hand->callbacks->yajl_start_map(hand->ctx));
270
- }
271
- stateToPush = yajl_state_map_start;
272
- break;
273
- case yajl_tok_left_brace:
274
- if (hand->callbacks && hand->callbacks->yajl_start_array) {
275
- _CC_CHK(hand->callbacks->yajl_start_array(hand->ctx));
276
- }
277
- stateToPush = yajl_state_array_start;
278
- break;
279
- case yajl_tok_integer:
280
- if (hand->callbacks) {
281
- if (hand->callbacks->yajl_number) {
282
- _CC_CHK(hand->callbacks->yajl_number(
283
- hand->ctx,(const char *) buf, bufLen));
284
- } else if (hand->callbacks->yajl_integer) {
285
- long long int i = 0;
286
- errno = 0;
287
- i = yajl_parse_integer(buf, bufLen);
288
- if ((i == LLONG_MIN || i == LLONG_MAX) &&
289
- errno == ERANGE)
290
- {
291
- yajl_bs_set(hand->stateStack,
292
- yajl_state_parse_error);
293
- hand->parseError = "integer overflow" ;
294
- /* try to restore error offset */
295
- if (*offset >= bufLen) *offset -= bufLen;
296
- else *offset = 0;
297
- goto around_again;
298
- }
299
- _CC_CHK(hand->callbacks->yajl_integer(hand->ctx,
300
- i));
301
- }
302
- }
303
- break;
304
- case yajl_tok_double:
305
- if (hand->callbacks) {
306
- if (hand->callbacks->yajl_number) {
307
- _CC_CHK(hand->callbacks->yajl_number(
308
- hand->ctx, (const char *) buf, bufLen));
309
- } else if (hand->callbacks->yajl_double) {
310
- double d = 0.0;
311
- yajl_buf_clear(hand->decodeBuf);
312
- yajl_buf_append(hand->decodeBuf, buf, bufLen);
313
- buf = yajl_buf_data(hand->decodeBuf);
314
- errno = 0;
315
- d = strtod((char *) buf, NULL);
316
- if ((d == HUGE_VAL || d == -HUGE_VAL) &&
317
- errno == ERANGE)
318
- {
319
- yajl_bs_set(hand->stateStack,
320
- yajl_state_parse_error);
321
- hand->parseError = "numeric (floating point) "
322
- "overflow";
323
- /* try to restore error offset */
324
- if (*offset >= bufLen) *offset -= bufLen;
325
- else *offset = 0;
326
- goto around_again;
327
- }
328
- _CC_CHK(hand->callbacks->yajl_double(hand->ctx,
329
- d));
330
- }
331
- }
332
- break;
333
- case yajl_tok_right_brace: {
334
- if (yajl_bs_current(hand->stateStack) ==
335
- yajl_state_array_start)
336
- {
337
- if (hand->callbacks &&
338
- hand->callbacks->yajl_end_array)
339
- {
340
- _CC_CHK(hand->callbacks->yajl_end_array(hand->ctx));
341
- }
342
- yajl_bs_pop(hand->stateStack);
343
- goto around_again;
344
- }
345
- /* intentional fall-through */
346
- }
347
- case yajl_tok_colon:
348
- case yajl_tok_comma:
349
- case yajl_tok_right_bracket:
350
- yajl_bs_set(hand->stateStack, yajl_state_parse_error);
351
- hand->parseError =
352
- "unallowed token at this point in JSON text";
353
- goto around_again;
354
- default:
355
- yajl_bs_set(hand->stateStack, yajl_state_parse_error);
356
- hand->parseError = "invalid token, internal error";
357
- goto around_again;
358
- }
359
- /* got a value. transition depends on the state we're in. */
360
- {
361
- yajl_state s = yajl_bs_current(hand->stateStack);
362
- if (s == yajl_state_start || s == yajl_state_got_value) {
363
- yajl_bs_set(hand->stateStack, yajl_state_parse_complete);
364
- } else if (s == yajl_state_map_need_val) {
365
- yajl_bs_set(hand->stateStack, yajl_state_map_got_val);
366
- } else {
367
- yajl_bs_set(hand->stateStack, yajl_state_array_got_val);
368
- }
369
- }
370
- if (stateToPush != yajl_state_start) {
371
- yajl_bs_push(hand->stateStack, stateToPush);
372
- }
373
-
374
- goto around_again;
375
- }
376
- case yajl_state_map_start:
377
- case yajl_state_map_need_key: {
378
- /* only difference between these two states is that in
379
- * start '}' is valid, whereas in need_key, we've parsed
380
- * a comma, and a string key _must_ follow */
381
- tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen,
382
- offset, &buf, &bufLen);
383
- switch (tok) {
384
- case yajl_tok_eof:
385
- return yajl_status_ok;
386
- case yajl_tok_error:
387
- yajl_bs_set(hand->stateStack, yajl_state_lexical_error);
388
- goto around_again;
389
- case yajl_tok_string_with_escapes:
390
- if (hand->callbacks && hand->callbacks->yajl_map_key) {
391
- yajl_buf_clear(hand->decodeBuf);
392
- yajl_string_decode(hand->decodeBuf, buf, bufLen);
393
- buf = yajl_buf_data(hand->decodeBuf);
394
- bufLen = yajl_buf_len(hand->decodeBuf);
395
- }
396
- /* intentional fall-through */
397
- case yajl_tok_string:
398
- if (hand->callbacks && hand->callbacks->yajl_map_key) {
399
- _CC_CHK(hand->callbacks->yajl_map_key(hand->ctx, buf,
400
- bufLen));
401
- }
402
- yajl_bs_set(hand->stateStack, yajl_state_map_sep);
403
- goto around_again;
404
- case yajl_tok_right_bracket:
405
- if (yajl_bs_current(hand->stateStack) ==
406
- yajl_state_map_start)
407
- {
408
- if (hand->callbacks && hand->callbacks->yajl_end_map) {
409
- _CC_CHK(hand->callbacks->yajl_end_map(hand->ctx));
410
- }
411
- yajl_bs_pop(hand->stateStack);
412
- goto around_again;
413
- }
414
- default:
415
- yajl_bs_set(hand->stateStack, yajl_state_parse_error);
416
- hand->parseError =
417
- "invalid object key (must be a string)";
418
- goto around_again;
419
- }
420
- }
421
- case yajl_state_map_sep: {
422
- tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen,
423
- offset, &buf, &bufLen);
424
- switch (tok) {
425
- case yajl_tok_colon:
426
- yajl_bs_set(hand->stateStack, yajl_state_map_need_val);
427
- goto around_again;
428
- case yajl_tok_eof:
429
- return yajl_status_ok;
430
- case yajl_tok_error:
431
- yajl_bs_set(hand->stateStack, yajl_state_lexical_error);
432
- goto around_again;
433
- default:
434
- yajl_bs_set(hand->stateStack, yajl_state_parse_error);
435
- hand->parseError = "object key and value must "
436
- "be separated by a colon (':')";
437
- goto around_again;
438
- }
439
- }
440
- case yajl_state_map_got_val: {
441
- tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen,
442
- offset, &buf, &bufLen);
443
- switch (tok) {
444
- case yajl_tok_right_bracket:
445
- if (hand->callbacks && hand->callbacks->yajl_end_map) {
446
- _CC_CHK(hand->callbacks->yajl_end_map(hand->ctx));
447
- }
448
- yajl_bs_pop(hand->stateStack);
449
- goto around_again;
450
- case yajl_tok_comma:
451
- yajl_bs_set(hand->stateStack, yajl_state_map_need_key);
452
- goto around_again;
453
- case yajl_tok_eof:
454
- return yajl_status_ok;
455
- case yajl_tok_error:
456
- yajl_bs_set(hand->stateStack, yajl_state_lexical_error);
457
- goto around_again;
458
- default:
459
- yajl_bs_set(hand->stateStack, yajl_state_parse_error);
460
- hand->parseError = "after key and value, inside map, "
461
- "I expect ',' or '}'";
462
- /* try to restore error offset */
463
- if (*offset >= bufLen) *offset -= bufLen;
464
- else *offset = 0;
465
- goto around_again;
466
- }
467
- }
468
- case yajl_state_array_got_val: {
469
- tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen,
470
- offset, &buf, &bufLen);
471
- switch (tok) {
472
- case yajl_tok_right_brace:
473
- if (hand->callbacks && hand->callbacks->yajl_end_array) {
474
- _CC_CHK(hand->callbacks->yajl_end_array(hand->ctx));
475
- }
476
- yajl_bs_pop(hand->stateStack);
477
- goto around_again;
478
- case yajl_tok_comma:
479
- yajl_bs_set(hand->stateStack, yajl_state_array_need_val);
480
- goto around_again;
481
- case yajl_tok_eof:
482
- return yajl_status_ok;
483
- case yajl_tok_error:
484
- yajl_bs_set(hand->stateStack, yajl_state_lexical_error);
485
- goto around_again;
486
- default:
487
- yajl_bs_set(hand->stateStack, yajl_state_parse_error);
488
- hand->parseError =
489
- "after array element, I expect ',' or ']'";
490
- goto around_again;
491
- }
492
- }
493
- }
494
-
495
- abort();
496
- return yajl_status_error;
497
- }
498
-