Skip to content

Commit

Permalink
Remove io.Pipe
Browse files Browse the repository at this point in the history
  • Loading branch information
airuike committed Apr 11, 2020
1 parent 16e8e12 commit 32d591d
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 51 deletions.
27 changes: 13 additions & 14 deletions cachedwriter.go
Original file line number Diff line number Diff line change
@@ -1,30 +1,29 @@
package lzfse

import (
"io"
"bytes"
)

type cachedWriter struct {
w io.Writer
buf []byte
buf * bytes.Buffer
}

func newCachedWriter(w io.Writer) *cachedWriter {
func newCachedWriter() *cachedWriter {
return &cachedWriter{
w: w,
buf: make([]byte, 0, 1024),
buf: &bytes.Buffer{},
}
}

func (cw *cachedWriter) Write(b []byte) (int, error) {
n, err := cw.w.Write(b)
if n > 0 {
cw.buf = append(cw.buf, b[:n]...)
}
return n, err
func (w *cachedWriter) Write(b []byte) (int, error) {
return w.buf.Write(b)
}

func (cw *cachedWriter) ReadRelativeToEnd(b []byte, offset int64) (copied int, err error) {
copied = copy(b, cw.buf[int64(len(cw.buf))-offset:])
func (w *cachedWriter) ReadRelativeToEnd(b []byte, offset int64) (copied int, err error) {
bb := w.buf.Bytes()
copied = copy(b, bb[int64(w.buf.Len())-offset:])
return
}

func (w *cachedWriter) Bytes() []byte {
return w.buf.Bytes()
}
84 changes: 48 additions & 36 deletions decompressor.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package lzfse

import (
"bytes"
"encoding/binary"
"fmt"
"io"
)

Expand All @@ -20,9 +22,7 @@ const (
type decompressor struct {
r *cachedReader
w *cachedWriter
pipeR *io.PipeReader
pipeW *io.PipeWriter
handlerError error
payload io.Reader
}

func decodeUncompressedBlock(r *cachedReader, w *cachedWriter) (err error) {
Expand All @@ -49,45 +49,57 @@ func (d *decompressor) handleBlock(handler blockHandler) (Magic, error) {
}

func (d *decompressor) Read(b []byte) (int, error) {
return d.pipeR.Read(b)
if payload, err := d.decompressedPayload(); err == nil {
return payload.Read(b)
} else {
return 0, err
}
}

func NewReader(r io.Reader) *decompressor {
pipeR, pipeW := io.Pipe()
d := &decompressor{
r: newCachedReader(r),
w: newCachedWriter(pipeW),
pipeR: pipeR,
pipeW: pipeW,
func (d *decompressor) decompressedPayload() (io.Reader, error) {
var err error
if d.payload == nil {
d.payload, err = d.decompressAll()
}
return d.payload, err
}

func (d *decompressor) decompressAll() (io.Reader, error) {
var err error
magic := LZFSE_NO_BLOCK_MAGIC

go func() {
var err error
magic := LZFSE_NO_BLOCK_MAGIC

for nil == err {
switch magic {
case LZFSE_NO_BLOCK_MAGIC:
magic, err = readBlockMagic(d.r)
case LZFSE_UNCOMPRESSED_BLOCK_MAGIC:
magic, err = d.handleBlock(decodeUncompressedBlock)
case LZFSE_COMPRESSEDV1_BLOCK_MAGIC:
magic, err = d.handleBlock(decodeCompressedV1Block)
case LZFSE_COMPRESSEDV2_BLOCK_MAGIC:
magic, err = d.handleBlock(decodeCompressedV2Block)
case LZFSE_COMPRESSEDLZVN_BLOCK_MAGIC:
magic, err = d.handleBlock(decodeLZVNBlock)
case LZFSE_ENDOFSTREAM_BLOCK_MAGIC:
magic = LZFSE_ENDOFSTREAM_BLOCK_MAGIC
err = io.EOF
default:
panic("Bad magic")
}
for err == nil {
switch magic {
case LZFSE_NO_BLOCK_MAGIC:
magic, err = readBlockMagic(d.r)
case LZFSE_UNCOMPRESSED_BLOCK_MAGIC:
magic, err = d.handleBlock(decodeUncompressedBlock)
case LZFSE_COMPRESSEDV1_BLOCK_MAGIC:
magic, err = d.handleBlock(decodeCompressedV1Block)
case LZFSE_COMPRESSEDV2_BLOCK_MAGIC:
magic, err = d.handleBlock(decodeCompressedV2Block)
case LZFSE_COMPRESSEDLZVN_BLOCK_MAGIC:
magic, err = d.handleBlock(decodeLZVNBlock)
case LZFSE_ENDOFSTREAM_BLOCK_MAGIC:
magic, err = LZFSE_ENDOFSTREAM_BLOCK_MAGIC, io.EOF
default:
magic, err = INVALID, fmt.Errorf("Bad magic")
}
}

d.handlerError = err
d.pipeW.Close()
}()
if err == io.EOF {
// @@@ try just reading from it.. not sure if that works correctly.
return bytes.NewReader(d.w.Bytes()), nil
}

return nil, err
}

func NewReader(r io.Reader) *decompressor {
d := &decompressor{
r: newCachedReader(r),
w: newCachedWriter(),
}

return d
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module github.com/aixiansheng/go-pure-lzfse
module github.com/aixiansheng/lzfse

go 1.14
4 changes: 4 additions & 0 deletions lzfse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ func TestMedium(t *testing.T) {
DoDecomp("cmp2.lz", "dec2", "dec2.err", t)
}

func TestKern(t *testing.T) {
DoDecomp("kernel.lzfse", "kernel.dec", "kernel.err", t)
}

func DoDecomp(compressed, original, errorOutputFile string, t *testing.T) {
cmp, err := os.Open(compressed)
if err != nil {
Expand Down

0 comments on commit 32d591d

Please sign in to comment.