oj 2.18.5 → 3.0.0

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 (111) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +33 -226
  3. data/ext/oj/circarray.c +0 -25
  4. data/ext/oj/circarray.h +0 -25
  5. data/ext/oj/code.c +227 -0
  6. data/ext/oj/code.h +40 -0
  7. data/ext/oj/compat.c +126 -38
  8. data/ext/oj/custom.c +1097 -0
  9. data/ext/oj/dump.c +658 -2376
  10. data/ext/oj/dump.h +92 -0
  11. data/ext/oj/dump_compat.c +937 -0
  12. data/ext/oj/dump_leaf.c +254 -0
  13. data/ext/oj/dump_object.c +810 -0
  14. data/ext/oj/dump_rails.c +329 -0
  15. data/ext/oj/dump_strict.c +416 -0
  16. data/ext/oj/err.c +0 -25
  17. data/ext/oj/err.h +8 -2
  18. data/ext/oj/fast.c +24 -24
  19. data/ext/oj/mimic_json.c +817 -0
  20. data/ext/oj/mimic_rails.c +806 -0
  21. data/ext/oj/mimic_rails.h +17 -0
  22. data/ext/oj/object.c +18 -72
  23. data/ext/oj/odd.c +0 -25
  24. data/ext/oj/odd.h +2 -27
  25. data/ext/oj/oj.c +655 -1503
  26. data/ext/oj/oj.h +93 -40
  27. data/ext/oj/parse.c +99 -46
  28. data/ext/oj/parse.h +12 -26
  29. data/ext/oj/reader.c +1 -25
  30. data/ext/oj/reader.h +3 -25
  31. data/ext/oj/resolve.c +9 -11
  32. data/ext/oj/resolve.h +2 -2
  33. data/ext/oj/rxclass.c +133 -0
  34. data/ext/oj/rxclass.h +27 -0
  35. data/ext/oj/saj.c +4 -25
  36. data/ext/oj/scp.c +3 -25
  37. data/ext/oj/sparse.c +89 -13
  38. data/ext/oj/stream_writer.c +301 -0
  39. data/ext/oj/strict.c +4 -27
  40. data/ext/oj/string_writer.c +480 -0
  41. data/ext/oj/val_stack.h +6 -2
  42. data/lib/oj.rb +1 -23
  43. data/lib/oj/easy_hash.rb +12 -4
  44. data/lib/oj/json.rb +172 -0
  45. data/lib/oj/mimic.rb +123 -18
  46. data/lib/oj/state.rb +131 -0
  47. data/lib/oj/version.rb +1 -1
  48. data/pages/Advanced.md +22 -0
  49. data/pages/Compatibility.md +25 -0
  50. data/pages/Custom.md +23 -0
  51. data/pages/Encoding.md +65 -0
  52. data/pages/JsonGem.md +79 -0
  53. data/pages/Modes.md +140 -0
  54. data/pages/Options.md +250 -0
  55. data/pages/Rails.md +60 -0
  56. data/pages/Security.md +20 -0
  57. data/test/activesupport4/decoding_test.rb +105 -0
  58. data/test/activesupport4/encoding_test.rb +531 -0
  59. data/test/activesupport4/test_helper.rb +41 -0
  60. data/test/activesupport5/decoding_test.rb +125 -0
  61. data/test/activesupport5/encoding_test.rb +483 -0
  62. data/test/activesupport5/encoding_test_cases.rb +90 -0
  63. data/test/activesupport5/test_helper.rb +50 -0
  64. data/test/activesupport5/time_zone_test_helpers.rb +24 -0
  65. data/test/json_gem/json_addition_test.rb +216 -0
  66. data/test/json_gem/json_common_interface_test.rb +143 -0
  67. data/test/json_gem/json_encoding_test.rb +109 -0
  68. data/test/json_gem/json_ext_parser_test.rb +20 -0
  69. data/test/json_gem/json_fixtures_test.rb +35 -0
  70. data/test/json_gem/json_generator_test.rb +383 -0
  71. data/test/json_gem/json_generic_object_test.rb +90 -0
  72. data/test/json_gem/json_parser_test.rb +470 -0
  73. data/test/json_gem/json_string_matching_test.rb +42 -0
  74. data/test/json_gem/test_helper.rb +18 -0
  75. data/test/perf_compat.rb +30 -28
  76. data/test/perf_object.rb +1 -1
  77. data/test/perf_strict.rb +18 -1
  78. data/test/sample.rb +0 -1
  79. data/test/test_compat.rb +169 -93
  80. data/test/test_custom.rb +355 -0
  81. data/test/test_file.rb +0 -8
  82. data/test/test_null.rb +376 -0
  83. data/test/test_object.rb +268 -3
  84. data/test/test_scp.rb +22 -1
  85. data/test/test_strict.rb +160 -4
  86. data/test/test_various.rb +52 -620
  87. data/test/tests.rb +14 -0
  88. data/test/tests_mimic.rb +14 -0
  89. data/test/tests_mimic_addition.rb +7 -0
  90. metadata +89 -47
  91. data/test/activesupport_datetime_test.rb +0 -23
  92. data/test/bug.rb +0 -51
  93. data/test/bug2.rb +0 -10
  94. data/test/bug3.rb +0 -46
  95. data/test/bug_fast.rb +0 -32
  96. data/test/bug_load.rb +0 -24
  97. data/test/crash.rb +0 -111
  98. data/test/curl/curl_oj.rb +0 -46
  99. data/test/curl/get_oj.rb +0 -24
  100. data/test/curl/just_curl.rb +0 -31
  101. data/test/curl/just_oj.rb +0 -51
  102. data/test/example.rb +0 -11
  103. data/test/foo.rb +0 -24
  104. data/test/io.rb +0 -48
  105. data/test/isolated/test_mimic_rails_datetime.rb +0 -27
  106. data/test/mod.rb +0 -16
  107. data/test/rails.rb +0 -50
  108. data/test/russian.rb +0 -18
  109. data/test/struct.rb +0 -29
  110. data/test/test_serializer.rb +0 -59
  111. data/test/write_timebars.rb +0 -31
@@ -1,31 +1,6 @@
1
1
  /* parse.h
2
2
  * Copyright (c) 2011, Peter Ohler
3
3
  * All rights reserved.
4
- *
5
- * Redistribution and use in source and binary forms, with or without
6
- * modification, are permitted provided that the following conditions are met:
7
- *
8
- * - Redistributions of source code must retain the above copyright notice, this
9
- * list of conditions and the following disclaimer.
10
- *
11
- * - Redistributions in binary form must reproduce the above copyright notice,
12
- * this list of conditions and the following disclaimer in the documentation
13
- * and/or other materials provided with the distribution.
14
- *
15
- * - Neither the name of Peter Ohler nor the names of its contributors may be
16
- * used to endorse or promote products derived from this software without
17
- * specific prior written permission.
18
- *
19
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
4
  */
30
5
 
31
6
  #ifndef __OJ_PARSE_H__
@@ -33,12 +8,16 @@
33
8
 
34
9
  #include <stdarg.h>
35
10
  #include <stdio.h>
11
+ #include <string.h>
36
12
 
37
13
  #include "ruby.h"
38
14
  #include "oj.h"
39
15
  #include "val_stack.h"
40
16
  #include "circarray.h"
41
17
  #include "reader.h"
18
+ #include "rxclass.h"
19
+
20
+ struct _RxClass;
42
21
 
43
22
  typedef struct _NumInfo {
44
23
  int64_t i;
@@ -48,7 +27,6 @@ typedef struct _NumInfo {
48
27
  const char *str;
49
28
  size_t len;
50
29
  long exp;
51
- //int dec_cnt;
52
30
  int big;
53
31
  int infinity;
54
32
  int nan;
@@ -70,7 +48,9 @@ typedef struct _ParseInfo {
70
48
  VALUE handler;
71
49
  struct _ValStack stack;
72
50
  CircArray circ_array;
51
+ struct _RxClass str_rx;
73
52
  int expect_value;
53
+ int max_depth; // just for the json gem
74
54
  VALUE proc;
75
55
  VALUE (*start_hash)(struct _ParseInfo *pi);
76
56
  void (*end_hash)(struct _ParseInfo *pi);
@@ -89,6 +69,7 @@ typedef struct _ParseInfo {
89
69
  void (*add_num)(struct _ParseInfo *pi, NumInfo ni);
90
70
  void (*add_value)(struct _ParseInfo *pi, VALUE val);
91
71
  VALUE err_class;
72
+ bool has_callbacks;
92
73
  } *ParseInfo;
93
74
 
94
75
  extern void oj_parse2(ParseInfo pi);
@@ -103,4 +84,9 @@ extern void oj_set_compat_callbacks(ParseInfo pi);
103
84
  extern void oj_sparse2(ParseInfo pi);
104
85
  extern VALUE oj_pi_sparse(int argc, VALUE *argv, ParseInfo pi, int fd);
105
86
 
87
+ static inline void
88
+ parse_info_init(ParseInfo pi) {
89
+ memset(pi, 0, sizeof(struct _ParseInfo));
90
+ }
91
+
106
92
  #endif /* __OJ_PARSE_H__ */
@@ -1,31 +1,6 @@
1
1
  /* reader.c
2
2
  * Copyright (c) 2011, Peter Ohler
3
3
  * All rights reserved.
4
- *
5
- * Redistribution and use in source and binary forms, with or without
6
- * modification, are permitted provided that the following conditions are met:
7
- *
8
- * - Redistributions of source code must retain the above copyright notice, this
9
- * list of conditions and the following disclaimer.
10
- *
11
- * - Redistributions in binary form must reproduce the above copyright notice,
12
- * this list of conditions and the following disclaimer in the documentation
13
- * and/or other materials provided with the distribution.
14
- *
15
- * - Neither the name of Peter Ohler nor the names of its contributors may be
16
- * used to endorse or promote products derived from this software without
17
- * specific prior written permission.
18
- *
19
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
4
  */
30
5
 
31
6
  #include <stdlib.h>
@@ -66,6 +41,7 @@ oj_reader_init(Reader reader, VALUE io, int fd) {
66
41
  reader->read_end = reader->head;
67
42
  reader->pro = 0;
68
43
  reader->str = 0;
44
+ reader->pos = 0;
69
45
  reader->line = 1;
70
46
  reader->col = 0;
71
47
  reader->free_head = 0;
@@ -1,31 +1,6 @@
1
1
  /* reader.h
2
2
  * Copyright (c) 2011, Peter Ohler
3
3
  * All rights reserved.
4
- *
5
- * Redistribution and use in source and binary forms, with or without
6
- * modification, are permitted provided that the following conditions are met:
7
- *
8
- * - Redistributions of source code must retain the above copyright notice, this
9
- * list of conditions and the following disclaimer.
10
- *
11
- * - Redistributions in binary form must reproduce the above copyright notice,
12
- * this list of conditions and the following disclaimer in the documentation
13
- * and/or other materials provided with the distribution.
14
- *
15
- * - Neither the name of Peter Ohler nor the names of its contributors may be
16
- * used to endorse or promote products derived from this software without
17
- * specific prior written permission.
18
- *
19
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
4
  */
30
5
 
31
6
  #ifndef __OJ_READER_H__
@@ -39,6 +14,7 @@ typedef struct _Reader {
39
14
  char *read_end; /* one past last character read */
40
15
  char *pro; /* protection start, buffer can not slide past this point */
41
16
  char *str; /* start of current string being read */
17
+ long pos;
42
18
  int line;
43
19
  int col;
44
20
  int free_head;
@@ -66,6 +42,7 @@ reader_get(Reader reader) {
66
42
  reader->col = 0;
67
43
  }
68
44
  reader->col++;
45
+ reader->pos++;
69
46
 
70
47
  return *reader->tail++;
71
48
  }
@@ -74,6 +51,7 @@ static inline void
74
51
  reader_backup(Reader reader) {
75
52
  reader->tail--;
76
53
  reader->col--;
54
+ reader->pos--;
77
55
  if (0 >= reader->col) {
78
56
  reader->line--;
79
57
  // allow col to be negative since we never backup twice in a row
@@ -56,7 +56,7 @@ resolve_classname(VALUE mod, const char *classname, int auto_define) {
56
56
  }
57
57
 
58
58
  static VALUE
59
- resolve_classpath(ParseInfo pi, const char *name, size_t len, int auto_define) {
59
+ resolve_classpath(ParseInfo pi, const char *name, size_t len, int auto_define, VALUE error_class) {
60
60
  char class_name[1024];
61
61
  VALUE clas;
62
62
  char *end = class_name + sizeof(class_name) - 1;
@@ -84,23 +84,21 @@ resolve_classpath(ParseInfo pi, const char *name, size_t len, int auto_define) {
84
84
  }
85
85
  *s = '\0';
86
86
  if (Qundef == (clas = resolve_classname(clas, class_name, auto_define))) {
87
- if (sizeof(class_name) - 1 < len) {
88
- len = sizeof(class_name) - 1;
87
+ oj_set_error_at(pi, error_class, __FILE__, __LINE__, "class %s is not defined", name);
88
+ if (Qnil != error_class) {
89
+ pi->err_class = error_class;
89
90
  }
90
- memcpy(class_name, name, len);
91
- class_name[len] = '\0';
92
- oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "class %s is not defined", class_name);
93
91
  }
94
92
  return clas;
95
93
  }
96
94
 
97
95
  VALUE
98
- oj_name2class(ParseInfo pi, const char *name, size_t len, int auto_define) {
96
+ oj_name2class(ParseInfo pi, const char *name, size_t len, int auto_define, VALUE error_class) {
99
97
  VALUE clas;
100
98
  VALUE *slot;
101
99
 
102
100
  if (No == pi->options.class_cache) {
103
- return resolve_classpath(pi, name, len, auto_define);
101
+ return resolve_classpath(pi, name, len, auto_define, error_class);
104
102
  }
105
103
  #if USE_PTHREAD_MUTEX
106
104
  pthread_mutex_lock(&oj_cache_mutex);
@@ -108,7 +106,7 @@ oj_name2class(ParseInfo pi, const char *name, size_t len, int auto_define) {
108
106
  rb_mutex_lock(oj_cache_mutex);
109
107
  #endif
110
108
  if (Qnil == (clas = oj_class_hash_get(name, len, &slot))) {
111
- if (Qundef != (clas = resolve_classpath(pi, name, len, auto_define))) {
109
+ if (Qundef != (clas = resolve_classpath(pi, name, len, auto_define, error_class))) {
112
110
  *slot = clas;
113
111
  }
114
112
  }
@@ -121,9 +119,9 @@ oj_name2class(ParseInfo pi, const char *name, size_t len, int auto_define) {
121
119
  }
122
120
 
123
121
  VALUE
124
- oj_name2struct(ParseInfo pi, VALUE nameVal) {
122
+ oj_name2struct(ParseInfo pi, VALUE nameVal, VALUE error_class) {
125
123
  size_t len = RSTRING_LEN(nameVal);
126
124
  const char *str = StringValuePtr(nameVal);
127
125
 
128
- return resolve_classpath(pi, str, len, 0);
126
+ return resolve_classpath(pi, str, len, 0, error_class);
129
127
  }
@@ -33,7 +33,7 @@
33
33
 
34
34
  #include "ruby.h"
35
35
 
36
- extern VALUE oj_name2class(ParseInfo pi, const char *name, size_t len, int auto_define);
37
- extern VALUE oj_name2struct(ParseInfo pi, VALUE nameVal);
36
+ extern VALUE oj_name2class(ParseInfo pi, const char *name, size_t len, int auto_define, VALUE error_class);
37
+ extern VALUE oj_name2struct(ParseInfo pi, VALUE nameVal, VALUE error_class);
38
38
 
39
39
  #endif /* __OJ_RESOLVE_H__ */
@@ -0,0 +1,133 @@
1
+ /* rxclass.c
2
+ * Copyright (c) 2017, Peter Ohler
3
+ * All rights reserved.
4
+ */
5
+
6
+ #include <sys/types.h>
7
+ #include <stdlib.h>
8
+ #include <errno.h>
9
+ #include <regex.h>
10
+ #include <string.h>
11
+ #include <stdio.h>
12
+
13
+ #include "rxclass.h"
14
+
15
+ typedef struct _RxC {
16
+ struct _RxC *next;
17
+ VALUE rrx;
18
+ regex_t rx;
19
+ VALUE clas;
20
+ char src[256];
21
+ } *RxC;
22
+
23
+ void
24
+ oj_rxclass_init(RxClass rc) {
25
+ *rc->err = '\0';
26
+ rc->head = NULL;
27
+ rc->tail = NULL;
28
+ }
29
+
30
+ void
31
+ oj_rxclass_cleanup(RxClass rc) {
32
+ RxC rxc;
33
+
34
+ while (NULL != (rxc = rc->head)) {
35
+ rc->head = rc->head->next;
36
+ if (Qnil == rxc->rrx) {
37
+ regfree(&rxc->rx);
38
+ }
39
+ xfree(rxc);
40
+ }
41
+ }
42
+
43
+ void
44
+ oj_rxclass_rappend(RxClass rc, VALUE rx, VALUE clas) {
45
+ RxC rxc = ALLOC_N(struct _RxC, 1);
46
+
47
+ memset(rxc, 0, sizeof(struct _RxC));
48
+ rxc->rrx = rx;
49
+ rxc->clas = clas;
50
+ if (NULL == rc->tail) {
51
+ rc->head = rxc;
52
+ } else {
53
+ rc->tail->next = rxc;
54
+ }
55
+ rc->tail = rxc;
56
+ }
57
+
58
+ // Attempt to compile the expression. If it fails populate the error code..
59
+ int
60
+ oj_rxclass_append(RxClass rc, const char *expr, VALUE clas) {
61
+ // Use mallow and not ALLOC_N to avoid pulliing ruby.h which conflicts
62
+ // with regex_t.
63
+ RxC rxc;
64
+ int err;
65
+ int flags = 0;
66
+
67
+ if (sizeof(rxc->src) <= strlen(expr)) {
68
+ snprintf(rc->err, sizeof(rc->err), "expressions must be less than %lu chracter", sizeof(rxc->src));
69
+ return EINVAL;
70
+ }
71
+ rxc = ALLOC_N(struct _RxC, 1);
72
+ rxc->next = 0;
73
+ rxc->rrx = Qnil;
74
+ rxc->clas = clas;
75
+ if (0 != (err = regcomp(&rxc->rx, expr, flags))) {
76
+ regerror(err, &rxc->rx, rc->err, sizeof(rc->err));
77
+ free(rxc);
78
+ return err;
79
+ }
80
+ if (NULL == rc->tail) {
81
+ rc->head = rxc;
82
+ } else {
83
+ rc->tail->next = rxc;
84
+ }
85
+ rc->tail = rxc;
86
+
87
+ return 0;
88
+ }
89
+
90
+ VALUE
91
+ oj_rxclass_match(RxClass rc, const char *str, int len) {
92
+ RxC rxc;
93
+ char buf[4096];
94
+
95
+ for (rxc = rc->head; NULL != rxc; rxc = rxc->next) {
96
+ if (Qnil != rxc->rrx) {
97
+ // Must use a valiabel for this to work.
98
+ volatile VALUE rstr = rb_str_new(str, len);
99
+
100
+ //if (Qtrue == rb_funcall(rxc->rrx, rb_intern("match?"), 1, rstr)) {
101
+ if (Qnil != rb_funcall(rxc->rrx, rb_intern("match"), 1, rstr)) {
102
+ return rxc->clas;
103
+ }
104
+ } else if (len < (int)sizeof(buf)) {
105
+ // string is not \0 terminated so copy and atempt a match
106
+ memcpy(buf, str, len);
107
+ buf[len] = '\0';
108
+ if (0 == regexec(&rxc->rx, buf, 0, NULL, 0)) { // match
109
+ return rxc->clas;
110
+ }
111
+ } else {
112
+ // TBD allocate a larger buffer and attempt
113
+ }
114
+ }
115
+ return Qnil;
116
+ }
117
+
118
+ void
119
+ oj_rxclass_copy(RxClass src, RxClass dest) {
120
+ dest->head = NULL;
121
+ dest->tail = NULL;
122
+ if (NULL != src->head) {
123
+ RxC rxc;
124
+
125
+ for (rxc = src->head; NULL != rxc; rxc = rxc->next) {
126
+ if (Qnil != rxc->rrx) {
127
+ oj_rxclass_rappend(dest, rxc->rrx, rxc->clas);
128
+ } else {
129
+ oj_rxclass_append(dest, rxc->src, rxc->clas);
130
+ }
131
+ }
132
+ }
133
+ }
@@ -0,0 +1,27 @@
1
+ /* rxclass.h
2
+ * Copyright (c) 2017, Peter Ohler
3
+ * All rights reserved.
4
+ */
5
+
6
+ #ifndef __OJ_RXCLASS_H__
7
+ #define __OJ_RXCLASS_H__
8
+
9
+ #include <stdbool.h>
10
+ #include "ruby.h"
11
+
12
+ struct _RxC;
13
+
14
+ typedef struct _RxClass {
15
+ struct _RxC *head;
16
+ struct _RxC *tail;
17
+ char err[128];
18
+ } *RxClass;
19
+
20
+ extern void oj_rxclass_init(RxClass rc);
21
+ extern void oj_rxclass_cleanup(RxClass rc);
22
+ extern int oj_rxclass_append(RxClass rc, const char *expr, VALUE clas);
23
+ extern VALUE oj_rxclass_match(RxClass rc, const char *str, int len);
24
+ extern void oj_rxclass_copy(RxClass src, RxClass dest);
25
+ extern void oj_rxclass_rappend(RxClass rc, VALUE rx, VALUE clas);
26
+
27
+ #endif /* __OJ_RXCLASS_H__ */
@@ -1,31 +1,6 @@
1
1
  /* saj.c
2
2
  * Copyright (c) 2012, Peter Ohler
3
3
  * All rights reserved.
4
- *
5
- * Redistribution and use in source and binary forms, with or without
6
- * modification, are permitted provided that the following conditions are met:
7
- *
8
- * - Redistributions of source code must retain the above copyright notice, this
9
- * list of conditions and the following disclaimer.
10
- *
11
- * - Redistributions in binary form must reproduce the above copyright notice,
12
- * this list of conditions and the following disclaimer in the documentation
13
- * and/or other materials provided with the distribution.
14
- *
15
- * - Neither the name of Peter Ohler nor the names of its contributors may be
16
- * used to endorse or promote products derived from this software without
17
- * specific prior written permission.
18
- *
19
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
4
  */
30
5
 
31
6
  #if !IS_WINDOWS
@@ -682,6 +657,10 @@ saj_parse(VALUE handler, char *json) {
682
657
  * if the JSON is malformed.
683
658
  * @param [Oj::Saj] handler Saj (responds to Oj::Saj methods) like handler
684
659
  * @param [IO|String] io IO Object to read from
660
+ * @deprecated The sc_parse() method along with the ScHandler is the preferred
661
+ * callback parser. It is slightly faster and handles streams while the
662
+ * saj_parse() methos requires a complete read before parsing.
663
+ * @see sc_parse
685
664
  */
686
665
  VALUE
687
666
  oj_saj_parse(int argc, VALUE *argv, VALUE self) {