Skip to content

Commit dd108f5

Browse files
authored
Merge pull request #229 from 0xAozora/v4
Support for Append
2 parents 71a9b63 + 9bdf5f6 commit dd108f5

6 files changed

Lines changed: 65 additions & 11 deletions

File tree

bench_test.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,15 @@ func mustLoadFile(f string) []byte {
8585
}
8686

8787
var (
88-
pg1661 = mustLoadFile("testdata/pg1661.txt.gz")
89-
digits = mustLoadFile("testdata/e.txt.gz")
90-
twain = mustLoadFile("testdata/Mark.Twain-Tom.Sawyer.txt.gz")
91-
random = mustLoadFile("testdata/random.data.gz")
92-
pg1661LZ4 = mustLoadFile("testdata/pg1661.txt.lz4")
93-
digitsLZ4 = mustLoadFile("testdata/e.txt.lz4")
94-
twainLZ4 = mustLoadFile("testdata/Mark.Twain-Tom.Sawyer.txt.lz4")
95-
randomLZ4 = mustLoadFile("testdata/random.data.lz4")
88+
pg1661 = mustLoadFile("testdata/pg1661.txt.gz")
89+
digits = mustLoadFile("testdata/e.txt.gz")
90+
twain = mustLoadFile("testdata/Mark.Twain-Tom.Sawyer.txt.gz")
91+
random = mustLoadFile("testdata/random.data.gz")
92+
pg1661LZ4 = mustLoadFile("testdata/pg1661.txt.lz4")
93+
digitsLZ4 = mustLoadFile("testdata/e.txt.lz4")
94+
twainLZ4 = mustLoadFile("testdata/Mark.Twain-Tom.Sawyer.txt.lz4")
95+
randomLZ4 = mustLoadFile("testdata/random.data.lz4")
96+
randomAppendedLZ4 = mustLoadFile("testdata/random_appended.data.lz4")
9697
)
9798

9899
func benchmarkUncompress(b *testing.B, compressed []byte) {

internal/lz4errors/errors.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ const (
1616
ErrOptionInvalidBlockSize Error = "lz4: invalid block size"
1717
ErrOptionNotApplicable Error = "lz4: option not applicable"
1818
ErrWriterNotClosed Error = "lz4: writer not closed"
19+
ErrEndOfStream Error = "lz4: end of stream reached"
1920
)

internal/lz4stream/block.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ func (b *Blocks) initR(f *Frame, num int, src io.Reader) (chan []byte, error) {
143143
c <- nil // signal the collection loop that we are done
144144
<-c // wait for the collect loop to complete
145145
if f.isLegacy() && cum == cumx {
146-
err = io.EOF
146+
err = lz4errors.ErrEndOfStream
147147
}
148148
b.closeR(err)
149149
close(data)
@@ -290,11 +290,11 @@ func (b *FrameDataBlock) Read(f *Frame, src io.Reader, cum uint32) (uint32, erro
290290
// Only works in non concurrent mode, for concurrent mode
291291
// it is handled separately.
292292
// Linux kernel format appends the total uncompressed size at the end.
293-
return 0, io.EOF
293+
return 0, lz4errors.ErrEndOfStream
294294
}
295295
} else if x == 0 {
296296
// Marker for end of stream.
297-
return 0, io.EOF
297+
return 0, lz4errors.ErrEndOfStream
298298
}
299299
b.Size = DataBlockSize(x)
300300

reader.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ func (r *Reader) Read(buf []byte) (n int, err error) {
117117
for len(buf) > 0 {
118118
var bn int
119119
if r.idx == 0 {
120+
read:
120121
if r.isNotConcurrent() {
121122
bn, err = r.read(buf)
122123
} else {
@@ -129,6 +130,21 @@ func (r *Reader) Read(buf []byte) (n int, err error) {
129130
}
130131
switch err {
131132
case nil:
133+
case lz4errors.ErrEndOfStream:
134+
135+
// Read Checksum.
136+
err = r.frame.CloseR(r.src)
137+
if err != nil {
138+
return
139+
}
140+
141+
//Check for new stream.
142+
r.Reset(r.src)
143+
if err = r.init(); r.state.next(err) {
144+
return
145+
}
146+
147+
goto read
132148
case io.EOF:
133149
if er := r.frame.CloseR(r.src); er != nil {
134150
err = er
@@ -235,6 +251,7 @@ func (r *Reader) WriteTo(w io.Writer) (n int64, err error) {
235251
for {
236252
var bn int
237253
var dst []byte
254+
read:
238255
if r.isNotConcurrent() {
239256
bn, err = r.read(data)
240257
dst = data[:bn]
@@ -249,6 +266,26 @@ func (r *Reader) WriteTo(w io.Writer) (n int64, err error) {
249266
}
250267
switch err {
251268
case nil:
269+
case lz4errors.ErrEndOfStream:
270+
271+
// Read Checksum.
272+
err = r.frame.CloseR(r.src)
273+
if err != nil {
274+
return
275+
}
276+
277+
//Check for new stream.
278+
r.Reset(r.src)
279+
if err = r.init(); r.state.next(err) {
280+
281+
if err == io.EOF {
282+
err = nil
283+
}
284+
285+
return
286+
}
287+
288+
goto read
252289
case io.EOF:
253290
err = r.frame.CloseR(r.src)
254291
return

reader_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,21 @@ func TestReader_Reset(t *testing.T) {
155155
}
156156
}
157157

158+
func TestReader_Append(t *testing.T) {
159+
data := randomAppendedLZ4
160+
161+
src := bytes.NewReader(data)
162+
zr := lz4.NewReader(src)
163+
164+
b, err := io.ReadAll(zr)
165+
if err != nil {
166+
t.Fatal(err)
167+
}
168+
if !reflect.DeepEqual(b, random) {
169+
t.Fatal("result does not match original")
170+
}
171+
}
172+
158173
type brokenWriter int
159174

160175
func (w *brokenWriter) Write(p []byte) (n int, err error) {

testdata/random_appended.data.lz4

16 KB
Binary file not shown.

0 commit comments

Comments
 (0)