Mercurial > core / lisp/ffi/zstd/pkg.lisp
changeset 507: |
4dd7b6320efc |
parent: |
c6caddf91c72
|
child: |
937a6f354047 |
author: |
Richard Westhaver <ellis@rwest.io> |
date: |
Thu, 04 Jul 2024 16:42:46 -0400 |
permissions: |
-rw-r--r-- |
description: |
zstd alien errors |
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)) 74 (define-alien-loader "zstd" t "/usr/lib/") 77 (deftype zstd-error-code () 80 (deftype zstd-strategy-designator () 81 `(or (integer ,(zstd-minclevel) ,(zstd-maxclevel)) 82 (member :fast :dfast :greedy :lazy 83 :lazy2 :btlazy2 :btopt :btultra 86 (deftype zstd-compression-parameter () 88 (deftype zstd-decompression-parameter () 91 (deftype zstd-reset-directive () 92 `(or (integer 1 3) (member :session-only :parameters :session-and-parameters))) 93 (deftype zstd-end-directive () 94 `(or (integer 0 2) (member :continue :flus :end))) 97 (define-condition zstd-alien-condition () () 98 (:documentation "Superclass of all conditions triggered by the ZSTD FFI.")) 100 (deferror zstd-alien-error (error) 101 ((code :initarg :code :accessor zstd-error-code)) 102 (:documentation "Error signaled from Zstd Alien.")) 104 ;; found in zstd_errors.h 105 (define-alien-enum (zstd-errorcode int) 109 :version-unsupported 12 110 :frameparameter-unsupported 14 111 :frameparameter-windowtoolarge 16 112 :corruption-detected 20 114 :literals-headerwrong 24 115 :dictionary-corrupted 30 117 :dictionarycreation-failed 34 118 :parameter-unsupported 40 119 :parameter-combination-unsupported 41 120 :parameter-outofbound 42 121 :tablelog-toolarge 44 122 :maxsymbolvalue-toolarge 46 123 :maxsymbolvalue-toosmall 48 124 :stabilitycondition-notrespected 50 127 :memory-allocation 64 128 :workspace-toosmall 66 132 :noforwardprogress-destfull 80 133 :noforwardprogress-inputempty 82 135 :frameindex-toolarge 100 139 :sequenceproducer-failed 106 140 :externalsequences-invalid 107 144 (define-alien-routine "ZSTD_versionNumber" unsigned) 145 (define-alien-routine "ZSTD_versionString" c-string) 146 (define-alien-routine "ZSTD_compressBound" size-t (src-size size-t)) 147 (define-alien-routine "ZSTD_isError" unsigned (code size-t)) 148 (define-alien-routine "ZSTD_getErrorName" c-string (code size-t)) 149 ;; zstd_errors.h - does this work? 150 (define-alien-routine "ZSTD_getErrorCode" int (function-result size-t)) 151 (define-alien-routine "ZSTD_getErrorString" c-string (code int)) 153 (define-alien-routine "ZSTD_minCLevel" int) 154 (define-alien-routine "ZSTD_maxCLevel" int) 155 (define-alien-routine "ZSTD_defaultCLevel" int) 157 (define-alien-routine "ZSTD_findFrameCompressedSize" size-t 161 (define-alien-routine "ZSTD_getFrameContentSize" unsigned-long-long 165 (define-alien-routine "ZSTD_decompressBound" unsigned-long-long 169 ;;; Explicit Context API 170 (define-alien-type zstd-cctx (struct zstd-cctx-s)) 172 (define-alien-routine "ZSTD_createCCtx" (* zstd-cctx)) 173 (define-alien-routine "ZSTD_freeCCtx" void (cctx (* zstd-cctx))) 174 (define-alien-routine "ZSTD_compressCCtx" size-t 176 (dst (* t)) (dst-capacity size-t) 177 (src (* t)) (src-size size-t) 178 (compression-level int)) 180 (define-alien-type zstd-dctx (struct zstd-dctx-s)) 182 (define-alien-routine "ZSTD_createDCtx" (* zstd-dctx)) 183 (define-alien-routine "ZSTD_freeDCtx" void (dctx (* zstd-dctx))) 184 (define-alien-routine "ZSTD_decompressDCtx" size-t 186 (dst (* t)) (dst-capacity size-t) 187 (src (* t)) (src-size size-t)) 189 (define-alien-enum (zstd-strategy int) 200 (define-alien-enum (zstd-cparameter int) 201 :compression-level 100 209 :target-c-block-size 130 210 :enable-long-distance-matching 160 213 :ldm-bucket-size-log 163 214 :ldm-hash-rate-log 164 215 :content-size-flag 200 226 ;; :expiremental6 1003 ;; is now target-c-block-size 239 :expiremental19 1016) 241 (define-alien-enum (zstd-reset-directive int) 244 :session-and-parameters 3) 246 (define-alien-enum (zstd-dparameter int)