oj 3.11.0 → 3.11.5

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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -1
  3. data/ext/oj/buf.h +34 -38
  4. data/ext/oj/cache8.c +59 -62
  5. data/ext/oj/cache8.h +8 -7
  6. data/ext/oj/circarray.c +33 -35
  7. data/ext/oj/circarray.h +11 -9
  8. data/ext/oj/code.c +170 -174
  9. data/ext/oj/code.h +21 -20
  10. data/ext/oj/compat.c +159 -166
  11. data/ext/oj/custom.c +802 -851
  12. data/ext/oj/dump.c +766 -778
  13. data/ext/oj/dump.h +49 -51
  14. data/ext/oj/dump_compat.c +1 -0
  15. data/ext/oj/dump_leaf.c +116 -157
  16. data/ext/oj/dump_object.c +609 -628
  17. data/ext/oj/dump_strict.c +318 -327
  18. data/ext/oj/encode.h +3 -4
  19. data/ext/oj/err.c +39 -25
  20. data/ext/oj/err.h +24 -15
  21. data/ext/oj/extconf.rb +2 -1
  22. data/ext/oj/fast.c +1008 -1038
  23. data/ext/oj/hash.c +62 -66
  24. data/ext/oj/hash.h +7 -6
  25. data/ext/oj/hash_test.c +450 -443
  26. data/ext/oj/mimic_json.c +413 -402
  27. data/ext/oj/object.c +559 -528
  28. data/ext/oj/odd.c +123 -128
  29. data/ext/oj/odd.h +27 -25
  30. data/ext/oj/oj.c +1131 -924
  31. data/ext/oj/oj.h +286 -298
  32. data/ext/oj/parse.c +938 -930
  33. data/ext/oj/parse.h +70 -69
  34. data/ext/oj/rails.c +836 -839
  35. data/ext/oj/rails.h +7 -7
  36. data/ext/oj/reader.c +135 -140
  37. data/ext/oj/reader.h +66 -79
  38. data/ext/oj/resolve.c +43 -43
  39. data/ext/oj/resolve.h +3 -2
  40. data/ext/oj/rxclass.c +67 -68
  41. data/ext/oj/rxclass.h +12 -10
  42. data/ext/oj/saj.c +451 -479
  43. data/ext/oj/scp.c +93 -103
  44. data/ext/oj/sparse.c +770 -730
  45. data/ext/oj/stream_writer.c +120 -149
  46. data/ext/oj/strict.c +71 -86
  47. data/ext/oj/string_writer.c +198 -243
  48. data/ext/oj/trace.c +29 -33
  49. data/ext/oj/trace.h +14 -11
  50. data/ext/oj/util.c +103 -103
  51. data/ext/oj/util.h +3 -2
  52. data/ext/oj/val_stack.c +47 -47
  53. data/ext/oj/val_stack.h +79 -86
  54. data/ext/oj/wab.c +291 -309
  55. data/lib/oj/bag.rb +1 -0
  56. data/lib/oj/easy_hash.rb +5 -4
  57. data/lib/oj/mimic.rb +0 -12
  58. data/lib/oj/version.rb +1 -1
  59. data/test/activerecord/result_test.rb +7 -2
  60. data/test/foo.rb +35 -32
  61. data/test/helper.rb +10 -0
  62. data/test/json_gem/json_generator_test.rb +15 -3
  63. data/test/json_gem/test_helper.rb +8 -0
  64. data/test/test_compat.rb +2 -2
  65. data/test/test_generate.rb +21 -0
  66. data/test/test_hash.rb +10 -0
  67. data/test/test_scp.rb +1 -1
  68. metadata +4 -2
@@ -1,19 +1,18 @@
1
1
  // Copyright (c) 2012, 2017 Peter Ohler. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file in the project root for license details.
2
3
 
3
4
  #include <errno.h>
4
-
5
5
  #include <ruby.h>
6
6
 
7
7
  #include "encode.h"
8
8
 
9
- extern VALUE Oj;
9
+ extern VALUE Oj;
10
10
 
11
- static void
12
- stream_writer_free(void *ptr) {
13
- StreamWriter sw;
11
+ static void stream_writer_free(void *ptr) {
12
+ StreamWriter sw;
14
13
 
15
14
  if (0 == ptr) {
16
- return;
15
+ return;
17
16
  }
18
17
  sw = (StreamWriter)ptr;
19
18
  xfree(sw->sw.out.buf);
@@ -21,41 +20,38 @@ stream_writer_free(void *ptr) {
21
20
  xfree(ptr);
22
21
  }
23
22
 
24
- static void
25
- stream_writer_reset_buf(StreamWriter sw) {
26
- sw->sw.out.cur = sw->sw.out.buf;
23
+ static void stream_writer_reset_buf(StreamWriter sw) {
24
+ sw->sw.out.cur = sw->sw.out.buf;
27
25
  *sw->sw.out.cur = '\0';
28
26
  }
29
27
 
30
- static void
31
- stream_writer_write(StreamWriter sw) {
32
- ssize_t size = sw->sw.out.cur - sw->sw.out.buf;
28
+ static void stream_writer_write(StreamWriter sw) {
29
+ ssize_t size = sw->sw.out.cur - sw->sw.out.buf;
33
30
 
34
31
  switch (sw->type) {
35
32
  case STRING_IO:
36
33
  case STREAM_IO: {
37
- volatile VALUE rs = rb_str_new(sw->sw.out.buf, size);
38
-
39
- // Oddly enough, when pushing ASCII characters with UTF-8 encoding or
40
- // even ASCII-8BIT does not change the output encoding. Pushing any
41
- // non-ASCII no matter what the encoding changes the output encoding
42
- // to ASCII-8BIT if it the string is not forced to UTF-8 here.
43
- rs = oj_encode(rs);
44
- rb_funcall(sw->stream, oj_write_id, 1, rs);
45
- break;
34
+ volatile VALUE rs = rb_str_new(sw->sw.out.buf, size);
35
+
36
+ // Oddly enough, when pushing ASCII characters with UTF-8 encoding or
37
+ // even ASCII-8BIT does not change the output encoding. Pushing any
38
+ // non-ASCII no matter what the encoding changes the output encoding
39
+ // to ASCII-8BIT if it the string is not forced to UTF-8 here.
40
+ rs = oj_encode(rs);
41
+ rb_funcall(sw->stream, oj_write_id, 1, rs);
42
+ break;
46
43
  }
47
44
  case FILE_IO:
48
- if (size != write(sw->fd, sw->sw.out.buf, size)) {
49
- rb_raise(rb_eIOError, "Write failed. [_%d_:%s]\n", errno, strerror(errno));
50
- }
51
- break;
52
- default:
53
- rb_raise(rb_eArgError, "expected an IO Object.");
45
+ if (size != write(sw->fd, sw->sw.out.buf, size)) {
46
+ rb_raise(rb_eIOError, "Write failed. [_%d_:%s]\n", errno, strerror(errno));
47
+ }
48
+ break;
49
+ default: rb_raise(rb_eArgError, "expected an IO Object.");
54
50
  }
55
51
  stream_writer_reset_buf(sw);
56
52
  }
57
53
 
58
- static VALUE buffer_size_sym = Qundef;
54
+ static VALUE buffer_size_sym = Qundef;
59
55
 
60
56
  /* Document-method: new
61
57
  * call-seq: new(io, options)
@@ -73,62 +69,60 @@ static VALUE buffer_size_sym = Qundef;
73
69
  * - *io* [_IO_] stream to write to
74
70
  * - *options* [_Hash_] formating options
75
71
  */
76
- static VALUE
77
- stream_writer_new(int argc, VALUE *argv, VALUE self) {
78
- StreamWriterType type = STREAM_IO;
79
- int fd = 0;
80
- VALUE stream = argv[0];
81
- VALUE clas = rb_obj_class(stream);
82
- StreamWriter sw;
72
+ static VALUE stream_writer_new(int argc, VALUE *argv, VALUE self) {
73
+ StreamWriterType type = STREAM_IO;
74
+ int fd = 0;
75
+ VALUE stream = argv[0];
76
+ VALUE clas = rb_obj_class(stream);
77
+ StreamWriter sw;
83
78
  #if !IS_WINDOWS
84
- VALUE s;
79
+ VALUE s;
85
80
  #endif
86
81
 
87
82
  if (oj_stringio_class == clas) {
88
- type = STRING_IO;
83
+ type = STRING_IO;
89
84
  #if !IS_WINDOWS
90
85
  } else if (rb_respond_to(stream, oj_fileno_id) &&
91
- Qnil != (s = rb_funcall(stream, oj_fileno_id, 0)) &&
92
- 0 != (fd = FIX2INT(s))) {
93
- type = FILE_IO;
86
+ Qnil != (s = rb_funcall(stream, oj_fileno_id, 0)) && 0 != (fd = FIX2INT(s))) {
87
+ type = FILE_IO;
94
88
  #endif
95
89
  } else if (rb_respond_to(stream, oj_write_id)) {
96
- type = STREAM_IO;
90
+ type = STREAM_IO;
97
91
  } else {
98
- rb_raise(rb_eArgError, "expected an IO Object.");
92
+ rb_raise(rb_eArgError, "expected an IO Object.");
99
93
  }
100
94
  sw = ALLOC(struct _streamWriter);
101
95
  if (2 == argc && T_HASH == rb_type(argv[1])) {
102
- volatile VALUE v;
103
- int buf_size = 0;
104
-
105
- if (Qundef == buffer_size_sym) {
106
- buffer_size_sym = ID2SYM(rb_intern("buffer_size")); rb_gc_register_address(&buffer_size_sym);
107
-
108
- }
109
- if (Qnil != (v = rb_hash_lookup(argv[1], buffer_size_sym))) {
96
+ volatile VALUE v;
97
+ int buf_size = 0;
98
+
99
+ if (Qundef == buffer_size_sym) {
100
+ buffer_size_sym = ID2SYM(rb_intern("buffer_size"));
101
+ rb_gc_register_address(&buffer_size_sym);
102
+ }
103
+ if (Qnil != (v = rb_hash_lookup(argv[1], buffer_size_sym))) {
110
104
  #ifdef RUBY_INTEGER_UNIFICATION
111
- if (rb_cInteger != rb_obj_class(v)) {
112
- rb_raise(rb_eArgError, ":buffer size must be a Integer.");
113
- }
105
+ if (rb_cInteger != rb_obj_class(v)) {
106
+ rb_raise(rb_eArgError, ":buffer size must be a Integer.");
107
+ }
114
108
  #else
115
- if (T_FIXNUM != rb_type(v)) {
116
- rb_raise(rb_eArgError, ":buffer size must be a Integer.");
117
- }
109
+ if (T_FIXNUM != rb_type(v)) {
110
+ rb_raise(rb_eArgError, ":buffer size must be a Integer.");
111
+ }
118
112
  #endif
119
- buf_size = FIX2INT(v);
120
- }
121
- oj_str_writer_init(&sw->sw, buf_size);
122
- oj_parse_options(argv[1], &sw->sw.opts);
123
- sw->flush_limit = buf_size;
113
+ buf_size = FIX2INT(v);
114
+ }
115
+ oj_str_writer_init(&sw->sw, buf_size);
116
+ oj_parse_options(argv[1], &sw->sw.opts);
117
+ sw->flush_limit = buf_size;
124
118
  } else {
125
- oj_str_writer_init(&sw->sw, 4096);
126
- sw->flush_limit = 0;
119
+ oj_str_writer_init(&sw->sw, 4096);
120
+ sw->flush_limit = 0;
127
121
  }
128
122
  sw->sw.out.indent = sw->sw.opts.indent;
129
- sw->stream = stream;
130
- sw->type = type;
131
- sw->fd = fd;
123
+ sw->stream = stream;
124
+ sw->type = type;
125
+ sw->fd = fd;
132
126
 
133
127
  return Data_Wrap_Struct(oj_stream_writer_class, 0, stream_writer_free, sw);
134
128
  }
@@ -142,14 +136,13 @@ stream_writer_new(int argc, VALUE *argv, VALUE self) {
142
136
  *
143
137
  * - *key* [_String_] the key pending for the next push
144
138
  */
145
- static VALUE
146
- stream_writer_push_key(VALUE self, VALUE key) {
147
- StreamWriter sw = (StreamWriter)DATA_PTR(self);
139
+ static VALUE stream_writer_push_key(VALUE self, VALUE key) {
140
+ StreamWriter sw = (StreamWriter)DATA_PTR(self);
148
141
 
149
142
  rb_check_type(key, T_STRING);
150
143
  oj_str_writer_push_key(&sw->sw, StringValuePtr(key));
151
144
  if (sw->flush_limit < sw->sw.out.cur - sw->sw.out.buf) {
152
- stream_writer_write(sw);
145
+ stream_writer_write(sw);
153
146
  }
154
147
  return Qnil;
155
148
  }
@@ -162,28 +155,23 @@ stream_writer_push_key(VALUE self, VALUE key) {
162
155
  *
163
156
  * - *key* [_String_] the key if adding to an object in the JSON document
164
157
  */
165
- static VALUE
166
- stream_writer_push_object(int argc, VALUE *argv, VALUE self) {
167
- StreamWriter sw = (StreamWriter)DATA_PTR(self);
158
+ static VALUE stream_writer_push_object(int argc, VALUE *argv, VALUE self) {
159
+ StreamWriter sw = (StreamWriter)DATA_PTR(self);
168
160
 
169
161
  switch (argc) {
170
- case 0:
171
- oj_str_writer_push_object(&sw->sw, 0);
172
- break;
162
+ case 0: oj_str_writer_push_object(&sw->sw, 0); break;
173
163
  case 1:
174
- if (Qnil == argv[0]) {
175
- oj_str_writer_push_object(&sw->sw, 0);
176
- } else {
177
- rb_check_type(argv[0], T_STRING);
178
- oj_str_writer_push_object(&sw->sw, StringValuePtr(argv[0]));
179
- }
180
- break;
181
- default:
182
- rb_raise(rb_eArgError, "Wrong number of argument to 'push_object'.");
183
- break;
164
+ if (Qnil == argv[0]) {
165
+ oj_str_writer_push_object(&sw->sw, 0);
166
+ } else {
167
+ rb_check_type(argv[0], T_STRING);
168
+ oj_str_writer_push_object(&sw->sw, StringValuePtr(argv[0]));
169
+ }
170
+ break;
171
+ default: rb_raise(rb_eArgError, "Wrong number of argument to 'push_object'."); break;
184
172
  }
185
173
  if (sw->flush_limit < sw->sw.out.cur - sw->sw.out.buf) {
186
- stream_writer_write(sw);
174
+ stream_writer_write(sw);
187
175
  }
188
176
  return Qnil;
189
177
  }
@@ -196,28 +184,23 @@ stream_writer_push_object(int argc, VALUE *argv, VALUE self) {
196
184
  *
197
185
  * - *key* [_String_] the key if adding to an object in the JSON document
198
186
  */
199
- static VALUE
200
- stream_writer_push_array(int argc, VALUE *argv, VALUE self) {
201
- StreamWriter sw = (StreamWriter)DATA_PTR(self);
187
+ static VALUE stream_writer_push_array(int argc, VALUE *argv, VALUE self) {
188
+ StreamWriter sw = (StreamWriter)DATA_PTR(self);
202
189
 
203
190
  switch (argc) {
204
- case 0:
205
- oj_str_writer_push_array(&sw->sw, 0);
206
- break;
191
+ case 0: oj_str_writer_push_array(&sw->sw, 0); break;
207
192
  case 1:
208
- if (Qnil == argv[0]) {
209
- oj_str_writer_push_array(&sw->sw, 0);
210
- } else {
211
- rb_check_type(argv[0], T_STRING);
212
- oj_str_writer_push_array(&sw->sw, StringValuePtr(argv[0]));
213
- }
214
- break;
215
- default:
216
- rb_raise(rb_eArgError, "Wrong number of argument to 'push_object'.");
217
- break;
193
+ if (Qnil == argv[0]) {
194
+ oj_str_writer_push_array(&sw->sw, 0);
195
+ } else {
196
+ rb_check_type(argv[0], T_STRING);
197
+ oj_str_writer_push_array(&sw->sw, StringValuePtr(argv[0]));
198
+ }
199
+ break;
200
+ default: rb_raise(rb_eArgError, "Wrong number of argument to 'push_object'."); break;
218
201
  }
219
202
  if (sw->flush_limit < sw->sw.out.cur - sw->sw.out.buf) {
220
- stream_writer_write(sw);
203
+ stream_writer_write(sw);
221
204
  }
222
205
  return Qnil;
223
206
  }
@@ -229,28 +212,23 @@ stream_writer_push_array(int argc, VALUE *argv, VALUE self) {
229
212
  * - *value* [_Object_] value to add to the JSON document
230
213
  * - *key* [_String_] the key if adding to an object in the JSON document
231
214
  */
232
- static VALUE
233
- stream_writer_push_value(int argc, VALUE *argv, VALUE self) {
234
- StreamWriter sw = (StreamWriter)DATA_PTR(self);
215
+ static VALUE stream_writer_push_value(int argc, VALUE *argv, VALUE self) {
216
+ StreamWriter sw = (StreamWriter)DATA_PTR(self);
235
217
 
236
218
  switch (argc) {
237
- case 1:
238
- oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, 0);
239
- break;
219
+ case 1: oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, 0); break;
240
220
  case 2:
241
- if (Qnil == argv[1]) {
242
- oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, 0);
243
- } else {
244
- rb_check_type(argv[1], T_STRING);
245
- oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, StringValuePtr(argv[1]));
246
- }
247
- break;
248
- default:
249
- rb_raise(rb_eArgError, "Wrong number of argument to 'push_value'.");
250
- break;
221
+ if (Qnil == argv[1]) {
222
+ oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, 0);
223
+ } else {
224
+ rb_check_type(argv[1], T_STRING);
225
+ oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, StringValuePtr(argv[1]));
226
+ }
227
+ break;
228
+ default: rb_raise(rb_eArgError, "Wrong number of argument to 'push_value'."); break;
251
229
  }
252
230
  if (sw->flush_limit < sw->sw.out.cur - sw->sw.out.buf) {
253
- stream_writer_write(sw);
231
+ stream_writer_write(sw);
254
232
  }
255
233
  return Qnil;
256
234
  }
@@ -264,29 +242,26 @@ stream_writer_push_value(int argc, VALUE *argv, VALUE self) {
264
242
  * - *value* [_Object_] value to add to the JSON document
265
243
  * - *key* [_String_] the key if adding to an object in the JSON document
266
244
  */
267
- static VALUE
268
- stream_writer_push_json(int argc, VALUE *argv, VALUE self) {
269
- StreamWriter sw = (StreamWriter)DATA_PTR(self);
245
+ static VALUE stream_writer_push_json(int argc, VALUE *argv, VALUE self) {
246
+ StreamWriter sw = (StreamWriter)DATA_PTR(self);
270
247
 
271
248
  rb_check_type(argv[0], T_STRING);
272
249
  switch (argc) {
273
- case 1:
274
- oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0);
275
- break;
250
+ case 1: oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0); break;
276
251
  case 2:
277
- if (Qnil == argv[1]) {
278
- oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0);
279
- } else {
280
- rb_check_type(argv[1], T_STRING);
281
- oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), StringValuePtr(argv[1]));
282
- }
283
- break;
284
- default:
285
- rb_raise(rb_eArgError, "Wrong number of argument to 'push_json'.");
286
- break;
252
+ if (Qnil == argv[1]) {
253
+ oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0);
254
+ } else {
255
+ rb_check_type(argv[1], T_STRING);
256
+ oj_str_writer_push_json((StrWriter)DATA_PTR(self),
257
+ StringValuePtr(*argv),
258
+ StringValuePtr(argv[1]));
259
+ }
260
+ break;
261
+ default: rb_raise(rb_eArgError, "Wrong number of argument to 'push_json'."); break;
287
262
  }
288
263
  if (sw->flush_limit < sw->sw.out.cur - sw->sw.out.buf) {
289
- stream_writer_write(sw);
264
+ stream_writer_write(sw);
290
265
  }
291
266
  return Qnil;
292
267
  }
@@ -297,13 +272,12 @@ stream_writer_push_json(int argc, VALUE *argv, VALUE self) {
297
272
  * Pops up a level in the JSON document closing the array or object that is
298
273
  * currently open.
299
274
  */
300
- static VALUE
301
- stream_writer_pop(VALUE self) {
302
- StreamWriter sw = (StreamWriter)DATA_PTR(self);
275
+ static VALUE stream_writer_pop(VALUE self) {
276
+ StreamWriter sw = (StreamWriter)DATA_PTR(self);
303
277
 
304
278
  oj_str_writer_pop(&sw->sw);
305
279
  if (sw->flush_limit < sw->sw.out.cur - sw->sw.out.buf) {
306
- stream_writer_write(sw);
280
+ stream_writer_write(sw);
307
281
  }
308
282
  return Qnil;
309
283
  }
@@ -314,9 +288,8 @@ stream_writer_pop(VALUE self) {
314
288
  * Pops all level in the JSON document closing all the array or object that is
315
289
  * currently open.
316
290
  */
317
- static VALUE
318
- stream_writer_pop_all(VALUE self) {
319
- StreamWriter sw = (StreamWriter)DATA_PTR(self);
291
+ static VALUE stream_writer_pop_all(VALUE self) {
292
+ StreamWriter sw = (StreamWriter)DATA_PTR(self);
320
293
 
321
294
  oj_str_writer_pop_all(&sw->sw);
322
295
  stream_writer_write(sw);
@@ -329,8 +302,7 @@ stream_writer_pop_all(VALUE self) {
329
302
  *
330
303
  * Flush any remaining characters in the buffer.
331
304
  */
332
- static VALUE
333
- stream_writer_flush(VALUE self) {
305
+ static VALUE stream_writer_flush(VALUE self) {
334
306
  stream_writer_write((StreamWriter)DATA_PTR(self));
335
307
 
336
308
  return Qnil;
@@ -343,8 +315,7 @@ stream_writer_flush(VALUE self) {
343
315
  * will create that element in the JSON document and subsequent pushes will add
344
316
  * the elements to that array or object until a pop() is called.
345
317
  */
346
- void
347
- oj_stream_writer_init() {
318
+ void oj_stream_writer_init() {
348
319
  oj_stream_writer_class = rb_define_class_under(Oj, "StreamWriter", rb_cObject);
349
320
  rb_define_module_function(oj_stream_writer_class, "new", stream_writer_new, -1);
350
321
  rb_define_method(oj_stream_writer_class, "push_key", stream_writer_push_key, 1);
data/ext/oj/strict.c CHANGED
@@ -1,207 +1,192 @@
1
1
  // Copyright (c) 2012 Peter Ohler. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file in the project root for license details.
2
3
 
3
- #include <stdlib.h>
4
4
  #include <stdio.h>
5
+ #include <stdlib.h>
5
6
  #include <string.h>
6
7
  #include <unistd.h>
7
8
 
8
- #include "oj.h"
9
+ #include "encode.h"
9
10
  #include "err.h"
11
+ #include "oj.h"
10
12
  #include "parse.h"
11
- #include "encode.h"
12
13
  #include "trace.h"
13
14
 
14
- static void
15
- hash_end(ParseInfo pi) {
15
+ static void hash_end(ParseInfo pi) {
16
16
  if (Yes == pi->options.trace) {
17
- oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
17
+ oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
18
18
  }
19
19
  }
20
20
 
21
- static void
22
- array_end(ParseInfo pi) {
21
+ static void array_end(ParseInfo pi) {
23
22
  if (Yes == pi->options.trace) {
24
- oj_trace_parse_array_end(pi, __FILE__, __LINE__);
23
+ oj_trace_parse_array_end(pi, __FILE__, __LINE__);
25
24
  }
26
25
  }
27
26
 
28
- static VALUE
29
- noop_hash_key(ParseInfo pi, const char *key, size_t klen) {
27
+ static VALUE noop_hash_key(ParseInfo pi, const char *key, size_t klen) {
30
28
  return Qundef;
31
29
  }
32
30
 
33
- static void
34
- add_value(ParseInfo pi, VALUE val) {
31
+ static void add_value(ParseInfo pi, VALUE val) {
35
32
  if (Yes == pi->options.trace) {
36
- oj_trace_parse_call("add_value", pi, __FILE__, __LINE__, val);
33
+ oj_trace_parse_call("add_value", pi, __FILE__, __LINE__, val);
37
34
  }
38
35
  pi->stack.head->val = val;
39
36
  }
40
37
 
41
- static void
42
- add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
43
- volatile VALUE rstr = rb_str_new(str, len);
38
+ static void add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
39
+ volatile VALUE rstr = rb_str_new(str, len);
44
40
 
45
- rstr = oj_encode(rstr);
41
+ rstr = oj_encode(rstr);
46
42
  pi->stack.head->val = rstr;
47
43
  if (Yes == pi->options.trace) {
48
- oj_trace_parse_call("add_string", pi, __FILE__, __LINE__, rstr);
44
+ oj_trace_parse_call("add_string", pi, __FILE__, __LINE__, rstr);
49
45
  }
50
46
  }
51
47
 
52
- static void
53
- add_num(ParseInfo pi, NumInfo ni) {
48
+ static void add_num(ParseInfo pi, NumInfo ni) {
54
49
  if (ni->infinity || ni->nan) {
55
- oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
50
+ oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
56
51
  }
57
52
  pi->stack.head->val = oj_num_as_value(ni);
58
53
  if (Yes == pi->options.trace) {
59
- oj_trace_parse_call("add_number", pi, __FILE__, __LINE__, pi->stack.head->val);
54
+ oj_trace_parse_call("add_number", pi, __FILE__, __LINE__, pi->stack.head->val);
60
55
  }
61
56
  }
62
57
 
63
- static VALUE
64
- start_hash(ParseInfo pi) {
58
+ static VALUE start_hash(ParseInfo pi) {
65
59
  if (Qnil != pi->options.hash_class) {
66
- return rb_class_new_instance(0, NULL, pi->options.hash_class);
60
+ return rb_class_new_instance(0, NULL, pi->options.hash_class);
67
61
  }
68
62
  if (Yes == pi->options.trace) {
69
- oj_trace_parse_in("start_hash", pi, __FILE__, __LINE__);
63
+ oj_trace_parse_in("start_hash", pi, __FILE__, __LINE__);
70
64
  }
71
65
  return rb_hash_new();
72
66
  }
73
67
 
74
- static VALUE
75
- calc_hash_key(ParseInfo pi, Val parent) {
76
- volatile VALUE rkey = parent->key_val;
68
+ static VALUE calc_hash_key(ParseInfo pi, Val parent) {
69
+ volatile VALUE rkey = parent->key_val;
77
70
 
78
71
  if (Qundef == rkey) {
79
- rkey = rb_str_new(parent->key, parent->klen);
72
+ rkey = rb_str_new(parent->key, parent->klen);
80
73
  }
81
74
  rkey = oj_encode(rkey);
82
75
  if (Yes == pi->options.sym_key) {
83
- rkey = rb_str_intern(rkey);
76
+ rkey = rb_str_intern(rkey);
84
77
  }
85
78
  return rkey;
86
79
  }
87
80
 
88
- static void
89
- hash_set_cstr(ParseInfo pi, Val parent, const char *str, size_t len, const char *orig) {
90
- volatile VALUE rstr = rb_str_new(str, len);
81
+ static void hash_set_cstr(ParseInfo pi, Val parent, const char *str, size_t len, const char *orig) {
82
+ volatile VALUE rstr = rb_str_new(str, len);
91
83
 
92
84
  rstr = oj_encode(rstr);
93
85
  rb_hash_aset(stack_peek(&pi->stack)->val, calc_hash_key(pi, parent), rstr);
94
86
  if (Yes == pi->options.trace) {
95
- oj_trace_parse_call("set_string", pi, __FILE__, __LINE__, rstr);
87
+ oj_trace_parse_call("set_string", pi, __FILE__, __LINE__, rstr);
96
88
  }
97
89
  }
98
90
 
99
- static void
100
- hash_set_num(ParseInfo pi, Val parent, NumInfo ni) {
101
- volatile VALUE v;
91
+ static void hash_set_num(ParseInfo pi, Val parent, NumInfo ni) {
92
+ volatile VALUE v;
102
93
 
103
94
  if (ni->infinity || ni->nan) {
104
- oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
95
+ oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
105
96
  }
106
97
  v = oj_num_as_value(ni);
107
98
  rb_hash_aset(stack_peek(&pi->stack)->val, calc_hash_key(pi, parent), v);
108
99
  if (Yes == pi->options.trace) {
109
- oj_trace_parse_call("set_number", pi, __FILE__, __LINE__, v);
100
+ oj_trace_parse_call("set_number", pi, __FILE__, __LINE__, v);
110
101
  }
111
102
  }
112
103
 
113
- static void
114
- hash_set_value(ParseInfo pi, Val parent, VALUE value) {
104
+ static void hash_set_value(ParseInfo pi, Val parent, VALUE value) {
115
105
  rb_hash_aset(stack_peek(&pi->stack)->val, calc_hash_key(pi, parent), value);
116
106
  if (Yes == pi->options.trace) {
117
- oj_trace_parse_call("set_value", pi, __FILE__, __LINE__, value);
107
+ oj_trace_parse_call("set_value", pi, __FILE__, __LINE__, value);
118
108
  }
119
109
  }
120
110
 
121
- static VALUE
122
- start_array(ParseInfo pi) {
111
+ static VALUE start_array(ParseInfo pi) {
123
112
  if (Yes == pi->options.trace) {
124
- oj_trace_parse_in("start_array", pi, __FILE__, __LINE__);
113
+ oj_trace_parse_in("start_array", pi, __FILE__, __LINE__);
125
114
  }
126
115
  return rb_ary_new();
127
116
  }
128
117
 
129
- static void
130
- array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
131
- volatile VALUE rstr = rb_str_new(str, len);
118
+ static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
119
+ volatile VALUE rstr = rb_str_new(str, len);
132
120
 
133
121
  rstr = oj_encode(rstr);
134
122
  rb_ary_push(stack_peek(&pi->stack)->val, rstr);
135
123
  if (Yes == pi->options.trace) {
136
- oj_trace_parse_call("append_string", pi, __FILE__, __LINE__, rstr);
124
+ oj_trace_parse_call("append_string", pi, __FILE__, __LINE__, rstr);
137
125
  }
138
126
  }
139
127
 
140
- static void
141
- array_append_num(ParseInfo pi, NumInfo ni) {
142
- volatile VALUE v;
128
+ static void array_append_num(ParseInfo pi, NumInfo ni) {
129
+ volatile VALUE v;
143
130
 
144
131
  if (ni->infinity || ni->nan) {
145
- oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
132
+ oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
146
133
  }
147
134
  v = oj_num_as_value(ni);
148
135
  rb_ary_push(stack_peek(&pi->stack)->val, v);
149
136
  if (Yes == pi->options.trace) {
150
- oj_trace_parse_call("append_number", pi, __FILE__, __LINE__, v);
137
+ oj_trace_parse_call("append_number", pi, __FILE__, __LINE__, v);
151
138
  }
152
139
  }
153
140
 
154
- static void
155
- array_append_value(ParseInfo pi, VALUE value) {
141
+ static void array_append_value(ParseInfo pi, VALUE value) {
156
142
  rb_ary_push(stack_peek(&pi->stack)->val, value);
157
143
  if (Yes == pi->options.trace) {
158
- oj_trace_parse_call("append_value", pi, __FILE__, __LINE__, value);
159
- }
160
- }
161
-
162
- void
163
- oj_set_strict_callbacks(ParseInfo pi) {
164
- pi->start_hash = start_hash;
165
- pi->end_hash = hash_end;
166
- pi->hash_key = noop_hash_key;
167
- pi->hash_set_cstr = hash_set_cstr;
168
- pi->hash_set_num = hash_set_num;
169
- pi->hash_set_value = hash_set_value;
170
- pi->start_array = start_array;
171
- pi->end_array = array_end;
172
- pi->array_append_cstr = array_append_cstr;
173
- pi->array_append_num = array_append_num;
144
+ oj_trace_parse_call("append_value", pi, __FILE__, __LINE__, value);
145
+ }
146
+ }
147
+
148
+ void oj_set_strict_callbacks(ParseInfo pi) {
149
+ pi->start_hash = start_hash;
150
+ pi->end_hash = hash_end;
151
+ pi->hash_key = noop_hash_key;
152
+ pi->hash_set_cstr = hash_set_cstr;
153
+ pi->hash_set_num = hash_set_num;
154
+ pi->hash_set_value = hash_set_value;
155
+ pi->start_array = start_array;
156
+ pi->end_array = array_end;
157
+ pi->array_append_cstr = array_append_cstr;
158
+ pi->array_append_num = array_append_num;
174
159
  pi->array_append_value = array_append_value;
175
- pi->add_cstr = add_cstr;
176
- pi->add_num = add_num;
177
- pi->add_value = add_value;
178
- pi->expect_value = 1;
160
+ pi->add_cstr = add_cstr;
161
+ pi->add_num = add_num;
162
+ pi->add_value = add_value;
163
+ pi->expect_value = 1;
179
164
  }
180
165
 
181
166
  VALUE
182
167
  oj_strict_parse(int argc, VALUE *argv, VALUE self) {
183
- struct _parseInfo pi;
168
+ struct _parseInfo pi;
184
169
 
185
170
  parse_info_init(&pi);
186
- pi.options = oj_default_options;
187
- pi.handler = Qnil;
171
+ pi.options = oj_default_options;
172
+ pi.handler = Qnil;
188
173
  pi.err_class = Qnil;
189
174
  oj_set_strict_callbacks(&pi);
190
175
 
191
176
  if (T_STRING == rb_type(*argv)) {
192
- return oj_pi_parse(argc, argv, &pi, 0, 0, true);
177
+ return oj_pi_parse(argc, argv, &pi, 0, 0, true);
193
178
  } else {
194
- return oj_pi_sparse(argc, argv, &pi, 0);
179
+ return oj_pi_sparse(argc, argv, &pi, 0);
195
180
  }
196
181
  }
197
182
 
198
183
  VALUE
199
184
  oj_strict_parse_cstr(int argc, VALUE *argv, char *json, size_t len) {
200
- struct _parseInfo pi;
185
+ struct _parseInfo pi;
201
186
 
202
187
  parse_info_init(&pi);
203
- pi.options = oj_default_options;
204
- pi.handler = Qnil;
188
+ pi.options = oj_default_options;
189
+ pi.handler = Qnil;
205
190
  pi.err_class = Qnil;
206
191
  oj_set_strict_callbacks(&pi);
207
192