zscan 0.4 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. data/ext/zscan.c +17 -3
  3. data/lib/zscan.rb +1 -36
  4. data/readme.md +6 -2
  5. data/zscan.gemspec +1 -1
  6. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6a5bd6b35e34b41d8a18d878abea07f10f1cd645
4
- data.tar.gz: 6e7b07d3f38f8914aead7fe1eab3f1d047e894cc
3
+ metadata.gz: 743c9b854996ff1714f83f805a8d975b261993b5
4
+ data.tar.gz: 65254b0e114cd41b727e5481da48704b28ee2bf1
5
5
  SHA512:
6
- metadata.gz: 0d38acf3d95a7e3d4b8094d1904566b9520fbcb9928ab94c18965bac645bca2d2f035172562b42592a812c5cc9bdb67266517fdb43527394427a84919e11cf96
7
- data.tar.gz: 1c82a243bbc008bf5d040179fddf5f3b12d186c1ce25454661d34cc2562a0e0db4ff01966639cac610e2e05a4e33848cb540b0252944982f8a22cb00841bc2b6
6
+ metadata.gz: 028d305bcee7917a29caadbe8a4ff1254e682de582c5316ba0267d95ab0dd5fe01a47198fc5fda3aa5ba0e6c66ccd813d17fa464986c25bf528c3fc460a1e55d
7
+ data.tar.gz: eb2f9bff39078f3a835868147f3e36e388544ea6a939a053b0db3298cfef8d56945b06a78fba102b9b04345fef5ac5464e70d16f2999a25cd72f16c6489268ad
data/ext/zscan.c CHANGED
@@ -104,11 +104,15 @@ static VALUE zscan_bytepos(VALUE self) {
104
104
 
105
105
  static VALUE zscan_bytepos_eq(VALUE self, VALUE v_bytepos) {
106
106
  P;
107
- size_t bytepos = NUM2ULONG(v_bytepos);
108
- size_t from, to;
107
+ long signed_bytepos = NUM2LONG(v_bytepos);
108
+ size_t from, to, bytepos;
109
109
 
110
- if (bytepos > (size_t)RSTRING_LEN(p->s)) {
110
+ if (signed_bytepos > RSTRING_LEN(p->s)) {
111
111
  bytepos = RSTRING_LEN(p->s);
112
+ } else if (signed_bytepos < 0) {
113
+ bytepos = 0;
114
+ } else {
115
+ bytepos = signed_bytepos;
112
116
  }
113
117
 
114
118
  if (bytepos > p->bytepos) {
@@ -229,6 +233,15 @@ static VALUE zscan_drop_top(VALUE self) {
229
233
  return self;
230
234
  }
231
235
 
236
+ static VALUE zscan_resume_top(VALUE self) {
237
+ P;
238
+ if (p->stack_i) {
239
+ p->pos = p->stack[p->stack_i].pos;
240
+ p->bytepos = p->stack[p->stack_i].bytepos;
241
+ }
242
+ return self;
243
+ }
244
+
232
245
  void Init_zscan() {
233
246
  VALUE zscan = rb_define_class("ZScan", rb_cObject);
234
247
  rb_define_alloc_func(zscan, zscan_alloc);
@@ -244,4 +257,5 @@ void Init_zscan() {
244
257
  rb_define_method(zscan, "push_pos", zscan_push_pos, 0);
245
258
  rb_define_method(zscan, "pop_pos", zscan_pop_pos, 0);
246
259
  rb_define_method(zscan, "drop_top", zscan_drop_top, 0);
260
+ rb_define_method(zscan, "resume_top", zscan_resume_top, 0);
247
261
  }
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'
4
+ VERSION = '0.5'
5
5
 
6
6
  def initialize s, dup=false
7
7
  _internal_init dup ? s.dup : s
@@ -35,38 +35,3 @@ class ZScan
35
35
 
36
36
  private :_internal_init, :_internal_string
37
37
  end
38
-
39
- # coding: utf-8
40
- if __FILE__ == $PROGRAM_NAME
41
- GC.stress = true
42
- def assert a, b
43
- raise "expected #{a.inspect} == #{b.inspect}" if a != b
44
- end
45
- z = ZScan.new 'ab你好'
46
- assert 2, z.bmatch?('ab')
47
- z.pos = 4
48
- assert 8, z.bytepos
49
- z.push_pos
50
- assert nil, z.scan(/ab你/)
51
- z.pos = 0
52
- assert 'ab你', z.scan(/ab你/)
53
- assert 3, z.pos
54
- assert 5, z.bytepos
55
- z.pop_pos
56
- assert 4, z.pos
57
- assert 8, z.bytepos
58
- z.bytepos = 2
59
- assert '你', z.scan('你')
60
- assert '好', z.rest
61
-
62
- z.bytepos = 20
63
- assert 8, z.bytepos
64
-
65
- z.skip('ab')
66
- assert 8, z.bytepos
67
- assert 4, z.pos
68
-
69
- z = ZScan.new "a x:b+ $ \\k<x>"
70
- z.pos = 1
71
- assert ' ', z.scan(/\s*(\#.*$\s*)*/)
72
- end
data/readme.md CHANGED
@@ -47,6 +47,10 @@ See also https://bugs.ruby-lang.org/issues/7092
47
47
  - `bytepos`
48
48
  - `bytepos= new_bytepos` note: complexity ~ `abs(new_bytepos - bytepos)`.
49
49
  - `advance n` move forward `n` codepoints, if `n < 0`, move backward. Stops at beginning or end.
50
- - `push_pos` efficiently pushes current pos into the stack.
51
- - `pop_pos` efficiently sets current pos to top of the stack, and pops it.
50
+
51
+ ## Efficient pos stack manipulation
52
+
53
+ - `push_pos` pushes current pos into the stack.
54
+ - `pop_pos` sets current pos to top of the stack, and pops it.
52
55
  - `drop_top` drops top of pos stack without changing current pos.
56
+ - `resume_top` sets current pos to top of the stack.
data/zscan.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "zscan"
3
- s.version = "0.4"
3
+ s.version = "0.5"
4
4
  s.author = "Zete Lui"
5
5
  s.homepage = "https://github.com/luikore/zscan"
6
6
  s.platform = Gem::Platform::RUBY
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zscan
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.4'
4
+ version: '0.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zete Lui
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-05 00:00:00.000000000 Z
11
+ date: 2013-05-06 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: improved string scanner
14
14
  email: