mmapscanner 0.3.2 → 0.3.3
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.
- data/ext/mmapscanner.c +31 -8
- data/spec/mmapscanner_spec.rb +4 -3
- metadata +2 -2
data/ext/mmapscanner.c
CHANGED
@@ -95,7 +95,7 @@ static VALUE mmap_unmap(VALUE obj)
|
|
95
95
|
static void mmapscanner_free(mmapscanner_t *ms)
|
96
96
|
{
|
97
97
|
onig_region_free(&ms->regs, 0);
|
98
|
-
|
98
|
+
xfree(ms);
|
99
99
|
}
|
100
100
|
|
101
101
|
static void mark(mmapscanner_t *ms)
|
@@ -107,13 +107,14 @@ static void mark(mmapscanner_t *ms)
|
|
107
107
|
VALUE allocate(VALUE klass)
|
108
108
|
{
|
109
109
|
mmapscanner_t *ms;
|
110
|
-
ms =
|
110
|
+
ms = xmalloc(sizeof *ms);
|
111
111
|
ms->offset = 0;
|
112
112
|
ms->size = 0;
|
113
113
|
ms->pos = 0;
|
114
114
|
ms->matched = 0;
|
115
115
|
ms->matched_pos = 0;
|
116
116
|
onig_region_init(&ms->regs);
|
117
|
+
ms->data = Qnil;
|
117
118
|
ms->dummy_str = Qnil;
|
118
119
|
return Data_Wrap_Struct(klass, mark, mmapscanner_free, ms);
|
119
120
|
}
|
@@ -170,6 +171,26 @@ static VALUE initialize(int argc, VALUE *argv, VALUE obj)
|
|
170
171
|
return Qnil;
|
171
172
|
}
|
172
173
|
|
174
|
+
static VALUE create_from_mmapscanner(VALUE src, size_t offset, size_t size)
|
175
|
+
{
|
176
|
+
mmapscanner_t *ms, *new;
|
177
|
+
VALUE obj;
|
178
|
+
|
179
|
+
Data_Get_Struct(src, mmapscanner_t, ms);
|
180
|
+
|
181
|
+
if (offset > ms->size)
|
182
|
+
rb_raise(rb_eRangeError, "length out of range: %zu > %zu", offset, ms->size);
|
183
|
+
if (size > ms->size - offset)
|
184
|
+
size = ms->size - offset;
|
185
|
+
|
186
|
+
obj = allocate(cMmapScanner);
|
187
|
+
Data_Get_Struct(obj, mmapscanner_t, new);
|
188
|
+
new->offset = ms->offset + offset;
|
189
|
+
new->size = size;
|
190
|
+
new->data = ms->data;
|
191
|
+
return obj;
|
192
|
+
}
|
193
|
+
|
173
194
|
static VALUE size(VALUE obj)
|
174
195
|
{
|
175
196
|
mmapscanner_t *ms;
|
@@ -199,7 +220,7 @@ static VALUE to_s(VALUE obj)
|
|
199
220
|
|
200
221
|
static VALUE slice(VALUE obj, VALUE pos, VALUE len)
|
201
222
|
{
|
202
|
-
return
|
223
|
+
return create_from_mmapscanner(obj, pos, len);
|
203
224
|
}
|
204
225
|
|
205
226
|
static VALUE inspect(VALUE obj)
|
@@ -294,7 +315,7 @@ static VALUE scan_sub(VALUE obj, VALUE re, int forward, int headonly, int sizeon
|
|
294
315
|
|
295
316
|
if (sizeonly)
|
296
317
|
return SIZET2NUM(matched_len);
|
297
|
-
return
|
318
|
+
return create_from_mmapscanner(obj, old_pos, matched_len);
|
298
319
|
}
|
299
320
|
|
300
321
|
static VALUE scan(VALUE obj, VALUE re)
|
@@ -329,7 +350,7 @@ static VALUE peek(VALUE obj, VALUE size)
|
|
329
350
|
size_t sz = NUM2SIZET(size);
|
330
351
|
if (sz > ms->size - ms->pos)
|
331
352
|
sz = ms->size - ms->pos;
|
332
|
-
return
|
353
|
+
return create_from_mmapscanner(obj, ms->pos, sz);
|
333
354
|
}
|
334
355
|
|
335
356
|
static VALUE eos_p(VALUE obj)
|
@@ -343,10 +364,10 @@ static VALUE rest(VALUE obj)
|
|
343
364
|
{
|
344
365
|
mmapscanner_t *ms;
|
345
366
|
Data_Get_Struct(obj, mmapscanner_t, ms);
|
346
|
-
return
|
367
|
+
return create_from_mmapscanner(obj, ms->pos, ms->size - ms->pos);
|
347
368
|
}
|
348
369
|
|
349
|
-
static int matched_sub(int argc, VALUE *argv, mmapscanner_t *ms,
|
370
|
+
static int matched_sub(int argc, VALUE *argv, mmapscanner_t *ms, int *pos, int *len)
|
350
371
|
{
|
351
372
|
int i = 0;
|
352
373
|
if (ms->matched == 0)
|
@@ -361,6 +382,8 @@ static int matched_sub(int argc, VALUE *argv, mmapscanner_t *ms, size_t *pos, si
|
|
361
382
|
return 0;
|
362
383
|
if (i >= ms->regs.num_regs)
|
363
384
|
return 0;
|
385
|
+
if (ms->regs.beg[i] < 0 || ms->regs.end[i] < 0)
|
386
|
+
return 0;
|
364
387
|
*pos = ms->matched_pos + ms->regs.beg[i];
|
365
388
|
*len = ms->regs.end[i] - ms->regs.beg[i];
|
366
389
|
return 1;
|
@@ -373,7 +396,7 @@ static VALUE matched(int argc, VALUE *argv, VALUE obj)
|
|
373
396
|
size_t pos, len;
|
374
397
|
if (matched_sub(argc, argv, ms, &pos, &len) == 0)
|
375
398
|
return Qnil;
|
376
|
-
return
|
399
|
+
return create_from_mmapscanner(obj, pos, len);
|
377
400
|
}
|
378
401
|
|
379
402
|
static VALUE matched_str(int argc, VALUE *argv, VALUE obj)
|
data/spec/mmapscanner_spec.rb
CHANGED
@@ -142,12 +142,13 @@ describe MmapScanner do
|
|
142
142
|
end
|
143
143
|
describe '#matched(nth)' do
|
144
144
|
it 'returns nth part of matched string' do
|
145
|
-
subject.scan(/(..)(
|
145
|
+
subject.scan(/(..)((aa)|..)(..)/)
|
146
146
|
subject.matched(0).to_s.should == '012345'
|
147
147
|
subject.matched(1).to_s.should == '01'
|
148
148
|
subject.matched(2).to_s.should == '23'
|
149
|
-
subject.matched(3).
|
150
|
-
subject.matched(4).should
|
149
|
+
subject.matched(3).should be_nil
|
150
|
+
subject.matched(4).to_s.should == '45'
|
151
|
+
subject.matched(5).should be_nil
|
151
152
|
subject.matched(-1).should be_nil
|
152
153
|
end
|
153
154
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: mmapscanner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.3.
|
5
|
+
version: 0.3.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- TOMITA Masahiro
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-07-
|
13
|
+
date: 2011-07-24 00:00:00 Z
|
14
14
|
dependencies: []
|
15
15
|
|
16
16
|
description:
|