From db1987632bf9d8e24ee619d5f02a6ee62f490c28 Mon Sep 17 00:00:00 2001 From: Mattias Wadman Date: Sun, 23 Oct 2022 16:05:46 +0200 Subject: [PATCH] gzip: Add to_deflate/from_deflate and to_zlib/from_zlib functions TODO: refactor doc --- format/gzip/gzip.go | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/format/gzip/gzip.go b/format/gzip/gzip.go index 32d016d9..49050920 100644 --- a/format/gzip/gzip.go +++ b/format/gzip/gzip.go @@ -5,12 +5,15 @@ package gz // TODO: verify isize? import ( + "bytes" "compress/flate" + "compress/zlib" "hash/crc32" "io" "time" "github.com/wader/fq/format" + "github.com/wader/fq/pkg/bitio" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" "github.com/wader/fq/pkg/scalar" @@ -29,6 +32,10 @@ func init() { {Groups: []*decode.Group{format.Probe}, Out: &probeGroup}, }, }) + interp.RegisterFunc0("from_deflate", fromDeflate) + interp.RegisterFunc0("to_deflate", toDeflate) + interp.RegisterFunc0("from_zlib", fromZLib) + interp.RegisterFunc0("to_zlib", toZLib) } const deflateMethod = 8 @@ -126,3 +133,91 @@ func gzDecode(d *decode.D) any { return nil } + +func fromDeflate(_ *interp.Interp, c any) any { + inBR, err := interp.ToBitReader(c) + if err != nil { + return err + } + + fr := flate.NewReader(bitio.NewIOReader(inBR)) + b := &bytes.Buffer{} + //nolint:gosec + if _, err := io.Copy(b, fr); err != nil { + return err + } + fr.Close() + + bb, err := interp.NewBinaryFromBitReader(bitio.NewBitReader(b.Bytes(), -1), 8, 0) + if err != nil { + return err + } + return bb +} + +func toDeflate(_ *interp.Interp, c any) any { + inBR, err := interp.ToBitReader(c) + if err != nil { + return err + } + + bb := &bytes.Buffer{} + fw, err := flate.NewWriter(bb, 9) // TODO: level option + if err != nil { + return err + } + if _, err := io.Copy(fw, bitio.NewIOReader(inBR)); err != nil { + return err + } + fw.Close() + + bib, err := interp.NewBinaryFromBitReader(bitio.NewBitReader(bb.Bytes(), -1), 8, 0) + if err != nil { + return err + } + return bib +} + +func fromZLib(_ *interp.Interp, c any) any { + inBR, err := interp.ToBitReader(c) + if err != nil { + return err + } + + fr, err := zlib.NewReader(bitio.NewIOReader(inBR)) + if err != nil { + return err + } + b := &bytes.Buffer{} + //nolint:gosec + if _, err := io.Copy(b, fr); err != nil { + return err + } + fr.Close() + + bb, err := interp.NewBinaryFromBitReader(bitio.NewBitReader(b.Bytes(), -1), 8, 0) + if err != nil { + return err + } + return bb +} + +func toZLib(_ *interp.Interp, c any) any { + inBR, err := interp.ToBitReader(c) + if err != nil { + return err + } + + bb := &bytes.Buffer{} + zw := zlib.NewWriter(bb) // TODO: level option + if _, err := io.Copy(zw, bitio.NewIOReader(inBR)); err != nil { + return err + } + zw.Close() + + bib, err := interp.NewBinaryFromBitReader(bitio.NewBitReader(bb.Bytes(), -1), 8, 0) + if err != nil { + return err + } + return bib +}