Skip to content

Commit db19876

Browse files
committed
gzip: Add to_deflate/from_deflate and to_zlib/from_zlib functions
TODO: refactor doc
1 parent 7e2a10c commit db19876

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed

format/gzip/gzip.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ package gz
55
// TODO: verify isize?
66

77
import (
8+
"bytes"
89
"compress/flate"
10+
"compress/zlib"
911
"hash/crc32"
1012
"io"
1113
"time"
1214

1315
"github.com/wader/fq/format"
16+
"github.com/wader/fq/pkg/bitio"
1417
"github.com/wader/fq/pkg/decode"
1518
"github.com/wader/fq/pkg/interp"
1619
"github.com/wader/fq/pkg/scalar"
@@ -29,6 +32,10 @@ func init() {
2932
{Groups: []*decode.Group{format.Probe}, Out: &probeGroup},
3033
},
3134
})
35+
interp.RegisterFunc0("from_deflate", fromDeflate)
36+
interp.RegisterFunc0("to_deflate", toDeflate)
37+
interp.RegisterFunc0("from_zlib", fromZLib)
38+
interp.RegisterFunc0("to_zlib", toZLib)
3239
}
3340

3441
const deflateMethod = 8
@@ -126,3 +133,91 @@ func gzDecode(d *decode.D) any {
126133

127134
return nil
128135
}
136+
137+
func fromDeflate(_ *interp.Interp, c any) any {
138+
inBR, err := interp.ToBitReader(c)
139+
if err != nil {
140+
return err
141+
}
142+
143+
fr := flate.NewReader(bitio.NewIOReader(inBR))
144+
b := &bytes.Buffer{}
145+
//nolint:gosec
146+
if _, err := io.Copy(b, fr); err != nil {
147+
return err
148+
}
149+
fr.Close()
150+
151+
bb, err := interp.NewBinaryFromBitReader(bitio.NewBitReader(b.Bytes(), -1), 8, 0)
152+
if err != nil {
153+
return err
154+
}
155+
return bb
156+
}
157+
158+
func toDeflate(_ *interp.Interp, c any) any {
159+
inBR, err := interp.ToBitReader(c)
160+
if err != nil {
161+
return err
162+
}
163+
164+
bb := &bytes.Buffer{}
165+
fw, err := flate.NewWriter(bb, 9) // TODO: level option
166+
if err != nil {
167+
return err
168+
}
169+
if _, err := io.Copy(fw, bitio.NewIOReader(inBR)); err != nil {
170+
return err
171+
}
172+
fw.Close()
173+
174+
bib, err := interp.NewBinaryFromBitReader(bitio.NewBitReader(bb.Bytes(), -1), 8, 0)
175+
if err != nil {
176+
return err
177+
}
178+
return bib
179+
}
180+
181+
func fromZLib(_ *interp.Interp, c any) any {
182+
inBR, err := interp.ToBitReader(c)
183+
if err != nil {
184+
return err
185+
}
186+
187+
fr, err := zlib.NewReader(bitio.NewIOReader(inBR))
188+
if err != nil {
189+
return err
190+
}
191+
b := &bytes.Buffer{}
192+
//nolint:gosec
193+
if _, err := io.Copy(b, fr); err != nil {
194+
return err
195+
}
196+
fr.Close()
197+
198+
bb, err := interp.NewBinaryFromBitReader(bitio.NewBitReader(b.Bytes(), -1), 8, 0)
199+
if err != nil {
200+
return err
201+
}
202+
return bb
203+
}
204+
205+
func toZLib(_ *interp.Interp, c any) any {
206+
inBR, err := interp.ToBitReader(c)
207+
if err != nil {
208+
return err
209+
}
210+
211+
bb := &bytes.Buffer{}
212+
zw := zlib.NewWriter(bb) // TODO: level option
213+
if _, err := io.Copy(zw, bitio.NewIOReader(inBR)); err != nil {
214+
return err
215+
}
216+
zw.Close()
217+
218+
bib, err := interp.NewBinaryFromBitReader(bitio.NewBitReader(bb.Bytes(), -1), 8, 0)
219+
if err != nil {
220+
return err
221+
}
222+
return bib
223+
}

0 commit comments

Comments
 (0)