tre-ruby 0.1.0 → 0.1.1

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/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: