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
|