Class | REXML::IOSource |
In: |
lib/rexml/source.rb
|
Parent: | Source |
block_size has been deprecated
# File lib/rexml/source.rb, line 134 134: def initialize(arg, block_size=500, encoding=nil) 135: @er_source = @source = arg 136: @to_utf = false 137: 138: # Determining the encoding is a deceptively difficult issue to resolve. 139: # First, we check the first two bytes for UTF-16. Then we 140: # assume that the encoding is at least ASCII enough for the '>', and 141: # we read until we get one of those. This gives us the XML declaration, 142: # if there is one. If there isn't one, the file MUST be UTF-8, as per 143: # the XML spec. If there is one, we can determine the encoding from 144: # it. 145: @buffer = "" 146: str = @source.read( 2 ) 147: if encoding 148: self.encoding = encoding 149: elsif 0xfe == str[0] && 0xff == str[1] 150: @line_break = "\000>" 151: elsif 0xff == str[0] && 0xfe == str[1] 152: @line_break = ">\000" 153: elsif 0xef == str[0] && 0xbb == str[1] 154: str += @source.read(1) 155: str = '' if (0xbf == str[2]) 156: @line_break = ">" 157: else 158: @line_break = ">" 159: end 160: super str+@source.readline( @line_break ) 161: end
# File lib/rexml/source.rb, line 200 200: def consume( pattern ) 201: match( pattern, true ) 202: end
@return the current line in the source
# File lib/rexml/source.rb, line 231 231: def current_line 232: begin 233: pos = @er_source.pos # The byte position in the source 234: lineno = @er_source.lineno # The XML < position in the source 235: @er_source.rewind 236: line = 0 # The \r\n position in the source 237: begin 238: while @er_source.pos < pos 239: @er_source.readline 240: line += 1 241: end 242: rescue 243: end 244: rescue IOError 245: pos = -1 246: line = -1 247: end 248: [pos, lineno, line] 249: end
# File lib/rexml/source.rb, line 222 222: def empty? 223: super and ( @source.nil? || @source.eof? ) 224: end
# File lib/rexml/source.rb, line 204 204: def match( pattern, cons=false ) 205: rv = pattern.match(@buffer) 206: @buffer = $' if cons and rv 207: while !rv and @source 208: begin 209: str = @source.readline(@line_break) 210: str = decode(str) if @to_utf and str 211: @buffer << str 212: rv = pattern.match(@buffer) 213: @buffer = $' if cons and rv 214: rescue 215: @source = nil 216: end 217: end 218: rv.taint 219: rv 220: end
# File lib/rexml/source.rb, line 226 226: def position 227: @er_source.stat.pipe? ? 0 : @er_source.pos 228: end
# File lib/rexml/source.rb, line 190 190: def read 191: begin 192: str = @source.readline(@line_break) 193: str = decode(str) if @to_utf and str 194: @buffer << str 195: rescue Exception, NameError 196: @source = nil 197: end 198: end
# File lib/rexml/source.rb, line 163 163: def scan(pattern, cons=false) 164: rv = super 165: # You'll notice that this next section is very similar to the same 166: # section in match(), but just a liiittle different. This is 167: # because it is a touch faster to do it this way with scan() 168: # than the way match() does it; enough faster to warrent duplicating 169: # some code 170: if rv.size == 0 171: until @buffer =~ pattern or @source.nil? 172: begin 173: # READLINE OPT 174: #str = @source.read(@block_size) 175: str = @source.readline(@line_break) 176: str = decode(str) if @to_utf and str 177: @buffer << str 178: rescue Iconv::IllegalSequence 179: raise 180: rescue 181: @source = nil 182: end 183: end 184: rv = super 185: end 186: rv.taint 187: rv 188: end