35
35
# GNU Lesser General Public License version 2.1.
36
36
37
37
38
- class ScanError < StandardError ; end
38
+ class ScanError < StandardError
39
+ end
39
40
40
41
class StringScanner
41
- Id = 'None$Id' . freeze
42
- Version = '1.0.0' . freeze
43
42
44
43
attr_reader :pos , :match , :prev_pos
45
44
45
+ def initialize ( string , dup = false )
46
+ if string . instance_of? String
47
+ @original = string
48
+ @string = string
49
+ else
50
+ @original = StringValue ( string )
51
+ @string = String . new @original
52
+ end
53
+
54
+ reset_state
55
+ end
56
+
46
57
def pos = ( n )
47
58
n = Integer ( n )
48
59
@@ -78,11 +89,11 @@ def charpos
78
89
end
79
90
80
91
def check ( pattern )
81
- _scan pattern , false , true , true
92
+ scan_internal pattern , false , true , true
82
93
end
83
94
84
95
def check_until ( pattern )
85
- _scan pattern , false , true , false
96
+ scan_internal pattern , false , true , false
86
97
end
87
98
88
99
def clear
@@ -107,11 +118,22 @@ def eos?
107
118
end
108
119
109
120
def exist? ( pattern )
110
- _scan pattern , false , false , false
121
+ scan_internal pattern , false , false , false
111
122
end
112
123
113
124
def get_byte
114
- _get_byte
125
+ if eos?
126
+ @match = nil
127
+ return nil
128
+ end
129
+
130
+ # We need to match one byte, regardless of the string encoding
131
+ @match = Truffle . invoke_primitive :regexp_search_from_binary , /./mn , @string , pos
132
+
133
+ @prev_pos = @pos
134
+ @pos += 1
135
+
136
+ @string . byteslice ( @prev_pos , 1 )
115
137
end
116
138
117
139
def getbyte
@@ -123,18 +145,6 @@ def getch
123
145
scan ( /./m )
124
146
end
125
147
126
- def initialize ( string , dup = false )
127
- if string . instance_of? String
128
- @original = string
129
- @string = string
130
- else
131
- @original = StringValue ( string )
132
- @string = String . new @original
133
- end
134
-
135
- reset_state
136
- end
137
-
138
148
def inspect
139
149
if defined? @string
140
150
if eos?
@@ -167,7 +177,7 @@ def inspect
167
177
end
168
178
169
179
def match? ( pattern )
170
- _scan pattern , false , false , true
180
+ scan_internal pattern , false , false , true
171
181
end
172
182
173
183
def matched
@@ -228,31 +238,31 @@ def restsize
228
238
end
229
239
230
240
def scan ( pattern )
231
- _scan pattern , true , true , true
241
+ scan_internal pattern , true , true , true
232
242
end
233
243
234
244
def scan_until ( pattern )
235
- _scan pattern , true , true , false
245
+ scan_internal pattern , true , true , false
236
246
end
237
247
238
248
def scan_full ( pattern , advance_pos , getstr )
239
- _scan pattern , advance_pos , getstr , true
249
+ scan_internal pattern , advance_pos , getstr , true
240
250
end
241
251
242
252
def search_full ( pattern , advance_pos , getstr )
243
- _scan pattern , advance_pos , getstr , false
253
+ scan_internal pattern , advance_pos , getstr , false
244
254
end
245
255
246
256
def self . must_C_version
247
257
self
248
258
end
249
259
250
260
def skip ( pattern )
251
- _scan pattern , true , false , true
261
+ scan_internal pattern , true , false , true
252
262
end
253
263
254
264
def skip_until ( pattern )
255
- _scan pattern , true , false , false
265
+ scan_internal pattern , true , false , false
256
266
end
257
267
258
268
def string
@@ -296,7 +306,7 @@ def peep(len)
296
306
peek len
297
307
end
298
308
299
- def _scan ( pattern , advance_pos , getstr , headonly )
309
+ def scan_internal ( pattern , advance_pos , getstr , headonly )
300
310
unless pattern . kind_of? Regexp
301
311
raise TypeError , "bad pattern argument: #{ pattern . inspect } "
302
312
end
@@ -319,30 +329,13 @@ def _scan(pattern, advance_pos, getstr, headonly)
319
329
fin = @match . byte_end ( 0 )
320
330
321
331
@prev_pos = @pos
322
-
323
332
@pos = fin if advance_pos
324
333
325
334
width = fin - @prev_pos
326
-
327
335
return width unless getstr
328
336
329
337
@string . byteslice ( @prev_pos , width )
330
338
end
331
- private :_scan
339
+ private :scan_internal
332
340
333
- def _get_byte
334
- if eos?
335
- @match = nil
336
- return nil
337
- end
338
-
339
- # We need to match one byte, regardless of the string encoding
340
- @match = Truffle . invoke_primitive :regexp_search_from_binary , /./mn , @string , pos
341
-
342
- @prev_pos = @pos
343
- @pos += 1
344
-
345
- @string . byteslice ( @prev_pos , 1 )
346
- end
347
- private :_get_byte
348
341
end
0 commit comments