def backward(n = 0, bufsiz = nil)
if n <= 0
seek(0, File::SEEK_END)
return self
end
bufsiz ||= stat.blksize || 8192
size = stat.size
begin
if bufsiz < size
seek(0, File::SEEK_END)
while n > 0 and tell > 0 do
start = tell
seek(-bufsiz, File::SEEK_CUR)
buffer = read(bufsiz)
n -= buffer.count("\n")
seek(-bufsiz, File::SEEK_CUR)
end
else
seek(0, File::SEEK_SET)
buffer = read(size)
n -= buffer.count("\n")
seek(0, File::SEEK_SET)
end
rescue Errno::EINVAL
size = tell
retry
end
pos = -1
while n < 0
pos = buffer.index("\n", pos + 1)
n += 1
end
seek(pos + 1, File::SEEK_CUR)
self
end