zscan 0.3 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/zscan.c +6 -8
- data/lib/zscan.rb +7 -3
- data/zscan.gemspec +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a5bd6b35e34b41d8a18d878abea07f10f1cd645
|
4
|
+
data.tar.gz: 6e7b07d3f38f8914aead7fe1eab3f1d047e894cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d38acf3d95a7e3d4b8094d1904566b9520fbcb9928ab94c18965bac645bca2d2f035172562b42592a812c5cc9bdb67266517fdb43527394427a84919e11cf96
|
7
|
+
data.tar.gz: 1c82a243bbc008bf5d040179fddf5f3b12d186c1ce25454661d34cc2562a0e0db4ff01966639cac610e2e05a4e33848cb540b0252944982f8a22cb00841bc2b6
|
data/ext/zscan.c
CHANGED
@@ -11,7 +11,6 @@ typedef struct {
|
|
11
11
|
size_t pos;
|
12
12
|
size_t bytepos;
|
13
13
|
VALUE s;
|
14
|
-
struct re_registers regs;
|
15
14
|
size_t stack_i;
|
16
15
|
size_t stack_cap;
|
17
16
|
Pos* stack;
|
@@ -26,15 +25,13 @@ static void zscan_mark(void* pp) {
|
|
26
25
|
|
27
26
|
static void zscan_free(void* pp) {
|
28
27
|
ZScan* p = pp;
|
29
|
-
onig_region_free(&(p->regs), 0);
|
30
28
|
free(p->stack);
|
31
29
|
ruby_xfree(p);
|
32
30
|
}
|
33
31
|
|
34
|
-
extern size_t onig_region_memsize P_((const struct re_registers *regs));
|
35
32
|
static size_t zscan_memsize(const void* pp) {
|
36
33
|
const ZScan* p = pp;
|
37
|
-
return p ? sizeof(*p)
|
34
|
+
return p ? sizeof(*p) : 0;
|
38
35
|
}
|
39
36
|
|
40
37
|
static const rb_data_type_t zscan_type = {
|
@@ -45,7 +42,6 @@ static const rb_data_type_t zscan_type = {
|
|
45
42
|
static VALUE zscan_alloc(VALUE klass) {
|
46
43
|
ZScan* p = ALLOC(ZScan);
|
47
44
|
MEMZERO(p, ZScan, 1);
|
48
|
-
onig_region_init(&(p->regs));
|
49
45
|
p->s = Qnil;
|
50
46
|
p->stack_cap = 5;
|
51
47
|
p->stack = (Pos*)malloc(sizeof(Pos) * 5);
|
@@ -168,12 +164,14 @@ static VALUE zscan_bmatch_p(VALUE self, VALUE pattern) {
|
|
168
164
|
} else if (TYPE(pattern) == T_REGEXP) {
|
169
165
|
regex_t *re = rb_reg_prepare_re(pattern, p->s);
|
170
166
|
int tmpreg = re != RREGEXP(pattern)->ptr;
|
171
|
-
if (!tmpreg)
|
167
|
+
if (!tmpreg) {
|
168
|
+
RREGEXP(pattern)->usecnt++;
|
169
|
+
}
|
172
170
|
|
173
171
|
char* ptr = RSTRING_PTR(p->s);
|
174
172
|
UChar* ptr_end = (UChar*)(ptr + RSTRING_LEN(p->s));
|
175
173
|
UChar* ptr_match_from = (UChar*)(ptr + p->bytepos);
|
176
|
-
long ret = onig_match(re, (UChar*)ptr, ptr_end, ptr_match_from,
|
174
|
+
long ret = onig_match(re, (UChar*)ptr, ptr_end, ptr_match_from, NULL, ONIG_OPTION_NONE);
|
177
175
|
|
178
176
|
if (!tmpreg) {
|
179
177
|
RREGEXP(pattern)->usecnt--;
|
@@ -190,7 +188,7 @@ static VALUE zscan_bmatch_p(VALUE self, VALUE pattern) {
|
|
190
188
|
if (ret == -2) {
|
191
189
|
rb_raise(rb_eRuntimeError, "regexp buffer overflow");
|
192
190
|
} else if (ret >= 0) {
|
193
|
-
return
|
191
|
+
return LONG2NUM(ret);
|
194
192
|
}
|
195
193
|
} else {
|
196
194
|
rb_raise(rb_eTypeError, "expect String or Regexp");
|
data/lib/zscan.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative "../ext/zscan"
|
2
2
|
|
3
3
|
class ZScan
|
4
|
-
VERSION = '0.
|
4
|
+
VERSION = '0.4'
|
5
5
|
|
6
6
|
def initialize s, dup=false
|
7
7
|
_internal_init dup ? s.dup : s
|
@@ -58,11 +58,15 @@ if __FILE__ == $PROGRAM_NAME
|
|
58
58
|
z.bytepos = 2
|
59
59
|
assert '你', z.scan('你')
|
60
60
|
assert '好', z.rest
|
61
|
+
|
61
62
|
z.bytepos = 20
|
62
63
|
assert 8, z.bytepos
|
63
|
-
|
64
|
+
|
64
65
|
z.skip('ab')
|
65
66
|
assert 8, z.bytepos
|
66
67
|
assert 4, z.pos
|
67
|
-
|
68
|
+
|
69
|
+
z = ZScan.new "a x:b+ $ \\k<x>"
|
70
|
+
z.pos = 1
|
71
|
+
assert ' ', z.scan(/\s*(\#.*$\s*)*/)
|
68
72
|
end
|
data/zscan.gemspec
CHANGED