Coverage report: /home/ellis/comp/core/ffi/zstd/stream.lisp

KindCoveredAll%
expression3188 35.2
branch00nil
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
1
 ;;; stream1.lisp --- Zstd Streaming v1 API
2
 
3
 ;; 
4
 
5
 ;;; Code:
6
 (in-package :zstd)
7
 
8
 (deferror zstd-dstream-error (zstd-alien-error) ())
9
 (deferror zstd-cstream-error (zstd-alien-error)
10
     ()
11
     (:report (lambda (c s)
12
                (format s "ZSTD CStream signalled error: ~A" (zstd-errorcode* (zstd-error-code c))))))
13
 
14
 (defun zstd-dstream-error (code)
15
   (error 'zstd-dstream-error :code code))
16
 
17
 (defun zstd-cstream-error (code)
18
   (error 'zstd-cstream-error :code code))
19
 
20
 (define-alien-type zstd-cstream zstd-cctx)
21
 
22
 (defar "ZSTD_createCStream" (* zstd-cstream))
23
 (defar "ZSTD_freeCStream" void (zcs (* zstd-cstream)))
24
 
25
 (define-alien-enum (zstd-enddirective int :default :error :test eq)
26
                    :continue 0
27
                    :flush 1
28
                    :end 2)
29
 
30
 (define-alien-variable "ZSTD_frameParameters" int)
31
 #|
32
 Alternative for ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue).
33
 NOTE: The return value is different. ZSTD_compressStream() returns a hint for
34
 the next read size (if non-zero and not an error). ZSTD_compressStream2()
35
 returns the minimum nb of bytes left to flush (if non-zero and not an error).
36
 |#
37
 (defar "ZSTD_initCStream" size-t (zcs (* zstd-cstream)) (compression-level int))
38
 (defar "ZSTD_compressStream" size-t (zcs (* zstd-cstream)) (output (* zstd-outbuffer)) (input (* zstd-inbuffer)))
39
 
40
 (defar "ZSTD_compressStream2" size-t
41
   (cctx (* zstd-cctx))
42
   (output (* zstd-outbuffer))
43
   (input (* zstd-inbuffer))
44
   (end-op zstd-enddirective))
45
 
46
 (defar "ZSTD_CStreamInSize" size-t)
47
 (defar "ZSTD_CStreamOutSize" size-t)
48
 
49
 (defar "ZSTD_flushStream" size-t (zcs (* zstd-cstream)) (output (* zstd-outbuffer)))
50
 (defar "ZSTD_endStream" size-t (zcs (* zstd-cstream)) (output (* zstd-outbuffer)))
51
 
52
 (define-alien-type zstd-dstream zstd-dctx)
53
 
54
 (defar "ZSTD_createDStream" (* zstd-dstream))
55
 (defar "ZSTD_freeDStream" void (zds (* zstd-dstream)))
56
 ;; returns recommended first input size
57
 (defar "ZSTD_initDStream" size-t (zds (* zstd-dstream)))
58
 
59
 #|
60
 @return : 0 when a frame is completely decoded and fully flushed, or an error
61
           code, which can be tested using ZSTD_isError(), or any other value >
62
           0, which means there is some decoding or flushing to do to complete
63
           current frame.
64
 
65
 Note: when an operation returns with an error code, the @zds state may be left
66
       in undefined state.  It's UB to invoke `ZSTD_decompressStream()` on such
67
       a state.  In order to re-use such a state, it must be first reset, which
68
       can be done explicitly (`ZSTD_DCtx_reset()`), or is implied for
69
       operations starting some new decompression job (`ZSTD_initDStream`,
70
       `ZSTD_decompressDCtx()`, `ZSTD_decompress_usingDict()`)
71
 |#
72
 (defar "ZSTD_decompressStream" size-t
73
   (zds (* zstd-dstream))
74
   (output (* zstd-outbuffer))
75
   (input (* zstd-inbuffer)))
76
 
77
 (defar "ZSTD_DStreamInSize" size-t)
78
 (defar "ZSTD_DStreamOutSize" size-t)
79
 
80
 (defmacro with-zstd-inbuffer ((iv &key src size pos) &body body)
81
   `(with-alien ((,iv (* zstd-inbuffer) (allocate-zstd-inbuffer)))
82
      (unwind-protect
83
           (progn
84
             ,@(when src `((setf (zstd-inbuffer-src ,iv) ,src)))
85
             ,@(when size `((setf (zstd-inbuffer-size ,iv) ,size)))
86
             ,@(when pos `((setf (zstd-inbuffer-pos ,iv) ,pos)))
87
             ,@body)
88
        (free-alien ,iv))))
89
 
90
 (defmacro with-zstd-outbuffer ((ov &key dst size pos) &body body)
91
   `(with-alien ((,ov (* zstd-outbuffer) (allocate-zstd-outbuffer)))
92
      (unwind-protect
93
           (progn
94
             ,@(when dst `((setf (zstd-outbuffer-dst ,ov) ,dst)))
95
             ,@(when size `((setf (zstd-outbuffer-size ,ov) ,size)))
96
             ,@(when pos `((setf (zstd-outbuffer-pos ,ov) ,pos)))
97
             ,@body)
98
        (free-alien ,ov))))
99
   
100
 (defmacro with-zstd-buffers ((iv ov &key src src-size src-pos dst dst-size dst-pos) &body body)
101
   `(with-alien ((,iv (* zstd-inbuffer) (allocate-zstd-inbuffer))
102
                 (,ov (* zstd-outbuffer) (allocate-zstd-outbuffer)))
103
      (unwind-protect
104
           (progn
105
             ,@(when src `((setf (zstd-inbuffer-src ,iv) ,src)))
106
             ,@(when src-size `((setf (zstd-inbuffer-size ,iv) ,src-size)))
107
             ,@(when src-pos `((setf (zstd-inbuffer-pos ,iv) ,src-pos)))
108
             ,@(when dst `((setf (zstd-outbuffer-dst ,ov) ,dst)))
109
             ,@(when dst-size `((setf (zstd-outbuffer-size ,ov) ,dst-size)))
110
             ,@(when dst-pos `((setf (zstd-outbuffer-pos ,ov) ,dst-pos)))
111
             ,@body)
112
        (free-alien ,iv)
113
        (free-alien ,ov))))
114
        
115
 (defmacro with-zstd-cstream ((cv &key (init t) (close t) (level (zstd-defaultclevel)) ) &body body)
116
   `(with-alien ((,cv (* zstd-cstream) (zstd-createcstream)))
117
      (unwind-protect
118
           (progn
119
             ,@(when init `((let ((%cinit (zstd-initcstream ,cv ,level)))
120
                              (unless (zerop (zstd-iserror %cinit))
121
                                (zstd-cstream-error %cinit)))))
122
             ,@body)
123
        ,@(when close `((zstd-freecstream ,cv))))))
124
 
125
 (defmacro with-zstd-dstream ((dv &key (init t) (close t)) &body body)
126
   `(with-alien ((,dv (* zstd-dstream) (zstd-createdstream)))
127
      (unwind-protect
128
           (progn
129
             ,@(when init `((let ((%dinit (zstd-initdstream ,dv)))
130
                              (unless (zerop (zstd-iserror %dinit))
131
                                (zstd-dstream-error %dinit)))))
132
             ,@body)
133
        ,@(when close `((zstd-freedstream ,dv))))))
134
 
135
 (defmacro with-zstd-streams ((cv dv &key (init t) (close t) (level (zstd-defaultclevel))) &body body)
136
   `(with-alien ((,cv (* zstd-cstream) (zstd-createcstream))
137
                 (,dv (* zstd-dstream) (zstd-createdstream)))
138
      (unwind-protect
139
           (progn
140
             ,@(when init `((let ((%cinit (zstd-initcstream ,cv ,level))
141
                                  (%dinit (zstd-initdstream ,dv)))
142
                              ;; TODO 2024-09-18: 
143
                              (unless (zerop (zstd-iserror %cinit))
144
                                (zstd-cstream-error %cinit))
145
                              (unless (zerop (zstd-iserror %cinit))
146
                                (zstd-cstream-error %dinit)))))
147
             ,@body)
148
        ,@(when close `((zstd-freecstream ,cv)
149
                        (zstd-freedstream ,dv))))))