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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1452 -0
- data/README.md +53 -221
- data/RELEASE_NOTES.md +61 -0
- data/ext/oj/buf.h +54 -72
- data/ext/oj/cache.c +329 -0
- data/ext/oj/cache.h +22 -0
- data/ext/oj/cache8.c +61 -63
- data/ext/oj/cache8.h +12 -39
- data/ext/oj/circarray.c +38 -67
- data/ext/oj/circarray.h +16 -42
- data/ext/oj/code.c +214 -0
- data/ext/oj/code.h +40 -0
- data/ext/oj/compat.c +194 -110
- data/ext/oj/custom.c +1074 -0
- data/ext/oj/debug.c +126 -0
- data/ext/oj/dump.c +1276 -2494
- data/ext/oj/dump.h +110 -0
- data/ext/oj/dump_compat.c +897 -0
- data/ext/oj/dump_leaf.c +162 -0
- data/ext/oj/dump_object.c +710 -0
- data/ext/oj/dump_strict.c +399 -0
- data/ext/oj/encode.h +7 -42
- data/ext/oj/encoder.c +43 -0
- data/ext/oj/err.c +28 -53
- data/ext/oj/err.h +49 -46
- data/ext/oj/extconf.rb +33 -32
- data/ext/oj/fast.c +1082 -1098
- data/ext/oj/intern.c +313 -0
- data/ext/oj/intern.h +22 -0
- data/ext/oj/mem.c +318 -0
- data/ext/oj/mem.h +53 -0
- data/ext/oj/mimic_json.c +919 -0
- data/ext/oj/object.c +545 -625
- data/ext/oj/odd.c +158 -168
- data/ext/oj/odd.h +32 -58
- data/ext/oj/oj.c +1727 -2080
- data/ext/oj/oj.h +334 -259
- data/ext/oj/parse.c +974 -753
- data/ext/oj/parse.h +97 -90
- data/ext/oj/parser.c +1600 -0
- data/ext/oj/parser.h +103 -0
- data/ext/oj/rails.c +1478 -0
- data/ext/oj/rails.h +18 -0
- data/ext/oj/reader.c +136 -163
- data/ext/oj/reader.h +76 -112
- data/ext/oj/resolve.c +45 -94
- data/ext/oj/resolve.h +7 -34
- data/ext/oj/rxclass.c +144 -0
- data/ext/oj/rxclass.h +26 -0
- data/ext/oj/saj.c +445 -511
- data/ext/oj/saj2.c +584 -0
- data/ext/oj/saj2.h +23 -0
- data/ext/oj/scp.c +82 -143
- data/ext/oj/simd.h +10 -0
- data/ext/oj/sparse.c +749 -644
- data/ext/oj/stream_writer.c +329 -0
- data/ext/oj/strict.c +114 -112
- data/ext/oj/string_writer.c +517 -0
- data/ext/oj/trace.c +72 -0
- data/ext/oj/trace.h +55 -0
- data/ext/oj/usual.c +1218 -0
- data/ext/oj/usual.h +69 -0
- data/ext/oj/util.c +136 -0
- data/ext/oj/util.h +20 -0
- data/ext/oj/val_stack.c +75 -72
- data/ext/oj/val_stack.h +94 -127
- data/ext/oj/validate.c +46 -0
- data/ext/oj/wab.c +586 -0
- data/lib/oj/active_support_helper.rb +1 -3
- data/lib/oj/bag.rb +8 -1
- data/lib/oj/easy_hash.rb +21 -13
- data/lib/oj/error.rb +10 -12
- data/lib/oj/json.rb +188 -0
- data/lib/oj/mimic.rb +165 -26
- data/lib/oj/saj.rb +20 -6
- data/lib/oj/schandler.rb +5 -4
- data/lib/oj/state.rb +135 -0
- data/lib/oj/version.rb +2 -3
- data/lib/oj.rb +3 -31
- data/pages/Advanced.md +22 -0
- data/pages/Compatibility.md +25 -0
- data/pages/Custom.md +23 -0
- data/pages/Encoding.md +65 -0
- data/pages/InstallOptions.md +20 -0
- data/pages/JsonGem.md +94 -0
- data/pages/Modes.md +161 -0
- data/pages/Options.md +337 -0
- data/pages/Parser.md +309 -0
- data/pages/Rails.md +167 -0
- data/pages/Security.md +20 -0
- data/pages/WAB.md +13 -0
- metadata +126 -163
- data/ext/oj/hash.c +0 -163
- data/ext/oj/hash.h +0 -46
- data/ext/oj/hash_test.c +0 -512
- data/test/_test_active.rb +0 -76
- data/test/_test_active_mimic.rb +0 -96
- data/test/_test_mimic_rails.rb +0 -126
- data/test/activesupport_datetime_test.rb +0 -23
- data/test/bug.rb +0 -51
- data/test/bug2.rb +0 -10
- data/test/bug3.rb +0 -46
- data/test/bug_fast.rb +0 -32
- data/test/bug_load.rb +0 -24
- data/test/crash.rb +0 -111
- data/test/curl/curl_oj.rb +0 -46
- data/test/curl/get_oj.rb +0 -24
- data/test/curl/just_curl.rb +0 -31
- data/test/curl/just_oj.rb +0 -51
- data/test/example.rb +0 -11
- data/test/files.rb +0 -29
- data/test/foo.rb +0 -24
- data/test/helper.rb +0 -27
- data/test/io.rb +0 -48
- data/test/isolated/shared.rb +0 -310
- data/test/isolated/test_mimic_after.rb +0 -13
- data/test/isolated/test_mimic_alone.rb +0 -12
- data/test/isolated/test_mimic_as_json.rb +0 -45
- data/test/isolated/test_mimic_before.rb +0 -13
- data/test/isolated/test_mimic_define.rb +0 -28
- data/test/isolated/test_mimic_rails_after.rb +0 -22
- data/test/isolated/test_mimic_rails_before.rb +0 -21
- data/test/isolated/test_mimic_rails_datetime.rb +0 -27
- data/test/isolated/test_mimic_redefine.rb +0 -15
- data/test/mod.rb +0 -16
- data/test/perf.rb +0 -107
- data/test/perf_compat.rb +0 -128
- data/test/perf_fast.rb +0 -164
- data/test/perf_file.rb +0 -64
- data/test/perf_object.rb +0 -138
- data/test/perf_saj.rb +0 -109
- data/test/perf_scp.rb +0 -151
- data/test/perf_simple.rb +0 -287
- data/test/perf_strict.rb +0 -128
- data/test/rails.rb +0 -50
- data/test/russian.rb +0 -18
- data/test/sample/change.rb +0 -14
- data/test/sample/dir.rb +0 -19
- data/test/sample/doc.rb +0 -36
- data/test/sample/file.rb +0 -48
- data/test/sample/group.rb +0 -16
- data/test/sample/hasprops.rb +0 -16
- data/test/sample/layer.rb +0 -12
- data/test/sample/line.rb +0 -20
- data/test/sample/oval.rb +0 -10
- data/test/sample/rect.rb +0 -10
- data/test/sample/shape.rb +0 -35
- data/test/sample/text.rb +0 -20
- data/test/sample.rb +0 -55
- data/test/sample_json.rb +0 -37
- data/test/struct.rb +0 -29
- data/test/test_compat.rb +0 -398
- data/test/test_debian.rb +0 -53
- data/test/test_fast.rb +0 -458
- data/test/test_file.rb +0 -245
- data/test/test_gc.rb +0 -49
- data/test/test_hash.rb +0 -29
- data/test/test_object.rb +0 -745
- data/test/test_saj.rb +0 -186
- data/test/test_scp.rb +0 -396
- data/test/test_serializer.rb +0 -59
- data/test/test_strict.rb +0 -254
- data/test/test_various.rb +0 -1383
- data/test/test_writer.rb +0 -308
- data/test/write_timebars.rb +0 -31
data/ext/oj/resolve.c
CHANGED
@@ -1,129 +1,80 @@
|
|
1
|
-
|
2
|
-
|
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
|
-
#
|
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
|
-
|
45
|
-
|
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
|
-
|
21
|
+
clas = rb_const_get_at(mod, ci);
|
50
22
|
} else if (auto_define) {
|
51
|
-
|
23
|
+
clas = rb_define_class_under(mod, classname, oj_bag_class);
|
52
24
|
} else {
|
53
|
-
|
25
|
+
clas = Qundef;
|
54
26
|
}
|
55
27
|
return clas;
|
56
28
|
}
|
57
29
|
|
58
|
-
static VALUE
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
char
|
63
|
-
char
|
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
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
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
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
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
|
-
|
69
|
+
return resolve_classpath(pi, name, len, auto_define, error_class);
|
104
70
|
}
|
105
|
-
|
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
|
126
|
-
const char
|
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
|
-
|
2
|
-
|
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
|
32
|
-
#define
|
4
|
+
#ifndef OJ_RESOLVE_H
|
5
|
+
#define OJ_RESOLVE_H
|
33
6
|
|
34
7
|
#include "ruby.h"
|
35
8
|
|
36
|
-
extern VALUE
|
37
|
-
extern VALUE
|
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 /*
|
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 */
|