123456789_123456789_123456789_123456789_123456789_

Class: IO

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: lib/scanf.rb

Instance Method Summary

Instance Method Details

#block_scanf(str) (private)

[ GitHub ]

  
# File 'lib/scanf.rb', line 682

def block_scanf(str)
  final = []
# Sub-ideal, since another FS gets created in scanf.
# But used here to determine the number of specifiers.
  fstr = Scanf::FormatString.new(str)
  last_spec = fstr.last_spec
  begin
    current = scanf(str)
    break if current.empty?
    final.push(yield(current))
  end until eof || fstr.last_spec_tried == last_spec
  return final
end

#scanf(str, &b)

Scans the current string until the match is exhausted, yielding each match as it is encountered in the string. A block is not necessary though, as the results will simply be aggregated into the final array.

"123 456".block_scanf("%d")
# => [123, 456]

If a block is given, the value from that is returned from the yield is added to an output array.

"123 456".block_scanf("%d") do |digit,| # the ',' unpacks the Array
  digit + 100
end
# => [223, 556]

See Scanf for details on creating a format string.

You will need to require 'scanf' to use scanf.

[ GitHub ]

  
# File 'lib/scanf.rb', line 614

def scanf(str,&b) #:yield: current_match
  return block_scanf(str,&b) if b
  return [] unless str.size > 0

  start_position = pos rescue 0
  matched_so_far = 0
  source_buffer = ""
  result_buffer = []
  final_result = []

  fstr = Scanf::FormatString.new(str)

  loop do
    if eof || (tty? &&! fstr.match(source_buffer))
      final_result.concat(result_buffer)
      break
    end

    source_buffer << gets

    current_match = fstr.match(source_buffer)

    spec = fstr.last_spec_tried

    if spec.matched
      if spec.mid_match?
        result_buffer.replace(current_match)
        next
      end

    elsif (fstr.matched_count == fstr.spec_count - 1)
      if /\A\s*\z/.match(fstr.string_left)
        break if spec.count_space?
        result_buffer.replace(current_match)
        next
      end
    end

    final_result.concat(current_match)

    matched_so_far += source_buffer.size
    source_buffer.replace(fstr.string_left)
    matched_so_far -= source_buffer.size
    break if fstr.last_spec
    fstr.prune
  end

  begin
    seek(start_position + matched_so_far, IO::SEEK_SET)
  rescue Errno::ESPIPE, Errno::EINVAL
  end

  soak_up_spaces if fstr.last_spec && fstr.space

  return final_result
end

#soak_up_spaces (private)

[ GitHub ]

  
# File 'lib/scanf.rb', line 673

def soak_up_spaces
  c = getc
  ungetc(c) if c
  until eof ||! c || /\S/.match(c.chr)
    c = getc
  end
  ungetc(c) if (c && /\S/.match(c.chr))
end