# class REXML::IOSource

A `Source` that wraps an `IO`. See the `Source` class for method documentation

### Public Class Methods

new(arg, block_size=500, encoding=nil) click to toggle source

block_size has been deprecated

Calls superclass method `REXML::Source::new`

    # File lib/rexml/source.rb, line 163
    def initialize(arg, block_size=500, encoding=nil)
      @er_source = @source = arg
      @to_utf = false
      @pending_buffer = nil

      if encoding
        super("", encoding)
      else
        super(@source.read(3) || "")
      end

      if !@to_utf and
          @buffer.respond_to?(:force_encoding) and
          @source.respond_to?(:external_encoding) and
          @source.external_encoding != ::Encoding::UTF_8
        @force_utf8 = true
      else
        @force_utf8 = false
      end
    end

### Public Instance Methods

consume( pattern ) click to toggle source

    # File lib/rexml/source.rb, line 215
    def consume( pattern )
      match( pattern, true )
    end

current_line() click to toggle source

@return the current line in the source

    # File lib/rexml/source.rb, line 244
    def current_line
      begin
        pos = @er_source.pos        # The byte position in the source
        lineno = @er_source.lineno  # The XML < position in the source
        @er_source.rewind
        line = 0                    # The \r\n position in the source
        begin
          while @er_source.pos < pos
            @er_source.readline
            line += 1
          end
        rescue
        end
        @er_source.seek(pos)
      rescue IOError
        pos = -1
        line = -1
      end
      [pos, lineno, line]
    end

empty?() click to toggle source
Calls superclass method `REXML::Source#empty?`

    # File lib/rexml/source.rb, line 235
    def empty?
      super and ( @source.nil? || @source.eof? )
    end

match( pattern, cons=false ) click to toggle source

    # File lib/rexml/source.rb, line 219
    def match( pattern, cons=false )
      rv = pattern.match(@buffer)
      @buffer = $' if cons and rv
      while !rv and @source
        begin
          @buffer << readline
          rv = pattern.match(@buffer)
          @buffer = $' if cons and rv
        rescue
          @source = nil
        end
      end
      rv.taint
      rv
    end

position() click to toggle source

    # File lib/rexml/source.rb, line 239
    def position
      @er_source.pos rescue 0
    end

read() click to toggle source

    # File lib/rexml/source.rb, line 207
    def read
      begin
        @buffer << readline
      rescue Exception, NameError
        @source = nil
      end
    end

scan(pattern, cons=false) click to toggle source
Calls superclass method `REXML::Source#scan`

    # File lib/rexml/source.rb, line 184
    def scan(pattern, cons=false)
      rv = super
      # You'll notice that this next section is very similar to the same
      # section in match(), but just a liiittle different.  This is
      # because it is a touch faster to do it this way with scan()
      # than the way match() does it; enough faster to warrant duplicating
      # some code
      if rv.size == 0
        until @buffer =~ pattern or @source.nil?
          begin
            @buffer << readline
          rescue Iconv::IllegalSequence
            raise
          rescue
            @source = nil
          end
        end
        rv = super
      end
      rv.taint
      rv
    end

### Private Instance Methods

encoding_updated() click to toggle source
Calls superclass method `REXML::Source#encoding_updated`

    # File lib/rexml/source.rb, line 286
    def encoding_updated
      case @encoding
      when "UTF-16BE", "UTF-16LE"
        @source.binmode
        @source.set_encoding(@encoding, @encoding)
      end
      @line_break = encode(">")
      @pending_buffer, @buffer = @buffer, ""
      @pending_buffer.force_encoding(@encoding)
      super
    end

readline() click to toggle source

    # File lib/rexml/source.rb, line 266
    def readline
      str = @source.readline(@line_break)
      if @pending_buffer
        if str.nil?
          str = @pending_buffer
        else
          str = @pending_buffer + str
        end
        @pending_buffer = nil
      end
      return nil if str.nil?

      if @to_utf
        decode(str)
      else
        str.force_encoding(::Encoding::UTF_8) if @force_utf8
        str
      end
    end