Coverage report: /home/ellis/comp/core/ffi/zstd/pkg.lisp
Kind | Covered | All | % |
expression | 1 | 46 | 2.2 |
branch | 0 | 0 | nil |
Key
Not instrumented
Conditionalized out
Executed
Not executed
Both branches taken
One branch taken
Neither branch taken
1
;;; ffi/zstd/pkg.lisp --- ZSTD FFI
3
;; Zstd compression support for Lisp
7
;; Initially I was thinking of this as an SB-CONTRIB module which links up
8
;; with whatever C runtime functions exposed by the built-in SBCL compression
9
;; support. However, there isn't actually much going on in the runtime and
10
;; it's not publicly exposed at all. The SBCL/Zstd surface-area is restrained
11
;; to FASL read/write streams and not of much use outside it.
13
;; So, we'll be applying the same from-scratch strategy we've become
14
;; accustomed to, exposing as much of the C API as possible and building up
17
;; The low-level abstractions are in this package - ZSTD.
19
;; For the high-level abstractions see IO/FLATE and IO/ZSTD in the IO package.
21
;; The following programs have compile-time support for linking Zstd:
28
Introduction ; ; ; ; ; ;
30
zstd, short for Zstandard, is a fast lossless compression algorithm, targeting ; ; ; ; ; ;
31
real-time compression scenarios at zlib-level and better compression ratios. ; ; ; ; ; ;
32
The zstd compression library provides in-memory compression and decompression ; ; ; ; ; ;
33
functions. ; ; ; ; ; ;
35
The library supports regular compression levels from 1 up to ZSTD_maxCLevel(), ; ; ; ; ; ;
36
which is currently 22. Levels >= 20, labeled `--ultra`, should be used with ; ; ; ; ; ;
37
caution, as they require more memory. The library also offers negative ; ; ; ; ; ;
38
compression levels, which extend the range of speed vs. ratio preferences. ; ; ; ; ; ;
39
The lower the level, the faster the speed (at the cost of compression). ; ; ; ; ; ;
41
Compression can be done in: ; ; ; ; ; ;
42
- a single step (described as Simple API) ; ; ; ; ; ;
43
- a single step, reusing a context (described as Explicit context) ; ; ; ; ; ;
44
- unbounded multiple steps (described as Streaming compression) ; ; ; ; ; ;
46
The compression ratio achievable on small data can be highly improved using ; ; ; ; ; ;
47
a dictionary. Dictionary compression can be performed in: ; ; ; ; ; ;
48
- a single step (described as Simple dictionary API) ; ; ; ; ; ;
49
- a single step, reusing a dictionary (described as Bulk-processing ; ; ; ; ; ;
50
dictionary API) ; ; ; ; ; ;
52
Advanced experimental functions can be accessed using ; ; ; ; ; ;
53
`#define ZSTD_STATIC_LINKING_ONLY` before including zstd.h. ; ; ; ; ; ;
55
Advanced experimental APIs should never be used with a dynamically-linked ; ; ; ; ; ;
56
library. They are not "stable"; their definitions or signatures may change in ; ; ; ; ; ;
57
the future. Only static linking is allowed. ; ; ; ; ; ;
62
(:use :cl :std :sb-alien)
64
(:export :zstd-alien-error :with-zstd-cstream :with-zstd-dstream
65
:zstd-versionnumber :zstd-cstreaminsize :zstd-cstreamoutsize :zstd-inbuffer
66
:zstd-iserror :zstd-defaultclevel :zstd-compress :zstd-decompress
67
:zstd-cstream :zstd-dstream :zstd-compressstream :zstd-decompressstream
68
:zstd-compressstream2 :zstd-outbuffer :zstd-geterrorname :zstd-geterrorcode
70
:zstd-alien-error :zstd-dstream-error :zstd-cstream-error
77
:load-zstd :load-zstd-alien))
80
(define-alien-loader zstd "/usr/local/lib/")
81
(define-alien-loader zstd-alien "/usr/local/lib/")
84
(deftype zstd-error-code ()
87
(deftype zstd-strategy-designator ()
88
`(or (integer ,(zstd-minclevel) ,(zstd-maxclevel))
89
(member :fast :dfast :greedy :lazy
90
:lazy2 :btlazy2 :btopt :btultra
93
(deftype zstd-compression-parameter ()
95
(deftype zstd-decompression-parameter ()
98
(deftype zstd-reset-directive ()
99
`(or (integer 1 3) (member :session-only :parameters :session-and-parameters)))
100
(deftype zstd-end-directive ()
101
`(or (integer 0 2) (member :continue :flus :end)))
104
(define-condition zstd-alien-condition () ()
105
(:documentation "Superclass of all conditions triggered by the ZSTD FFI."))
107
(deferror zstd-alien-error (error)
108
((code :initarg :code :accessor zstd-error-code))
109
(:documentation "Error signaled from Zstd Alien."))
111
;; found in zstd_errors.h
112
(define-alien-enum (zstd-errorcode int)
116
:version-unsupported 12
117
:frameparameter-unsupported 14
118
:frameparameter-windowtoolarge 16
119
:corruption-detected 20
121
:literals-headerwrong 24
122
:dictionary-corrupted 30
124
:dictionarycreation-failed 34
125
:parameter-unsupported 40
126
:parameter-combination-unsupported 41
127
:parameter-outofbound 42
128
:tablelog-toolarge 44
129
:maxsymbolvalue-toolarge 46
130
:maxsymbolvalue-toosmall 48
131
:stabilitycondition-notrespected 50
134
:memory-allocation 64
135
:workspace-toosmall 66
139
:noforwardprogress-destfull 80
140
:noforwardprogress-inputempty 82
142
:frameindex-toolarge 100
146
:sequenceproducer-failed 106
147
:externalsequences-invalid 107
151
(defar "ZSTD_versionNumber" unsigned)
152
(defar "ZSTD_versionString" c-string)
153
(defar "ZSTD_compressBound" size-t (src-size size-t))
154
(defar "ZSTD_isError" unsigned (code size-t))
155
(defar "ZSTD_getErrorName" c-string (code size-t))
156
;; zstd_errors.h - does this work?
157
(defar "ZSTD_getErrorCode" int (function-result size-t))
158
(defar "ZSTD_getErrorString" c-string (code int))
160
(defar "ZSTD_minCLevel" int)
161
(defar "ZSTD_maxCLevel" int)
162
(defar "ZSTD_defaultCLevel" int)
164
(defar "ZSTD_findFrameCompressedSize" size-t
168
(defar "ZSTD_getFrameContentSize" unsigned-long-long
172
(defar "ZSTD_decompressBound" unsigned-long-long
176
;;; Explicit Context API
177
(define-alien-type zstd-cctx (struct zstd-cctx-s))
179
(defar "ZSTD_createCCtx" (* zstd-cctx))
180
(defar "ZSTD_freeCCtx" void (cctx (* zstd-cctx)))
181
(defar "ZSTD_compressCCtx" size-t
183
(dst (* t)) (dst-capacity size-t)
184
(src (* t)) (src-size size-t)
185
(compression-level int))
187
(define-alien-type zstd-dctx (struct zstd-dctx-s))
189
(defar "ZSTD_createDCtx" (* zstd-dctx))
190
(defar "ZSTD_freeDCtx" void (dctx (* zstd-dctx)))
191
(defar "ZSTD_decompressDCtx" size-t
193
(dst (* t)) (dst-capacity size-t)
194
(src (* t)) (src-size size-t))
196
(define-alien-enum (zstd-strategy int)
207
(define-alien-enum (zstd-cparameter int)
208
:compression-level 100
216
:target-c-block-size 130
217
:enable-long-distance-matching 160
220
:ldm-bucket-size-log 163
221
:ldm-hash-rate-log 164
222
:content-size-flag 200
233
;; :expiremental6 1003 ;; is now target-c-block-size
246
:expiremental19 1016)
248
(define-alien-enum (zstd-reset-directive int)
251
:session-and-parameters 3)
253
(define-alien-enum (zstd-dparameter int)