class Tar::FileReader::Line

Public Class Methods

new(file, *args) click to toggle source
# File lib/tar/file_reader/line.rb, line 11
def initialize(file, *args)
  @file = file
  @skip = nil

  case args.size
  when 0
    use_default_separator
    use_default_limit
  when 1
    extract_separator_or_limit(*args)
  when 2
    extract_separator(args.first)
    extract_limit(args.last)
  else
    raise ArgumentError, "wrong number of arguments (given #{args.size}, expected 0..2)", drop_internal_frames(caller)
  end
end

Public Instance Methods

read() click to toggle source
# File lib/tar/file_reader/line.rb, line 29
def read
  return @file.read if read_to_eof?

  skip_newlines if @skip
  line = read_line
  skip_newlines if @skip
  line
end

Private Instance Methods

drop_internal_frames(stacktrace) click to toggle source
# File lib/tar/file_reader/line.rb, line 61
def drop_internal_frames(stacktrace)
  stacktrace.drop_while { |frame| frame.include?("in `new'") }
end
encoding() click to toggle source
# File lib/tar/file_reader/line.rb, line 57
def encoding
  @file.internal_encoding || @file.external_encoding
end
extract_limit(limit) click to toggle source
# File lib/tar/file_reader/line.rb, line 95
def extract_limit(limit)
  if limit.nil?
    use_default_limit
  else
    @limit = limit.to_int
    use_default_limit if @limit.negative?
  end
end
extract_separator(separator) click to toggle source
# File lib/tar/file_reader/line.rb, line 83
def extract_separator(separator)
  case separator
  when nil
    @separator = nil
  when ""
    @separator = "\n\n".encode(encoding)
    @skip = "\n".encode(encoding)
  else
    @separator = separator.to_str.encode(encoding)
  end
end
extract_separator_or_limit(separator_or_limit) click to toggle source
# File lib/tar/file_reader/line.rb, line 73
def extract_separator_or_limit(separator_or_limit)
  if separator_or_limit.respond_to?(:to_int)
    use_default_separator
    extract_limit(separator_or_limit)
  else
    extract_separator(separator_or_limit)
    use_default_limit
  end
end
reached_limit?(line) click to toggle source
# File lib/tar/file_reader/line.rb, line 116
def reached_limit?(line)
  @limit && line.bytesize >= @limit
end
reached_separator?(line) click to toggle source
# File lib/tar/file_reader/line.rb, line 112
def reached_separator?(line)
  @separator && line.end_with?(@separator)
end
read_line() click to toggle source
# File lib/tar/file_reader/line.rb, line 50
def read_line
  line = String.new(encoding: encoding)
  line << @file.getc until stop_reading?(line)
  @file.lineno += 1 if reached_separator?(line)
  line
end
read_to_eof?() click to toggle source
# File lib/tar/file_reader/line.rb, line 104
def read_to_eof?
  @separator.nil? && @limit.nil?
end
skip_newlines() click to toggle source
# File lib/tar/file_reader/line.rb, line 40
def skip_newlines
  until @file.eof?
    char = @file.getc
    if char != @skip
      @file.ungetc char
      break
    end
  end
end
stop_reading?(line) click to toggle source
# File lib/tar/file_reader/line.rb, line 108
def stop_reading?(line)
  reached_separator?(line) || reached_limit?(line) || @file.eof?
end
use_default_limit() click to toggle source
# File lib/tar/file_reader/line.rb, line 69
def use_default_limit
  @limit = nil
end
use_default_separator() click to toggle source
# File lib/tar/file_reader/line.rb, line 65
def use_default_separator
  @separator = $INPUT_RECORD_SEPARATOR
end