Class: IO

Inherits:
Object
  • Object
show all
Defined in:
lib/each_line_reverse.rb

Instance Method Summary collapse

Instance Method Details

#each_line_reverse(sep = $/, bufsz = 8192) {|buffer| ... } ⇒ Enumerator

Parameters:

  • sep (String) (defaults to: $/)

    Line separtor (default: $/)

  • bufsz (Fixnum) (defaults to: 8192)

    Buffer size (default: 8192 bytes)

Yields:

  • (buffer)

Returns:

  • (Enumerator)

Raises:

  • (ArgumentError)


5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/each_line_reverse.rb', line 5

def each_line_reverse sep = $/, bufsz = 8192
  raise ArgumentError, "invalid buffer size" unless bufsz.is_a?(Integer) && bufsz > 0
  return enum_for(:each_line_reverse, sep, bufsz) unless block_given?

  buffer = ''
  seplen = sep.length

  seek 0, SEEK_END
  while pos > 0
    bytes = [bufsz, pos].min
    seek -bytes, SEEK_CUR
    buffer = read(bytes) << buffer
    seek -bytes, SEEK_CUR

    while ridx = buffer.rindex(sep, -1 - seplen)
      yield buffer.slice!((ridx + seplen)..-1)
    end
  end

  yield buffer unless buffer.empty?
end