oj 2.18.5 → 3.16.11

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 (166) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1452 -0
  3. data/README.md +53 -221
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +54 -72
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +61 -63
  9. data/ext/oj/cache8.h +12 -39
  10. data/ext/oj/circarray.c +38 -67
  11. data/ext/oj/circarray.h +16 -42
  12. data/ext/oj/code.c +214 -0
  13. data/ext/oj/code.h +40 -0
  14. data/ext/oj/compat.c +194 -110
  15. data/ext/oj/custom.c +1074 -0
  16. data/ext/oj/debug.c +126 -0
  17. data/ext/oj/dump.c +1276 -2494
  18. data/ext/oj/dump.h +110 -0
  19. data/ext/oj/dump_compat.c +897 -0
  20. data/ext/oj/dump_leaf.c +162 -0
  21. data/ext/oj/dump_object.c +710 -0
  22. data/ext/oj/dump_strict.c +399 -0
  23. data/ext/oj/encode.h +7 -42
  24. data/ext/oj/encoder.c +43 -0
  25. data/ext/oj/err.c +28 -53
  26. data/ext/oj/err.h +49 -46
  27. data/ext/oj/extconf.rb +33 -32
  28. data/ext/oj/fast.c +1082 -1098
  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 +919 -0
  34. data/ext/oj/object.c +545 -625
  35. data/ext/oj/odd.c +158 -168
  36. data/ext/oj/odd.h +32 -58
  37. data/ext/oj/oj.c +1727 -2080
  38. data/ext/oj/oj.h +334 -259
  39. data/ext/oj/parse.c +974 -753
  40. data/ext/oj/parse.h +97 -90
  41. data/ext/oj/parser.c +1600 -0
  42. data/ext/oj/parser.h +103 -0
  43. data/ext/oj/rails.c +1478 -0
  44. data/ext/oj/rails.h +18 -0
  45. data/ext/oj/reader.c +136 -163
  46. data/ext/oj/reader.h +76 -112
  47. data/ext/oj/resolve.c +45 -94
  48. data/ext/oj/resolve.h +7 -34
  49. data/ext/oj/rxclass.c +144 -0
  50. data/ext/oj/rxclass.h +26 -0
  51. data/ext/oj/saj.c +445 -511
  52. data/ext/oj/saj2.c +584 -0
  53. data/ext/oj/saj2.h +23 -0
  54. data/ext/oj/scp.c +82 -143
  55. data/ext/oj/simd.h +10 -0
  56. data/ext/oj/sparse.c +749 -644
  57. data/ext/oj/stream_writer.c +329 -0
  58. data/ext/oj/strict.c +114 -112
  59. data/ext/oj/string_writer.c +517 -0
  60. data/ext/oj/trace.c +72 -0
  61. data/ext/oj/trace.h +55 -0
  62. data/ext/oj/usual.c +1218 -0
  63. data/ext/oj/usual.h +69 -0
  64. data/ext/oj/util.c +136 -0
  65. data/ext/oj/util.h +20 -0
  66. data/ext/oj/val_stack.c +75 -72
  67. data/ext/oj/val_stack.h +94 -127
  68. data/ext/oj/validate.c +46 -0
  69. data/ext/oj/wab.c +586 -0
  70. data/lib/oj/active_support_helper.rb +1 -3
  71. data/lib/oj/bag.rb +8 -1
  72. data/lib/oj/easy_hash.rb +21 -13
  73. data/lib/oj/error.rb +10 -12
  74. data/lib/oj/json.rb +188 -0
  75. data/lib/oj/mimic.rb +165 -26
  76. data/lib/oj/saj.rb +20 -6
  77. data/lib/oj/schandler.rb +5 -4
  78. data/lib/oj/state.rb +135 -0
  79. data/lib/oj/version.rb +2 -3
  80. data/lib/oj.rb +3 -31
  81. data/pages/Advanced.md +22 -0
  82. data/pages/Compatibility.md +25 -0
  83. data/pages/Custom.md +23 -0
  84. data/pages/Encoding.md +65 -0
  85. data/pages/InstallOptions.md +20 -0
  86. data/pages/JsonGem.md +94 -0
  87. data/pages/Modes.md +161 -0
  88. data/pages/Options.md +337 -0
  89. data/pages/Parser.md +309 -0
  90. data/pages/Rails.md +167 -0
  91. data/pages/Security.md +20 -0
  92. data/pages/WAB.md +13 -0
  93. metadata +126 -163
  94. data/ext/oj/hash.c +0 -163
  95. data/ext/oj/hash.h +0 -46
  96. data/ext/oj/hash_test.c +0 -512
  97. data/test/_test_active.rb +0 -76
  98. data/test/_test_active_mimic.rb +0 -96
  99. data/test/_test_mimic_rails.rb +0 -126
  100. data/test/activesupport_datetime_test.rb +0 -23
  101. data/test/bug.rb +0 -51
  102. data/test/bug2.rb +0 -10
  103. data/test/bug3.rb +0 -46
  104. data/test/bug_fast.rb +0 -32
  105. data/test/bug_load.rb +0 -24
  106. data/test/crash.rb +0 -111
  107. data/test/curl/curl_oj.rb +0 -46
  108. data/test/curl/get_oj.rb +0 -24
  109. data/test/curl/just_curl.rb +0 -31
  110. data/test/curl/just_oj.rb +0 -51
  111. data/test/example.rb +0 -11
  112. data/test/files.rb +0 -29
  113. data/test/foo.rb +0 -24
  114. data/test/helper.rb +0 -27
  115. data/test/io.rb +0 -48
  116. data/test/isolated/shared.rb +0 -310
  117. data/test/isolated/test_mimic_after.rb +0 -13
  118. data/test/isolated/test_mimic_alone.rb +0 -12
  119. data/test/isolated/test_mimic_as_json.rb +0 -45
  120. data/test/isolated/test_mimic_before.rb +0 -13
  121. data/test/isolated/test_mimic_define.rb +0 -28
  122. data/test/isolated/test_mimic_rails_after.rb +0 -22
  123. data/test/isolated/test_mimic_rails_before.rb +0 -21
  124. data/test/isolated/test_mimic_rails_datetime.rb +0 -27
  125. data/test/isolated/test_mimic_redefine.rb +0 -15
  126. data/test/mod.rb +0 -16
  127. data/test/perf.rb +0 -107
  128. data/test/perf_compat.rb +0 -128
  129. data/test/perf_fast.rb +0 -164
  130. data/test/perf_file.rb +0 -64
  131. data/test/perf_object.rb +0 -138
  132. data/test/perf_saj.rb +0 -109
  133. data/test/perf_scp.rb +0 -151
  134. data/test/perf_simple.rb +0 -287
  135. data/test/perf_strict.rb +0 -128
  136. data/test/rails.rb +0 -50
  137. data/test/russian.rb +0 -18
  138. data/test/sample/change.rb +0 -14
  139. data/test/sample/dir.rb +0 -19
  140. data/test/sample/doc.rb +0 -36
  141. data/test/sample/file.rb +0 -48
  142. data/test/sample/group.rb +0 -16
  143. data/test/sample/hasprops.rb +0 -16
  144. data/test/sample/layer.rb +0 -12
  145. data/test/sample/line.rb +0 -20
  146. data/test/sample/oval.rb +0 -10
  147. data/test/sample/rect.rb +0 -10
  148. data/test/sample/shape.rb +0 -35
  149. data/test/sample/text.rb +0 -20
  150. data/test/sample.rb +0 -55
  151. data/test/sample_json.rb +0 -37
  152. data/test/struct.rb +0 -29
  153. data/test/test_compat.rb +0 -398
  154. data/test/test_debian.rb +0 -53
  155. data/test/test_fast.rb +0 -458
  156. data/test/test_file.rb +0 -245
  157. data/test/test_gc.rb +0 -49
  158. data/test/test_hash.rb +0 -29
  159. data/test/test_object.rb +0 -745
  160. data/test/test_saj.rb +0 -186
  161. data/test/test_scp.rb +0 -396
  162. data/test/test_serializer.rb +0 -59
  163. data/test/test_strict.rb +0 -254
  164. data/test/test_various.rb +0 -1383
  165. data/test/test_writer.rb +0 -308
  166. data/test/write_timebars.rb +0 -31
data/ext/oj/resolve.c CHANGED
@@ -1,129 +1,80 @@
1
- /* resolve.c
2
- * Copyright (c) 2012, Peter Ohler
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
- */
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.
30
3
 
31
- #include <stdlib.h>
32
4
  #include <stdio.h>
5
+ #include <stdlib.h>
33
6
  #include <string.h>
34
- #if USE_PTHREAD_MUTEX
7
+ #ifdef HAVE_PTHREAD_MUTEX_INIT
35
8
  #include <pthread.h>
36
9
  #endif
37
10
 
38
- #include "oj.h"
39
11
  #include "err.h"
12
+ #include "intern.h"
13
+ #include "oj.h"
40
14
  #include "parse.h"
41
- #include "hash.h"
42
15
 
43
- inline static VALUE
44
- resolve_classname(VALUE mod, const char *classname, int auto_define) {
45
- VALUE clas;
46
- ID ci = rb_intern(classname);
16
+ inline static VALUE resolve_classname(VALUE mod, const char *classname, int auto_define) {
17
+ VALUE clas;
18
+ ID ci = rb_intern(classname);
47
19
 
48
20
  if (rb_const_defined_at(mod, ci)) {
49
- clas = rb_const_get_at(mod, ci);
21
+ clas = rb_const_get_at(mod, ci);
50
22
  } else if (auto_define) {
51
- clas = rb_define_class_under(mod, classname, oj_bag_class);
23
+ clas = rb_define_class_under(mod, classname, oj_bag_class);
52
24
  } else {
53
- clas = Qundef;
25
+ clas = Qundef;
54
26
  }
55
27
  return clas;
56
28
  }
57
29
 
58
- static VALUE
59
- resolve_classpath(ParseInfo pi, const char *name, size_t len, int auto_define) {
60
- char class_name[1024];
61
- VALUE clas;
62
- char *end = class_name + sizeof(class_name) - 1;
63
- char *s;
64
- const char *n = name;
30
+ static VALUE resolve_classpath(ParseInfo pi, const char *name, size_t len, int auto_define, VALUE error_class) {
31
+ char class_name[1024];
32
+ VALUE clas;
33
+ char *end = class_name + sizeof(class_name) - 1;
34
+ char *s;
35
+ const char *n = name;
65
36
 
66
37
  clas = rb_cObject;
67
38
  for (s = class_name; 0 < len; n++, len--) {
68
- if (':' == *n) {
69
- *s = '\0';
70
- n++;
71
- len--;
72
- if (':' != *n) {
73
- return Qundef;
74
- }
75
- if (Qundef == (clas = resolve_classname(clas, class_name, auto_define))) {
76
- return Qundef;
77
- }
78
- s = class_name;
79
- } else if (end <= s) {
80
- return Qundef;
81
- } else {
82
- *s++ = *n;
83
- }
39
+ if (':' == *n) {
40
+ *s = '\0';
41
+ n++;
42
+ len--;
43
+ if (':' != *n) {
44
+ return Qundef;
45
+ }
46
+ if (Qundef == (clas = resolve_classname(clas, class_name, auto_define))) {
47
+ return Qundef;
48
+ }
49
+ s = class_name;
50
+ } else if (end <= s) {
51
+ return Qundef;
52
+ } else {
53
+ *s++ = *n;
54
+ }
84
55
  }
85
56
  *s = '\0';
86
57
  if (Qundef == (clas = resolve_classname(clas, class_name, auto_define))) {
87
- if (sizeof(class_name) - 1 < len) {
88
- len = sizeof(class_name) - 1;
89
- }
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);
58
+ oj_set_error_at(pi, error_class, __FILE__, __LINE__, "class %s is not defined", name);
59
+ if (Qnil != error_class) {
60
+ pi->err_class = error_class;
61
+ }
93
62
  }
94
63
  return clas;
95
64
  }
96
65
 
97
66
  VALUE
98
- oj_name2class(ParseInfo pi, const char *name, size_t len, int auto_define) {
99
- VALUE clas;
100
- VALUE *slot;
101
-
67
+ oj_name2class(ParseInfo pi, const char *name, size_t len, int auto_define, VALUE error_class) {
102
68
  if (No == pi->options.class_cache) {
103
- return resolve_classpath(pi, name, len, auto_define);
69
+ return resolve_classpath(pi, name, len, auto_define, error_class);
104
70
  }
105
- #if USE_PTHREAD_MUTEX
106
- pthread_mutex_lock(&oj_cache_mutex);
107
- #elif USE_RB_MUTEX
108
- rb_mutex_lock(oj_cache_mutex);
109
- #endif
110
- if (Qnil == (clas = oj_class_hash_get(name, len, &slot))) {
111
- if (Qundef != (clas = resolve_classpath(pi, name, len, auto_define))) {
112
- *slot = clas;
113
- }
114
- }
115
- #if USE_PTHREAD_MUTEX
116
- pthread_mutex_unlock(&oj_cache_mutex);
117
- #elif USE_RB_MUTEX
118
- rb_mutex_unlock(oj_cache_mutex);
119
- #endif
120
- return clas;
71
+ return oj_class_intern(name, len, true, pi, auto_define, error_class);
121
72
  }
122
73
 
123
74
  VALUE
124
- oj_name2struct(ParseInfo pi, VALUE nameVal) {
125
- size_t len = RSTRING_LEN(nameVal);
126
- const char *str = StringValuePtr(nameVal);
75
+ oj_name2struct(ParseInfo pi, VALUE nameVal, VALUE error_class) {
76
+ size_t len = RSTRING_LEN(nameVal);
77
+ const char *str = StringValuePtr(nameVal);
127
78
 
128
- return resolve_classpath(pi, str, len, 0);
79
+ return resolve_classpath(pi, str, len, 0, error_class);
129
80
  }
data/ext/oj/resolve.h CHANGED
@@ -1,39 +1,12 @@
1
- /* resolve.h
2
- * Copyright (c) 2011, Peter Ohler
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
- */
1
+ // Copyright (c) 2011 Peter Ohler. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file in the project root for license details.
30
3
 
31
- #ifndef __OJ_RESOLVE_H__
32
- #define __OJ_RESOLVE_H__
4
+ #ifndef OJ_RESOLVE_H
5
+ #define OJ_RESOLVE_H
33
6
 
34
7
  #include "ruby.h"
35
8
 
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);
9
+ extern VALUE oj_name2class(ParseInfo pi, const char *name, size_t len, int auto_define, VALUE error_class);
10
+ extern VALUE oj_name2struct(ParseInfo pi, VALUE nameVal, VALUE error_class);
38
11
 
39
- #endif /* __OJ_RESOLVE_H__ */
12
+ #endif /* OJ_RESOLVE_H */
data/ext/oj/rxclass.c ADDED
@@ -0,0 +1,144 @@
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.
3
+
4
+ #include <errno.h>
5
+ #include <stdio.h>
6
+ #include <stdlib.h>
7
+ #include <string.h>
8
+ #include <sys/types.h>
9
+ #if !IS_WINDOWS
10
+ #include <regex.h>
11
+ #endif
12
+
13
+ #include "mem.h"
14
+ #include "rxclass.h"
15
+
16
+ typedef struct _rxC {
17
+ struct _rxC *next;
18
+ VALUE rrx;
19
+ #if !IS_WINDOWS
20
+ regex_t rx;
21
+ #endif
22
+ VALUE clas;
23
+ char src[256];
24
+ } *RxC;
25
+
26
+ void oj_rxclass_init(RxClass rc) {
27
+ *rc->err = '\0';
28
+ rc->head = NULL;
29
+ rc->tail = NULL;
30
+ }
31
+
32
+ void oj_rxclass_cleanup(RxClass rc) {
33
+ RxC rxc;
34
+
35
+ while (NULL != (rxc = rc->head)) {
36
+ rc->head = rc->head->next;
37
+ #if !IS_WINDOWS
38
+ if (Qnil == rxc->rrx) {
39
+ regfree(&rxc->rx);
40
+ }
41
+ OJ_R_FREE(rxc);
42
+ #endif
43
+ }
44
+ }
45
+
46
+ void oj_rxclass_rappend(RxClass rc, VALUE rx, VALUE clas) {
47
+ RxC rxc = OJ_R_ALLOC_N(struct _rxC, 1);
48
+
49
+ memset(rxc, 0, sizeof(struct _rxC));
50
+ rxc->rrx = rx;
51
+ rxc->clas = clas;
52
+ if (NULL == rc->tail) {
53
+ rc->head = rxc;
54
+ } else {
55
+ rc->tail->next = rxc;
56
+ }
57
+ rc->tail = rxc;
58
+ }
59
+
60
+ // Attempt to compile the expression. If it fails populate the error code..
61
+ int oj_rxclass_append(RxClass rc, const char *expr, VALUE clas) {
62
+ RxC rxc;
63
+ #if !IS_WINDOWS
64
+ int err;
65
+ int flags = 0;
66
+ #endif
67
+ if (sizeof(rxc->src) <= strlen(expr)) {
68
+ snprintf(rc->err,
69
+ sizeof(rc->err),
70
+ "expressions must be less than %lu characters",
71
+ (unsigned long)sizeof(rxc->src));
72
+ return EINVAL;
73
+ }
74
+ rxc = OJ_R_ALLOC_N(struct _rxC, 1);
75
+ rxc->next = 0;
76
+ rxc->clas = clas;
77
+
78
+ #if IS_WINDOWS
79
+ rxc->rrx = rb_funcall(rb_cRegexp, rb_intern("new"), 1, rb_str_new2(expr));
80
+ #else
81
+ rxc->rrx = Qnil;
82
+ if (0 != (err = regcomp(&rxc->rx, expr, flags))) {
83
+ regerror(err, &rxc->rx, rc->err, sizeof(rc->err));
84
+ OJ_FREE(rxc);
85
+ return err;
86
+ }
87
+ #endif
88
+ if (NULL == rc->tail) {
89
+ rc->head = rxc;
90
+ } else {
91
+ rc->tail->next = rxc;
92
+ }
93
+ rc->tail = rxc;
94
+
95
+ return 0;
96
+ }
97
+
98
+ VALUE
99
+ oj_rxclass_match(RxClass rc, const char *str, int len) {
100
+ RxC rxc;
101
+ char buf[4096];
102
+
103
+ for (rxc = rc->head; NULL != rxc; rxc = rxc->next) {
104
+ if (Qnil != rxc->rrx) {
105
+ // Must use a valiabel for this to work.
106
+ volatile VALUE rstr = rb_str_new(str, len);
107
+
108
+ // if (Qtrue == rb_funcall(rxc->rrx, rb_intern("match?"), 1, rstr)) {
109
+ if (Qnil != rb_funcall(rxc->rrx, rb_intern("match"), 1, rstr)) {
110
+ return rxc->clas;
111
+ }
112
+ } else if (len < (int)sizeof(buf)) {
113
+ #if !IS_WINDOWS
114
+ // string is not \0 terminated so copy and attempt a match
115
+ memcpy(buf, str, len);
116
+ buf[len] = '\0';
117
+ if (0 == regexec(&rxc->rx, buf, 0, NULL, 0)) { // match
118
+ return rxc->clas;
119
+ }
120
+ #endif
121
+ } else {
122
+ // TBD allocate a larger buffer and attempt
123
+ }
124
+ }
125
+ return Qnil;
126
+ }
127
+
128
+ void oj_rxclass_copy(RxClass src, RxClass dest) {
129
+ dest->head = NULL;
130
+ dest->tail = NULL;
131
+ if (NULL != src->head) {
132
+ RxC rxc;
133
+
134
+ for (rxc = src->head; NULL != rxc; rxc = rxc->next) {
135
+ if (Qnil != rxc->rrx) {
136
+ oj_rxclass_rappend(dest, rxc->rrx, rxc->clas);
137
+ } else {
138
+ #if !IS_WINDOWS
139
+ oj_rxclass_append(dest, rxc->src, rxc->clas);
140
+ #endif
141
+ }
142
+ }
143
+ }
144
+ }
data/ext/oj/rxclass.h ADDED
@@ -0,0 +1,26 @@
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.
3
+
4
+ #ifndef OJ_RXCLASS_H
5
+ #define OJ_RXCLASS_H
6
+
7
+ #include <stdbool.h>
8
+
9
+ #include "ruby.h"
10
+
11
+ struct _rxC;
12
+
13
+ typedef struct _rxClass {
14
+ struct _rxC *head;
15
+ struct _rxC *tail;
16
+ char err[128];
17
+ } *RxClass;
18
+
19
+ extern void oj_rxclass_init(RxClass rc);
20
+ extern void oj_rxclass_cleanup(RxClass rc);
21
+ extern int oj_rxclass_append(RxClass rc, const char *expr, VALUE clas);
22
+ extern VALUE oj_rxclass_match(RxClass rc, const char *str, int len);
23
+ extern void oj_rxclass_copy(RxClass src, RxClass dest);
24
+ extern void oj_rxclass_rappend(RxClass rc, VALUE rx, VALUE clas);
25
+
26
+ #endif /* OJ_RXCLASS_H */