Coverage report: /home/ellis/comp/core/lib/io/zstd.lisp
Kind | Covered | All | % |
expression | 30 | 410 | 7.3 |
branch | 1 | 6 | 16.7 |
Key
Not instrumented
Conditionalized out
Executed
Not executed
Both branches taken
One branch taken
Neither branch taken
1
;;; zstd.lisp --- Zstd IO API
9
(eval-always (deferror zstd-error (io-error flate-error) () (:auto t)))
11
(deferror zstd-input-error (zstd-error) () (:auto t))
12
(deferror zstd-output-error (zstd-error) () (:auto t))
14
(deferror zstd-checksum-error (zstd-error) () (:auto t))
15
(deferror zstd-dictionary-error (zstd-error) () (:auto t))
18
(defclass zstd-compressing-stream (compressing-stream)
19
((%level :initform *compression-level* :accessor compression-level)
20
(%input :initform (allocate-zstd-inbuffer) :reader input)
21
(%output :initform (allocate-zstd-outbuffer) :reader output)
22
(%stream :initform (zstd-createcstream)
23
:type (alien (* zstd-cstream))
26
(defmethod make-compressing-stream ((self (eql :zstd)) stream &rest args)
27
(declare (ignore self))
28
(make-instance 'zstd-compressing-stream :compressor (apply 'make-instance 'zstd-compressor args)))
30
(defmethod input-size ((self zstd-compressing-stream))
31
(zstd-inbuffer-size (input self)))
33
(defmethod (setf input-size) (new (self zstd-compressing-stream))
34
(setf (zstd-inbuffer-size (input self)) new))
36
(defmethod output-size ((self zstd-compressing-stream))
37
(zstd-outbuffer-size (output self)))
39
(defmethod (setf output-size) (new (self zstd-compressing-stream))
40
(setf (zstd-outbuffer-size (output self)) new))
42
(defmethod input-buffer ((self zstd-compressing-stream))
43
(zstd-inbuffer-src (input self)))
45
(defmethod (setf input-buffer) ((new vector) (self zstd-compressing-stream))
46
(setf (zstd-inbuffer-src (input self)) (octets-to-alien new)))
48
(defmethod (setf input-buffer) (new (self zstd-compressing-stream))
49
(setf (zstd-inbuffer-src (input self)) new))
51
(defmethod output-buffer ((self zstd-compressing-stream))
52
(zstd-outbuffer-dst (output self)))
54
(defmethod (setf output-buffer) (new (self zstd-compressing-stream))
55
(setf (zstd-outbuffer-dst (output self)) new))
57
(defmethod (setf output-buffer) ((new vector) (self zstd-compressing-stream))
58
(setf (zstd-outbuffer-dst (output self)) (octets-to-alien new)))
60
(defmethod input-position ((self zstd-compressing-stream))
61
(zstd-inbuffer-pos (input self)))
63
(defmethod (setf input-position) (new (self zstd-compressing-stream))
64
(setf (zstd-inbuffer-pos (input self)) new))
66
(defmethod output-position ((self zstd-compressing-stream))
67
(zstd-outbuffer-pos (output self)))
69
(defmethod (setf output-position) (new (self zstd-compressing-stream))
70
(setf (zstd-outbuffer-pos (output self)) new))
72
(defmethod initialize-instance :after ((self zstd-compressing-stream)
73
&key (input-size (zstd-cstreaminsize))
74
(output-size (zstd-cstreamoutsize)))
75
(setf (input-size self) input-size
76
(output-size self) output-size)
77
(zstd-initcstream (cstream self) (compression-level self)))
79
(defmethod stream-force-output ((stream zstd-compressing-stream))
80
(zstd::zstd-flushstream (cstream stream) (output stream)))
82
(defmethod stream-finish-output ((stream zstd-compressing-stream))
83
(zstd::zstd-endstream (cstream stream) (output stream)))
85
(defmethod stream-write-sequence ((stream zstd-compressing-stream) seq &optional start end))
87
(defmethod close ((stream zstd-compressing-stream) &key &allow-other-keys)
88
;; (sb-alien:free-alien (input stream))
89
;; (sb-alien:free-alien (output stream))
90
;; (zstd-freecstream (cstream stream))
93
(defclass zstd-decompressing-stream (decompressing-stream)
94
((%input :initform (allocate-zstd-inbuffer) :reader input :type (alien zstd-inbuffer))
95
(%output :initform (allocate-zstd-outbuffer) :reader output :type (alien zstd-outbuffer))
96
(%stream :initform (zstd-createdstream)
97
:type (alien (* zstd-dstream))
100
(defmethod make-decompressing-stream ((self (eql :zstd)) stream &rest args)
101
(make-instance 'zstd-decompressing-stream :decompressor (apply 'make-instance 'zstd-decompressor args)))
103
(defmethod input-size ((self zstd-decompressing-stream))
104
(zstd-inbuffer-size (input self)))
106
(defmethod (setf input-size) (new (self zstd-decompressing-stream))
107
(setf (zstd-inbuffer-size (input self)) new))
109
(defmethod output-size ((self zstd-decompressing-stream))
110
(zstd-outbuffer-size (output self)))
112
(defmethod (setf output-size) (new (self zstd-decompressing-stream))
113
(setf (zstd-outbuffer-size (output self)) new))
115
(defmethod input-buffer ((self zstd-decompressing-stream))
116
(zstd-inbuffer-src (input self)))
118
(defmethod (setf input-buffer) (new (self zstd-decompressing-stream))
119
(setf (zstd-inbuffer-src (input self)) new))
121
(defmethod output-buffer ((self zstd-decompressing-stream))
122
(zstd-outbuffer-dst (output self)))
124
(defmethod (setf output-buffer) (new (self zstd-decompressing-stream))
125
(setf (zstd-outbuffer-dst (output self)) new))
127
(defmethod input-position ((self zstd-decompressing-stream))
128
(zstd-inbuffer-pos (input self)))
130
(defmethod (setf input-position) (new (self zstd-decompressing-stream))
131
(setf (zstd-inbuffer-pos (input self)) new))
133
(defmethod output-position ((self zstd-decompressing-stream))
134
(zstd-outbuffer-pos (output self)))
136
(defmethod (setf output-position) (new (self zstd-decompressing-stream))
137
(setf (zstd-outbuffer-pos (output self)) new))
139
(defmacro with-zstd-stream (stream (zst in out) &body body)
140
`(let ((,zst (slot-value ,stream '%stream))
141
(,in (input ,stream))
142
(,out (output ,stream)))
145
(defmethod initialize-instance :after ((self zstd-decompressing-stream)
146
&key (input-size (zstd-dstreaminsize))
147
(output-size (zstd-dstreamoutsize)))
148
(setf (input-size self) input-size
149
(output-size self) output-size)
150
;; returns recommended
151
(print (zstd-initdstream (dstream self))))
153
(defmethod close ((stream zstd-decompressing-stream) &key &allow-other-keys)
154
;; (sb-alien:free-alien (input stream))
155
;; (sb-alien:free-alien (output stream))
156
(zstd-freedstream (dstream stream)))
158
(defmethod sb-gray:stream-read-sequence ((self zstd-decompressing-stream) (seq vector) &optional start end)
159
(declare (ignore start end))
160
(with-vector-sap (sp seq)
161
(with-zstd-stream self (z i o)
163
(zstd-outbuffer-dst o) sp
164
(zstd-outbuffer-size o) (output-size self))
165
(zstd-decompressstream z o i))))
167
(defclass zstd-compressor (compressor) ()
169
:stream (make-instance 'zstd-compressing-stream)))
171
(defmethod cstream ((self zstd-compressor))
172
(cstream (stream-of self)))
174
(defmethod input ((self zstd-compressor))
175
(input (stream-of self)))
177
(defmethod output ((self zstd-compressor))
178
(output (stream-of self)))
180
(defmethod input-size ((self zstd-compressor))
181
(input-size (stream-of self)))
183
(defmethod output-size ((self zstd-compressor))
184
(output-size (stream-of self)))
186
(defmethod (setf output-size) (new (self zstd-compressor))
187
(setf (output-size (stream-of self)) new))
189
(defmethod output-buffer ((self zstd-compressor))
190
(output-buffer (stream-of self)))
192
(defmethod (setf output-buffer) (new (self zstd-compressor))
193
(setf (output-buffer (stream-of self)) new))
195
(defmethod (setf output-buffer) ((new vector) (self zstd-compressor))
196
(memcpy (zstd-outbuffer-dst (output self)) (octets-to-alien new) (length new)))
198
(defmethod input-buffer ((self zstd-compressor))
199
(input-buffer (stream-of self)))
201
(defmethod (setf input-buffer) (new (self zstd-compressor))
202
(setf (input-buffer (stream-of self)) new))
204
(defmethod (setf input-buffer) ((new vector) (self zstd-compressor))
205
(memcpy (zstd-inbuffer-src (input self)) (octets-to-alien new) (length new)))
207
(defmethod input-position ((self zstd-compressor))
208
(input-position (stream-of self)))
210
(defmethod (setf input-position) (new (self zstd-compressor))
211
(setf (input-position (stream-of self)) new))
213
(defmethod output-position ((self zstd-compressor))
214
(output-position (stream-of self)))
216
(defmethod (setf output-position) (new (self zstd-compressor))
217
(setf (output-position (stream-of self)) new))
219
(defmethod compression-level ((self zstd-compressor))
220
(compression-level (stream-of self)))
222
(defmethod compress-with ((self zstd-compressor) (obj vector) &key (end-op :continue) &allow-other-keys)
223
(with-zstd-stream (stream-of self) (z i o)
225
(zstd-inbuffer-src i)
226
(octets-to-alien obj)
227
(zstd-outbuffer-dst o)
228
(make-alien sb-alien:unsigned-char (output-size self)))
229
(let ((code (zstd-compressstream2 z o i (zstd-enddirective end-op))))
230
(if (or (zerop code) (zerop (zstd::zstd-iserror code)))
232
(zstd-error (zstd::zstd-geterrorstring (zstd::zstd-geterrorcode code)))))))
234
(defmethod stream-force-output ((stream zstd-compressor))
235
(force-output (stream-of stream)))
237
(defmethod stream-finish-output ((stream zstd-compressor))
238
(stream-finish-output (stream-of stream)))
240
(defclass zstd-decompressor (decompressor)
243
:stream (make-instance 'zstd-decompressing-stream)))
245
(defmethod dstream ((self zstd-decompressor))
246
(dstream (stream-of self)))
248
(defmethod input ((self zstd-decompressor))
249
(input (stream-of self)))
251
(defmethod output ((self zstd-decompressor))
252
(output (stream-of self)))
254
(defmethod input-buffer ((self zstd-decompressor))
255
(input-buffer (stream-of self)))
257
(defmethod (setf input-buffer) (new (self zstd-decompressor))
258
(setf (input-buffer (stream-of self)) new))
260
(defmethod (setf input-buffer) ((new vector) (self zstd-decompressor))
261
(memcpy (zstd-inbuffer-src (input self)) (octets-to-alien new) (length new)))
263
(defmethod output-buffer ((self zstd-decompressor))
264
(output-buffer (stream-of self)))
266
(defmethod (setf output-buffer) (new (self zstd-decompressor))
267
(setf (output-buffer (stream-of self)) new))
269
(defmethod (setf output-buffer) ((new vector) (self zstd-decompressor))
270
(memcpy (zstd-outbuffer-dst (output self)) (octets-to-alien new) (length new)))
272
(defmethod input-size ((self zstd-decompressor))
273
(input-size (stream-of self)))
275
(defmethod output-size ((self zstd-decompressor))
276
(output-size (stream-of self)))
278
(defmethod input-position ((self zstd-decompressor))
279
(input-position (stream-of self)))
281
(defmethod (setf input-position) (new (self zstd-decompressor))
282
(setf (input-position (stream-of self)) new))
284
(defmethod output-position ((self zstd-decompressor))
285
(output-position (stream-of self)))
287
(defmethod (setf output-position) (new (self zstd-decompressor))
288
(setf (output-position (stream-of self)) new))
290
(defmethod decompress-with ((self zstd-decompressor) (obj vector) &key &allow-other-keys)
291
(with-zstd-stream (stream-of self) (z i o)
293
(zstd-inbuffer-src i)
294
(octets-to-alien obj)
295
(zstd-outbuffer-dst o)
296
(make-alien sb-alien:unsigned-char (input-size self)))
297
(let ((code (zstd-decompressstream z o i)))
298
(if (or (zerop code) (zerop (zstd::zstd-iserror code)))
300
(zstd-error (zstd::zstd-geterrorstring (zstd::zstd-geterrorcode code)))))))
302
;; (defmethod stream-force-output ((stream zstd-decompressor))
303
;; (force-output (stream-of stream)))
305
(defmethod stream-finish-output ((stream zstd-decompressor))
306
(stream-finish-output (stream-of stream)))
308
;; (defmethod stream-force-output ((stream zstd-decompressing-stream))
309
;; (zstd::zstd-flushstream (dstream stream) (output stream)))
311
(defmethod stream-finish-output ((stream zstd-compressing-stream))
312
(zstd::zstd-freedstream (dstream stream)))
314
;; (zstd::zstd-decompressbound
317
(defmacro with-zstd-output ((sym &optional buffer (level #.zstd:+zstd-clevel-default+)) &body body)
319
(let ((,sym ,(or buffer
320
(make-array #.io/flate:*compression-buffer-size*
321
:element-type 'std:octet
324
(zstd:zstdc ,sym ,level))
325
(error (c) (zstd-output-error c))))
327
(defmacro with-zstd-input ((sym buffer &optional size) &body body)
329
(let ((,sym (zstd:zstdd ,buffer ,(or size `(length ,buffer)))))
330
,@(when (null body) `(,sym))
332
(error (c) (zstd-input-error c))))
334
(defmacro with-zstd-buffer ((sym buffer &key size (level #.zstd:+zstd-clevel-default+) (direction :input)) &body body)
336
(:input `(with-zstd-input (,sym ,buffer ,size) ,@body))
337
(:output `(with-zstd-output (,sym ,buffer ,level) ,@body))))