54 lines
693 B
Go
54 lines
693 B
Go
package finder
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
)
|
|
|
|
type TailReader struct {
|
|
f *os.File
|
|
curr int64
|
|
isEOF bool
|
|
}
|
|
|
|
func (t *TailReader) Read(b []byte) (n int, err error) {
|
|
if t.isEOF {
|
|
return 0, io.EOF
|
|
}
|
|
|
|
off := t.curr - int64(len(b))
|
|
if off < 0 {
|
|
off = 0
|
|
n, err = t.f.ReadAt(b[0:t.curr], off)
|
|
} else {
|
|
t.curr = off
|
|
n, err = t.f.ReadAt(b, off)
|
|
}
|
|
|
|
if err != nil && err != io.EOF {
|
|
return n, err
|
|
}
|
|
|
|
invert(b[0:n])
|
|
|
|
if off == 0 {
|
|
t.isEOF = true
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func NewTailReader(f *os.File, offset int64) io.Reader {
|
|
return &TailReader{
|
|
f: f,
|
|
curr: offset,
|
|
}
|
|
|
|
}
|
|
|
|
func invert(b []byte) {
|
|
for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
|
|
b[i], b[j] = b[j], b[i]
|
|
}
|
|
}
|