class IO
Public Instance Methods
each_line_reverse(sep = $/, bufsz = 8192) { |slice!((ridx + seplen)..-1)| ... }
click to toggle source
@param [String] sep Line separtor (default: $/) @param [Fixnum] bufsz Buffer size (default: 8192 bytes) @return [Enumerator]
# 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