@@ -5,12 +5,15 @@ package gz
55// TODO: verify isize?
66
77import (
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
3441const 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