tre-ruby 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
@@ -1,4 +1,5 @@
1
1
  #include "ruby.h"
2
+ #include "ruby/version.h"
2
3
  #include "tre/tre.h"
3
4
 
4
5
  VALUE mTRE;
@@ -81,6 +82,14 @@ tre_compile_regex(regex_t* preg, VALUE pattern, VALUE ignore_case, VALUE multi_l
81
82
  }
82
83
  }
83
84
 
85
+ #if RUBY_VERSION_MAJOR == 1 && RUBY_VERSION_MINOR == 8
86
+ #define CHAR_LENGTH(string) RSTRING_LEN(string)
87
+ #define BYTE_TO_CHAR(string, bo) bo
88
+ #else
89
+ #define CHAR_LENGTH(string) NUM2LONG( rb_str_length(string) )
90
+ #define BYTE_TO_CHAR(string, bo) rb_str_sublen(string, bo)
91
+ #endif
92
+
84
93
  static VALUE
85
94
  tre_traverse(VALUE pattern, VALUE string, long char_offset, VALUE params,
86
95
  VALUE ignore_case, VALUE multi_line, int num_captures, VALUE repeat) {
@@ -107,18 +116,19 @@ tre_traverse(VALUE pattern, VALUE string, long char_offset, VALUE params,
107
116
 
108
117
  while (1) {
109
118
  // Get substring to start with
110
- long len = RSTRING_LEN(string) - char_offset;
111
- if (char_offset >= len) break;
112
- string = rb_str_substr(string, char_offset, len);
119
+ long char_len = CHAR_LENGTH(string) - char_offset;
120
+ if (char_len <= 0) break;
121
+ string = rb_str_substr(string, char_offset, char_len);
113
122
 
114
- int result = tre_reganexec(&preg, StringValuePtr(string), len, &match, aparams, 0);
123
+ int result = tre_reganexec(&preg, StringValuePtr(string),
124
+ RSTRING_LEN(string), &match, aparams, 0);
115
125
 
116
126
  if (result == REG_NOMATCH) break;
117
127
 
118
128
  // Fill in array with ranges
119
129
  VALUE subarr;
120
130
  if (match.nmatch == 1)
121
- subarr = arr; // Fake
131
+ subarr = arr; // Faking.. kind of.
122
132
  else {
123
133
  subarr = rb_ary_new();
124
134
  // rb_global_variable(&subarr);
@@ -126,12 +136,14 @@ tre_traverse(VALUE pattern, VALUE string, long char_offset, VALUE params,
126
136
 
127
137
  unsigned int i;
128
138
  for (i = 0; i < match.nmatch; ++i)
139
+ // No match
129
140
  if (match.pmatch[i].rm_so == -1)
130
141
  rb_ary_push(subarr, Qnil);
142
+ // Match => Range
131
143
  else {
132
144
  VALUE range = rb_range_new(
133
- LONG2NUM( char_offset_acc + rb_str_sublen(string, match.pmatch[i].rm_so) ),
134
- LONG2NUM( char_offset_acc + rb_str_sublen(string, match.pmatch[i].rm_eo) ),
145
+ LONG2NUM( char_offset_acc + BYTE_TO_CHAR(string, match.pmatch[i].rm_so) ),
146
+ LONG2NUM( char_offset_acc + BYTE_TO_CHAR(string, match.pmatch[i].rm_eo) ),
135
147
  1);
136
148
  // rb_global_variable(&range);
137
149
 
@@ -143,7 +155,7 @@ tre_traverse(VALUE pattern, VALUE string, long char_offset, VALUE params,
143
155
  if (repeat == Qfalse)
144
156
  break;
145
157
  else {
146
- char_offset = rb_str_sublen(string, match.pmatch[0].rm_eo);
158
+ char_offset = BYTE_TO_CHAR(string, match.pmatch[0].rm_eo);
147
159
  if (char_offset == 0) char_offset = 1; // Weird case
148
160
  char_offset_acc += char_offset;
149
161
  }
@@ -160,7 +160,8 @@ private
160
160
  opts &= ~Regexp::MULTILINE
161
161
  ret[:ignore_case] = (opts & Regexp::IGNORECASE) > 0
162
162
  opts &= ~Regexp::IGNORECASE
163
- opts &= ~Regexp::FIXEDENCODING # FIXME
163
+ opts &= ~Regexp::FIXEDENCODING if
164
+ Regexp.constants.map { |c| c.to_s }.include? "FIXEDENCODING"
164
165
  raise ArgumentError.new("Unsupported Regexp flag provided") if opts > 0
165
166
 
166
167
  # Pessimistic estimation of the number of captures
@@ -76,7 +76,7 @@ class TestTRE < Test::Unit::TestCase
76
76
  assert_equal nil, TWISTER.aindex(/toult/i, 0, params)
77
77
 
78
78
  # Frozen: cannot modify
79
- assert_raise(RuntimeError) { params.max_err = 2 }
79
+ assert_raise(RUBY_VERSION =~ /^1.8/ ? TypeError : RuntimeError) { params.max_err = 2 }
80
80
 
81
81
  # Warm AParams
82
82
  params = TRE::AParams.new
@@ -176,6 +176,52 @@ class TestTRE < Test::Unit::TestCase
176
176
  assert_not_equal copy, TWISTER
177
177
  end
178
178
 
179
+ def test_multibyte
180
+ $KCODE = 'u' if RUBY_VERSION =~ /^1.8/
181
+ lyric = "
182
+ 사랑을 한다는 말은 못했어
183
+ 어쨌거나 지금은 너무 늦어버렸어
184
+ 그때 나는 무얼 하고 있었나
185
+ 그 미소는 너무 아름다웠어
186
+ 난 정말 그대 그대만을 좋아헀어
187
+ 나에게 이런 슬픔 안겨 주는 그대여
188
+ 제발 이별만은 말 하지 말아요
189
+ 나에겐 오직 그대만이 전부였잖아
190
+ 오 그대여 가지 마세요
191
+ 나를 정말 떠나 가나요
192
+ 오 그대여 가지 마세요
193
+ 나는 지금 울잖아요
194
+ 난 알아요
195
+ 이 밤이 흐르면 YO!
196
+ 그대 떠나는 모습 뒤로 하고
197
+ 마지막 키스에 슬픈 마음
198
+ 정말 떠나는가
199
+ 사랑을 하고 싶어 너의 모든 향기
200
+ 내 몸 속에 젖어 있는 너의 많은 숨결
201
+ 그 미소 그 눈물 그 알 수 없는 마음 그대 마음
202
+ 그리고 또 마음 그대 마음
203
+ 그 어렵다는 편지는 쓰지 않아도 돼
204
+ 너의 진실한 모습을 바라보고 있어요
205
+ 아직도 마음속엔 내가 있나요
206
+ 나는 그대의 영원한
207
+ 난 정말 그대 그대만을 좋아했어
208
+ 나에게 이런 슬픔 안겨주는 그대여
209
+ 오 그대여 가지 마세요
210
+ 나를 정말 떠나 가나요
211
+ 오 그대여 가지 마세요
212
+ 나는 지금 울잖아요
213
+ 오 그대여 가지 마세요
214
+ 나를 정말 떠나 가나요
215
+ 오 그대여 가지 마세요
216
+ 나는 지금 울잖아요"
217
+ srch = "오 그대여 가지 마세요"
218
+ assert_equal 6,
219
+ lyric.extend(TRE).ascan_r(/#{srch}/i, TRE.fuzziness(0)).length
220
+ assert_equal 6,
221
+ lyric.extend(TRE).ascan(/#{srch}/i, TRE.fuzziness(0)).length
222
+ assert lyric.extend(TRE).ascan(/#{srch}/i, TRE.fuzziness(0)).all? { |e| e == srch }
223
+ end
224
+
179
225
  TWISTER = TREString.new <<-EOF
180
226
  She sells sea shells by the sea shore.
181
227
  The shells she sells are surely seashells.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tre-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-04-12 00:00:00.000000000Z
12
+ date: 2011-04-20 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
- requirement: &2153038680 !ruby/object:Gem::Requirement
16
+ requirement: &2156453820 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.0.0
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2153038680
24
+ version_requirements: *2156453820
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: jeweler
27
- requirement: &2153037520 !ruby/object:Gem::Requirement
27
+ requirement: &2156452860 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.5.2
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2153037520
35
+ version_requirements: *2156452860
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rcov
38
- requirement: &2153036080 !ruby/object:Gem::Requirement
38
+ requirement: &2156451820 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2153036080
46
+ version_requirements: *2156451820
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake-compiler
49
- requirement: &2153024580 !ruby/object:Gem::Requirement
49
+ requirement: &2156450920 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: 0.7.7
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2153024580
57
+ version_requirements: *2156450920
58
58
  description: Ruby binding for TRE library. Provides interface for approximate regular
59
59
  expression matching.
60
60
  email: junegunn.c@gmail.com
@@ -91,7 +91,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
91
91
  version: '0'
92
92
  segments:
93
93
  - 0
94
- hash: -2920886793274010137
94
+ hash: -2151247154818609627
95
95
  required_rubygems_version: !ruby/object:Gem::Requirement
96
96
  none: false
97
97
  requirements: