oj 2.18.5 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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) {