Grammar and stream of consciousness cleanup for Channel and Scheduler rdoc
[rbx.git] / lib / strscan.rb
blobe13f29d339d89a745c4a6a25b3297830f867bf5d
1 class ScanError < StandardError; end
3 class StringScanner
4   Id = "bite me $Id".freeze
5   Version = "1.0.0".freeze
7   attr_accessor :pos
8   attr_reader :match, :string
10   alias :pointer :pos
11   alias :pointer= :pos=
13   def [] n
14     match.to_a[n]
15   end
17   def bol?
18     pos == 0 or string[pos-1..pos-1] == "\n"
19   end
20   alias :beginning_of_line? :bol?
22   def check pattern
23     _scan pattern, false, true, true
24   end
26   def check_until pattern
27     _scan pattern, false, true, false
28   end
30   def clear
31     warn "StringScanner#clear is obsolete; use #terminate instead"
32     terminate
33   end
35   def concat str
36     self.string << str
37     self
38   end
39   alias :<< :concat # TODO: reverse
41   def empty?
42     warn "StringScanner#empty? is obsolete; use #eos? instead?"
43     eos?
44   end
46   def eos?
47     _lame_guard
49     self.pos >= self.string.size
50   end
52   def exist? pattern
53     _scan pattern, false, false, false
54   end
56   def get_byte
57     scan(/./mn)
58   end
60   def getbyte
61     warn "StringScanner#getbyte is obsolete; use #get_byte instead"
62     get_byte
63   end
65   def getch
66     scan(/./m)
67   end
69   def initialize string, dup = false
70     self.string = string
71     self.reset
72   end
74   def inspect
75     if defined? @string then
76       rest = string.size > 5 ? string[pos..pos+4] + "..." : string
77       r = if eos? then
78             "#<StringScanner fin>"
79           elsif pos > 0 then
80             prev = string[0...pos].inspect
81             "#<StringScanner #{pos}/#{string.size} #{prev} @ #{rest.inspect}>"
82           else
83             "#<StringScanner #{pos}/#{string.size} @ #{rest.inspect}>"
84           end
85       r.taint if self.string.tainted?
86       r
87     else
88       "#<StringScanner (uninitialized)>"
89     end
90   end
92   def match? pattern
93     _scan pattern, false, false, true
94   end
96   def matched
97     match.to_s if matched?
98   end
100   def matched?
101     not match.nil?
102   end
104   def matched_size
105     match.to_s.size if matched?
106   end
108   def matchedsize
109     warn "StringScanner#matchedsize is obsolete; use #matched_size instead"
110     matched_size
111   end
113   def post_match
114     match.post_match if matched?
115   end
117   def pre_match
118     string[0, match.begin(0)] if matched?
119   end
121   def reset
122     @prev_pos = self.pos = 0
123     @match = nil
124     self
125   end
127   def rest
128     string[pos..-1]
129   end
131   def rest?
132     return !eos?
133   end
135   def rest_size
136     self.rest.size
137   end
139   def restsize
140     warn "StringScanner#restsize is obsolete; use #rest_size instead"
141     rest_size
142   end
144   def scan pattern
145     _scan pattern, true, true, true
146   end
148   def scan_until pattern
149     _scan pattern, true, true, false
150   end
152   def scan_full pattern, succptr, getstr
153     _scan pattern, succptr, getstr, true
154   end
156   def search_full pattern, succptr, getstr
157     _scan pattern, succptr, getstr, false
158   end
160   def self.must_C_version
161     self
162   end
164   def skip pattern
165     _scan pattern, true, false, true
166   end
168   def skip_until pattern
169     _scan pattern, true, false, false
170   end
172   def string= s
173     reset
174     @string = s
175   end
177   def terminate
178     @match = nil
179     self.pos = string.size
180     self
181   end
183   def unscan
184     raise ScanError if @match.nil?
185     self.pos = @prev_pos
186     @prev_pos = nil
187     @match = nil
188     self
189   end
191   def peek len
192     raise ArgumentError if len < 0
193     return "" if len.zero?
194     return string.substring(pos, len)
195   end
197   def peep len
198     warn "StringScanner#peep is obsolete; use #peek instead"
199     peek len
200   end
202   def _scan pattern, succptr, getstr, headonly
203     _lame_guard
205     @match = nil
207     return nil if (string.size - pos) < 0 # TODO: make more elegant
209     @match = if headonly then
210                pattern.match_start(string, pos)
211              else
212                pattern.search_region(string, pos, string.size, true)
213              end
215     return nil if match.nil?
217     m = string[pos...match.end(0)]
219     if succptr then
220       @prev_pos = pos
221       self.pos += m.size
222     end
224     if getstr then
225       m
226     else
227       m.size
228     end
229   end
230   private :_scan
232   def _lame_guard
233     raise ArgumentError unless instance_variable_defined?(:@string)
234   end
235   private :_lame_guard