oj 3.11.0 → 3.16.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 (173) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1421 -0
  3. data/README.md +20 -5
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +48 -38
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +60 -62
  9. data/ext/oj/cache8.h +8 -7
  10. data/ext/oj/circarray.c +35 -35
  11. data/ext/oj/circarray.h +11 -9
  12. data/ext/oj/code.c +156 -174
  13. data/ext/oj/code.h +19 -18
  14. data/ext/oj/compat.c +140 -197
  15. data/ext/oj/custom.c +737 -879
  16. data/ext/oj/debug.c +126 -0
  17. data/ext/oj/dump.c +830 -835
  18. data/ext/oj/dump.h +65 -53
  19. data/ext/oj/dump_compat.c +566 -642
  20. data/ext/oj/dump_leaf.c +95 -182
  21. data/ext/oj/dump_object.c +518 -659
  22. data/ext/oj/dump_strict.c +301 -334
  23. data/ext/oj/encode.h +3 -4
  24. data/ext/oj/encoder.c +43 -0
  25. data/ext/oj/err.c +27 -24
  26. data/ext/oj/err.h +38 -13
  27. data/ext/oj/extconf.rb +23 -7
  28. data/ext/oj/fast.c +1043 -1073
  29. data/ext/oj/intern.c +313 -0
  30. data/ext/oj/intern.h +22 -0
  31. data/ext/oj/mem.c +318 -0
  32. data/ext/oj/mem.h +53 -0
  33. data/ext/oj/mimic_json.c +449 -423
  34. data/ext/oj/object.c +530 -576
  35. data/ext/oj/odd.c +155 -138
  36. data/ext/oj/odd.h +24 -22
  37. data/ext/oj/oj.c +1331 -993
  38. data/ext/oj/oj.h +306 -292
  39. data/ext/oj/parse.c +934 -938
  40. data/ext/oj/parse.h +73 -70
  41. data/ext/oj/parser.c +1600 -0
  42. data/ext/oj/parser.h +101 -0
  43. data/ext/oj/rails.c +795 -845
  44. data/ext/oj/rails.h +7 -7
  45. data/ext/oj/reader.c +132 -140
  46. data/ext/oj/reader.h +67 -78
  47. data/ext/oj/resolve.c +40 -59
  48. data/ext/oj/resolve.h +3 -2
  49. data/ext/oj/rxclass.c +67 -67
  50. data/ext/oj/rxclass.h +11 -9
  51. data/ext/oj/saj.c +441 -480
  52. data/ext/oj/saj2.c +584 -0
  53. data/ext/oj/saj2.h +23 -0
  54. data/ext/oj/scp.c +78 -111
  55. data/ext/oj/sparse.c +726 -730
  56. data/ext/oj/stream_writer.c +146 -165
  57. data/ext/oj/strict.c +103 -123
  58. data/ext/oj/string_writer.c +241 -253
  59. data/ext/oj/trace.c +29 -33
  60. data/ext/oj/trace.h +41 -11
  61. data/ext/oj/usual.c +1218 -0
  62. data/ext/oj/usual.h +69 -0
  63. data/ext/oj/util.c +103 -103
  64. data/ext/oj/util.h +3 -2
  65. data/ext/oj/val_stack.c +60 -49
  66. data/ext/oj/val_stack.h +79 -85
  67. data/ext/oj/validate.c +46 -0
  68. data/ext/oj/wab.c +307 -350
  69. data/lib/oj/active_support_helper.rb +1 -3
  70. data/lib/oj/bag.rb +8 -1
  71. data/lib/oj/easy_hash.rb +9 -9
  72. data/lib/oj/error.rb +1 -2
  73. data/lib/oj/json.rb +162 -150
  74. data/lib/oj/mimic.rb +9 -19
  75. data/lib/oj/saj.rb +20 -6
  76. data/lib/oj/schandler.rb +5 -4
  77. data/lib/oj/state.rb +12 -8
  78. data/lib/oj/version.rb +1 -2
  79. data/lib/oj.rb +2 -0
  80. data/pages/Compatibility.md +1 -1
  81. data/pages/InstallOptions.md +20 -0
  82. data/pages/JsonGem.md +15 -0
  83. data/pages/Modes.md +8 -3
  84. data/pages/Options.md +43 -5
  85. data/pages/Parser.md +309 -0
  86. data/pages/Rails.md +14 -2
  87. data/test/_test_active.rb +8 -9
  88. data/test/_test_active_mimic.rb +7 -8
  89. data/test/_test_mimic_rails.rb +17 -20
  90. data/test/activerecord/result_test.rb +12 -8
  91. data/test/activesupport6/encoding_test.rb +63 -28
  92. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  93. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  94. data/test/{activesupport5 → activesupport7}/encoding_test.rb +86 -50
  95. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  96. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  97. data/test/files.rb +15 -15
  98. data/test/foo.rb +17 -43
  99. data/test/helper.rb +16 -3
  100. data/test/isolated/shared.rb +3 -2
  101. data/test/json_gem/json_addition_test.rb +2 -2
  102. data/test/json_gem/json_common_interface_test.rb +8 -6
  103. data/test/json_gem/json_encoding_test.rb +0 -0
  104. data/test/json_gem/json_ext_parser_test.rb +1 -0
  105. data/test/json_gem/json_fixtures_test.rb +3 -2
  106. data/test/json_gem/json_generator_test.rb +71 -41
  107. data/test/json_gem/json_generic_object_test.rb +11 -11
  108. data/test/json_gem/json_parser_test.rb +54 -47
  109. data/test/json_gem/json_string_matching_test.rb +9 -9
  110. data/test/json_gem/test_helper.rb +12 -0
  111. data/test/mem.rb +34 -0
  112. data/test/perf.rb +22 -27
  113. data/test/perf_compat.rb +31 -33
  114. data/test/perf_dump.rb +50 -0
  115. data/test/perf_fast.rb +80 -82
  116. data/test/perf_file.rb +27 -29
  117. data/test/perf_object.rb +65 -69
  118. data/test/perf_once.rb +59 -0
  119. data/test/perf_parser.rb +183 -0
  120. data/test/perf_saj.rb +46 -54
  121. data/test/perf_scp.rb +58 -69
  122. data/test/perf_simple.rb +41 -39
  123. data/test/perf_strict.rb +74 -82
  124. data/test/perf_wab.rb +67 -69
  125. data/test/prec.rb +5 -5
  126. data/test/sample/change.rb +0 -1
  127. data/test/sample/dir.rb +0 -1
  128. data/test/sample/doc.rb +0 -1
  129. data/test/sample/file.rb +0 -1
  130. data/test/sample/group.rb +0 -1
  131. data/test/sample/hasprops.rb +0 -1
  132. data/test/sample/layer.rb +0 -1
  133. data/test/sample/rect.rb +0 -1
  134. data/test/sample/shape.rb +0 -1
  135. data/test/sample/text.rb +0 -1
  136. data/test/sample.rb +16 -16
  137. data/test/sample_json.rb +8 -8
  138. data/test/test_compat.rb +97 -45
  139. data/test/test_custom.rb +73 -51
  140. data/test/test_debian.rb +7 -10
  141. data/test/test_fast.rb +135 -79
  142. data/test/test_file.rb +41 -30
  143. data/test/test_gc.rb +16 -5
  144. data/test/test_generate.rb +21 -0
  145. data/test/test_hash.rb +15 -5
  146. data/test/test_integer_range.rb +9 -9
  147. data/test/test_null.rb +20 -20
  148. data/test/test_object.rb +99 -96
  149. data/test/test_parser.rb +11 -0
  150. data/test/test_parser_debug.rb +27 -0
  151. data/test/test_parser_saj.rb +337 -0
  152. data/test/test_parser_usual.rb +251 -0
  153. data/test/test_rails.rb +2 -2
  154. data/test/test_saj.rb +10 -8
  155. data/test/test_scp.rb +38 -40
  156. data/test/test_strict.rb +40 -32
  157. data/test/test_various.rb +165 -84
  158. data/test/test_wab.rb +48 -44
  159. data/test/test_writer.rb +47 -47
  160. data/test/tests.rb +13 -5
  161. data/test/tests_mimic.rb +12 -3
  162. data/test/tests_mimic_addition.rb +12 -3
  163. metadata +75 -127
  164. data/ext/oj/hash.c +0 -135
  165. data/ext/oj/hash.h +0 -18
  166. data/ext/oj/hash_test.c +0 -484
  167. data/test/activesupport4/decoding_test.rb +0 -108
  168. data/test/activesupport4/encoding_test.rb +0 -531
  169. data/test/activesupport4/test_helper.rb +0 -41
  170. data/test/activesupport5/test_helper.rb +0 -72
  171. data/test/bar.rb +0 -35
  172. data/test/baz.rb +0 -16
  173. data/test/zoo.rb +0 -13
data/ext/oj/code.c CHANGED
@@ -1,232 +1,214 @@
1
1
  // Copyright (c) 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 "code.h"
5
+
4
6
  #include "dump.h"
5
7
 
6
- inline static VALUE
7
- resolve_classname(VALUE mod, const char *classname) {
8
- VALUE clas = Qundef;
9
- ID ci = rb_intern(classname);
8
+ inline static VALUE resolve_classname(VALUE mod, const char *classname) {
9
+ VALUE clas = Qundef;
10
+ ID ci = rb_intern(classname);
10
11
 
11
12
  if (rb_const_defined_at(mod, ci)) {
12
- clas = rb_const_get_at(mod, ci);
13
+ clas = rb_const_get_at(mod, ci);
13
14
  }
14
15
  return clas;
15
16
  }
16
17
 
17
- static VALUE
18
- path2class(const char *name) {
19
- char class_name[1024];
20
- VALUE clas;
21
- char *end = class_name + sizeof(class_name) - 1;
22
- char *s;
23
- const char *n = name;
18
+ static VALUE path2class(const char *name) {
19
+ char class_name[1024];
20
+ VALUE clas;
21
+ char *end = class_name + sizeof(class_name) - 1;
22
+ char *s;
23
+ const char *n = name;
24
24
 
25
25
  clas = rb_cObject;
26
26
  for (s = class_name; '\0' != *n; n++) {
27
- if (':' == *n) {
28
- *s = '\0';
29
- n++;
30
- if (':' != *n) {
31
- return Qundef;
32
- }
33
- if (Qundef == (clas = resolve_classname(clas, class_name))) {
34
- return Qundef;
35
- }
36
- s = class_name;
37
- } else if (end <= s) {
38
- return Qundef;
39
- } else {
40
- *s++ = *n;
41
- }
27
+ if (':' == *n) {
28
+ *s = '\0';
29
+ n++;
30
+ if (':' != *n) {
31
+ return Qundef;
32
+ }
33
+ if (Qundef == (clas = resolve_classname(clas, class_name))) {
34
+ return Qundef;
35
+ }
36
+ s = class_name;
37
+ } else if (end <= s) {
38
+ return Qundef;
39
+ } else {
40
+ *s++ = *n;
41
+ }
42
42
  }
43
43
  *s = '\0';
44
44
 
45
45
  return resolve_classname(clas, class_name);
46
46
  }
47
47
 
48
- bool
49
- oj_code_dump(Code codes, VALUE obj, int depth, Out out) {
50
- VALUE clas = rb_obj_class(obj);
51
- Code c = codes;
48
+ bool oj_code_dump(Code codes, VALUE obj, int depth, Out out) {
49
+ VALUE clas = rb_obj_class(obj);
50
+ Code c = codes;
52
51
 
53
52
  for (; NULL != c->name; c++) {
54
- if (Qundef == c->clas) { // indicates not defined
55
- continue;
56
- }
57
- if (Qnil == c->clas) {
58
- c->clas = path2class(c->name);
59
- }
60
- if (clas == c->clas && c->active) {
61
- c->encode(obj, depth, out);
62
- return true;
63
- }
53
+ if (Qundef == c->clas) { // indicates not defined
54
+ continue;
55
+ }
56
+ if (Qnil == c->clas) {
57
+ c->clas = path2class(c->name);
58
+ }
59
+ if (clas == c->clas && c->active) {
60
+ c->encode(obj, depth, out);
61
+ return true;
62
+ }
64
63
  }
65
64
  return false;
66
65
  }
67
66
 
68
67
  VALUE
69
68
  oj_code_load(Code codes, VALUE clas, VALUE args) {
70
- Code c = codes;
69
+ Code c = codes;
71
70
 
72
71
  for (; NULL != c->name; c++) {
73
- if (Qundef == c->clas) { // indicates not defined
74
- continue;
75
- }
76
- if (Qnil == c->clas) {
77
- c->clas = path2class(c->name);
78
- }
79
- if (clas == c->clas) {
80
- if (NULL == c->decode) {
81
- break;
82
- }
83
- return c->decode(clas, args);
84
- }
72
+ if (Qundef == c->clas) { // indicates not defined
73
+ continue;
74
+ }
75
+ if (Qnil == c->clas) {
76
+ c->clas = path2class(c->name);
77
+ }
78
+ if (clas == c->clas) {
79
+ if (NULL == c->decode) {
80
+ break;
81
+ }
82
+ return c->decode(clas, args);
83
+ }
85
84
  }
86
85
  return Qnil;
87
86
  }
88
87
 
89
- void
90
- oj_code_set_active(Code codes, VALUE clas, bool active) {
91
- Code c = codes;
88
+ void oj_code_set_active(Code codes, VALUE clas, bool active) {
89
+ Code c = codes;
92
90
 
93
91
  for (; NULL != c->name; c++) {
94
- if (Qundef == c->clas) { // indicates not defined
95
- continue;
96
- }
97
- if (Qnil == c->clas) {
98
- c->clas = path2class(c->name);
99
- }
100
- if (clas == c->clas || Qnil == clas) {
101
- c->active = active;
102
- if (Qnil != clas) {
103
- break;
104
- }
105
- }
92
+ if (Qundef == c->clas) { // indicates not defined
93
+ continue;
94
+ }
95
+ if (Qnil == c->clas) {
96
+ c->clas = path2class(c->name);
97
+ }
98
+ if (clas == c->clas || Qnil == clas) {
99
+ c->active = active;
100
+ if (Qnil != clas) {
101
+ break;
102
+ }
103
+ }
106
104
  }
107
105
  }
108
106
 
109
- bool
110
- oj_code_has(Code codes, VALUE clas, bool encode) {
111
- Code c = codes;
107
+ bool oj_code_has(Code codes, VALUE clas, bool encode) {
108
+ Code c = codes;
112
109
 
113
110
  for (; NULL != c->name; c++) {
114
- if (Qundef == c->clas) { // indicates not defined
115
- continue;
116
- }
117
- if (Qnil == c->clas) {
118
- c->clas = path2class(c->name);
119
- }
120
- if (clas == c->clas) {
121
- if (encode) {
122
- return c->active && NULL != c->encode;
123
- } else {
124
- return c->active && NULL != c->decode;
125
- }
126
- }
111
+ if (Qundef == c->clas) { // indicates not defined
112
+ continue;
113
+ }
114
+ if (Qnil == c->clas) {
115
+ c->clas = path2class(c->name);
116
+ }
117
+ if (clas == c->clas) {
118
+ if (encode) {
119
+ return c->active && NULL != c->encode;
120
+ } else {
121
+ return c->active && NULL != c->decode;
122
+ }
123
+ }
127
124
  }
128
125
  return false;
129
126
  }
130
127
 
131
- void
132
- oj_code_attrs(VALUE obj, Attr attrs, int depth, Out out, bool with_class) {
133
- int d2 = depth + 1;
134
- int d3 = d2 + 1;
135
- size_t sep_len = out->opts->dump_opts.before_size + out->opts->dump_opts.after_size + 2;
136
- const char *classname = rb_obj_classname(obj);
137
- size_t len = strlen(classname);
138
- size_t size = d2 * out->indent + 10 + len + out->opts->create_id_len + sep_len;
139
- bool no_comma = true;
128
+ void oj_code_attrs(VALUE obj, Attr attrs, int depth, Out out, bool with_class) {
129
+ int d2 = depth + 1;
130
+ int d3 = d2 + 1;
131
+ size_t sep_len = out->opts->dump_opts.before_size + out->opts->dump_opts.after_size + 2;
132
+ const char *classname = rb_obj_classname(obj);
133
+ size_t len = strlen(classname);
134
+ size_t size = d2 * out->indent + 10 + len + out->opts->create_id_len + sep_len;
135
+ bool no_comma = true;
140
136
 
141
137
  assure_size(out, size);
142
138
  *out->cur++ = '{';
143
139
 
144
140
  if (with_class) {
145
- fill_indent(out, d2);
146
- *out->cur++ = '"';
147
- memcpy(out->cur, out->opts->create_id, out->opts->create_id_len);
148
- out->cur += out->opts->create_id_len;
149
- *out->cur++ = '"';
150
- if (0 < out->opts->dump_opts.before_size) {
151
- strcpy(out->cur, out->opts->dump_opts.before_sep);
152
- out->cur += out->opts->dump_opts.before_size;
153
- }
154
- *out->cur++ = ':';
155
- if (0 < out->opts->dump_opts.after_size) {
156
- strcpy(out->cur, out->opts->dump_opts.after_sep);
157
- out->cur += out->opts->dump_opts.after_size;
158
- }
159
- *out->cur++ = '"';
160
- memcpy(out->cur, classname, len);
161
- out->cur += len;
162
- *out->cur++ = '"';
163
- no_comma = false;
141
+ fill_indent(out, d2);
142
+ *out->cur++ = '"';
143
+ APPEND_CHARS(out->cur, out->opts->create_id, out->opts->create_id_len);
144
+ *out->cur++ = '"';
145
+ if (0 < out->opts->dump_opts.before_size) {
146
+ APPEND_CHARS(out->cur, out->opts->dump_opts.before_sep, out->opts->dump_opts.before_size);
147
+ }
148
+ *out->cur++ = ':';
149
+ if (0 < out->opts->dump_opts.after_size) {
150
+ APPEND_CHARS(out->cur, out->opts->dump_opts.after_sep, out->opts->dump_opts.after_size);
151
+ }
152
+ *out->cur++ = '"';
153
+ APPEND_CHARS(out->cur, classname, len);
154
+ *out->cur++ = '"';
155
+ no_comma = false;
164
156
  }
165
157
  size = d3 * out->indent + 2;
166
158
  for (; NULL != attrs->name; attrs++) {
167
- assure_size(out, size + attrs->len + sep_len + 2);
168
- if (no_comma) {
169
- no_comma = false;
170
- } else {
171
- *out->cur++ = ',';
172
- }
173
- fill_indent(out, d2);
174
- *out->cur++ = '"';
175
- memcpy(out->cur, attrs->name, attrs->len);
176
- out->cur += attrs->len;
177
- *out->cur++ = '"';
178
- if (0 < out->opts->dump_opts.before_size) {
179
- strcpy(out->cur, out->opts->dump_opts.before_sep);
180
- out->cur += out->opts->dump_opts.before_size;
181
- }
182
- *out->cur++ = ':';
183
- if (0 < out->opts->dump_opts.after_size) {
184
- strcpy(out->cur, out->opts->dump_opts.after_sep);
185
- out->cur += out->opts->dump_opts.after_size;
186
- }
187
- if (Qundef == attrs->value) {
188
- if (Qundef != attrs->time) {
189
- switch (out->opts->time_format) {
190
- case RubyTime: oj_dump_ruby_time(attrs->time, out); break;
191
- case XmlTime: oj_dump_xml_time(attrs->time, out); break;
192
- case UnixZTime: oj_dump_time(attrs->time, out, true); break;
193
- case UnixTime:
194
- default: oj_dump_time(attrs->time, out, false); break;
195
- }
196
- } else {
197
- char buf[32];
198
- char *b = buf + sizeof(buf) - 1;
199
- int neg = 0;
200
- long num = attrs->num;
201
-
202
- if (0 > num) {
203
- neg = 1;
204
- num = -num;
205
- }
206
- *b-- = '\0';
207
- if (0 < num) {
208
- for (; 0 < num; num /= 10, b--) {
209
- *b = (num % 10) + '0';
210
- }
211
- if (neg) {
212
- *b = '-';
213
- } else {
214
- b++;
215
- }
216
- } else {
217
- *b = '0';
218
- }
219
- assure_size(out, (sizeof(buf) - (b - buf)));
220
- for (; '\0' != *b; b++) {
221
- *out->cur++ = *b;
222
- }
223
- }
224
- } else {
225
- oj_dump_compat_val(attrs->value, d3, out, true);
226
- }
159
+ assure_size(out, size + attrs->len + sep_len + 2);
160
+ if (no_comma) {
161
+ no_comma = false;
162
+ } else {
163
+ *out->cur++ = ',';
164
+ }
165
+ fill_indent(out, d2);
166
+ *out->cur++ = '"';
167
+ APPEND_CHARS(out->cur, attrs->name, attrs->len);
168
+ *out->cur++ = '"';
169
+ if (0 < out->opts->dump_opts.before_size) {
170
+ APPEND_CHARS(out->cur, out->opts->dump_opts.before_sep, out->opts->dump_opts.before_size);
171
+ }
172
+ *out->cur++ = ':';
173
+ if (0 < out->opts->dump_opts.after_size) {
174
+ APPEND_CHARS(out->cur, out->opts->dump_opts.after_sep, out->opts->dump_opts.after_size);
175
+ }
176
+ if (Qundef == attrs->value) {
177
+ if (Qundef != attrs->time) {
178
+ switch (out->opts->time_format) {
179
+ case RubyTime: oj_dump_ruby_time(attrs->time, out); break;
180
+ case XmlTime: oj_dump_xml_time(attrs->time, out); break;
181
+ case UnixZTime: oj_dump_time(attrs->time, out, true); break;
182
+ case UnixTime:
183
+ default: oj_dump_time(attrs->time, out, false); break;
184
+ }
185
+ } else {
186
+ char buf[32];
187
+ char *b = buf + sizeof(buf) - 1;
188
+ bool neg = false;
189
+ long num = attrs->num;
190
+ size_t cnt = 0;
191
+
192
+ if (0 > num) {
193
+ neg = true;
194
+ num = -num;
195
+ }
196
+ *b-- = '\0';
197
+ if (0 < num) {
198
+ b = oj_longlong_to_string(num, neg, b);
199
+ } else {
200
+ *b = '0';
201
+ }
202
+ cnt = sizeof(buf) - (b - buf) - 1;
203
+ assure_size(out, cnt);
204
+ APPEND_CHARS(out->cur, b, cnt);
205
+ }
206
+ } else {
207
+ oj_dump_compat_val(attrs->value, d3, out, true);
208
+ }
227
209
  }
228
210
  assure_size(out, depth * out->indent + 2);
229
211
  fill_indent(out, depth);
230
212
  *out->cur++ = '}';
231
- *out->cur = '\0';
213
+ *out->cur = '\0';
232
214
  }
data/ext/oj/code.h CHANGED
@@ -1,4 +1,5 @@
1
1
  // Copyright (c) 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
  #ifndef OJ_CODE_H
4
5
  #define OJ_CODE_H
@@ -7,33 +8,33 @@
7
8
 
8
9
  #include "oj.h"
9
10
 
10
- typedef void (*EncodeFunc)(VALUE obj, int depth, Out out);
11
- typedef VALUE (*DecodeFunc)(VALUE clas, VALUE args);
11
+ typedef void (*EncodeFunc)(VALUE obj, int depth, Out out);
12
+ typedef VALUE (*DecodeFunc)(VALUE clas, VALUE args);
12
13
 
13
14
  typedef struct _code {
14
- const char *name;
15
- VALUE clas;
16
- EncodeFunc encode;
17
- DecodeFunc decode;
18
- bool active; // For compat mode.
15
+ const char *name;
16
+ VALUE clas;
17
+ EncodeFunc encode;
18
+ DecodeFunc decode;
19
+ bool active; // For compat mode.
19
20
  } *Code;
20
21
 
21
22
  // Used by encode functions.
22
23
  typedef struct _attr {
23
- const char *name;
24
- int len;
25
- VALUE value;
26
- long num;
27
- VALUE time;
24
+ const char *name;
25
+ int len;
26
+ VALUE value;
27
+ long num;
28
+ VALUE time;
28
29
  } *Attr;
29
30
 
30
- extern bool oj_code_dump(Code codes, VALUE obj, int depth, Out out);
31
- extern VALUE oj_code_load(Code codes, VALUE clas, VALUE args);
32
- extern void oj_code_set_active(Code codes, VALUE clas, bool active);
33
- extern bool oj_code_has(Code codes, VALUE clas, bool encode);
31
+ extern bool oj_code_dump(Code codes, VALUE obj, int depth, Out out);
32
+ extern VALUE oj_code_load(Code codes, VALUE clas, VALUE args);
33
+ extern void oj_code_set_active(Code codes, VALUE clas, bool active);
34
+ extern bool oj_code_has(Code codes, VALUE clas, bool encode);
34
35
 
35
- extern void oj_code_attrs(VALUE obj, Attr attrs, int depth, Out out, bool with_class);
36
+ extern void oj_code_attrs(VALUE obj, Attr attrs, int depth, Out out, bool with_class);
36
37
 
37
- extern struct _code oj_compat_codes[];
38
+ extern struct _code oj_compat_codes[];
38
39
 
39
40
  #endif /* OJ_CODE_H */