changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/io/flate.lisp

changeset 698: 96958d3eb5b0
parent: 804b5ee20a46
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
400
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 ;;; io/flate.lisp --- Compressed IO Interface
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;; Use compression (ZSTD) with Lisp objects and streams.
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;;; Commentary:
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
 ;; compression ref: https://www.xach.com/lisp/salza2/ (compression only)
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
8
 
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
9
 ;; decompression ref: https://github.com/sharplispers/chipz (decompression only)
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
10
 
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
 ;; The libraries above are the current state-of-the-art for compression and
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
12
 ;; decompression in Common Lisp. They are portable packages which depend on
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
13
 ;; gray streams. They loosely cover deflate, zlib, gzip, and bzip2 data.
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
14
 
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
15
 ;; The compression backends are themselves hand-coded in Common Lisp, making
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
 ;; them excellent reference material. However, we don't have much use for the
658
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 470
diff changeset
17
 ;; compression backends offered.
400
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
 
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
 ;; We intend to almost exclusively support Zstd compression and decompression
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
 ;; using our ZSTD FFI Lisp system, so we'll make a new library - FLATE - which
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
21
 ;; provides a shared zstd compression/decompression to Lisp objects and
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
 ;; streams.
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
 
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
 ;;; Code:
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
 (in-package :io/flate)
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
26
 
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
 ;;; Vars
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
28
 (defparameter *compression-buffer-size* 4096)
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
29
 (defparameter *decompression-buffer-size* 4096)
470
c6caddf91c72 zstdd and zstdc
Richard Westhaver <ellis@rwest.io>
parents: 441
diff changeset
30
 (defparameter *default-compression-level* (zstd:zstd-defaultclevel))
c6caddf91c72 zstdd and zstdc
Richard Westhaver <ellis@rwest.io>
parents: 441
diff changeset
31
 
c6caddf91c72 zstdd and zstdc
Richard Westhaver <ellis@rwest.io>
parents: 441
diff changeset
32
 (defvar *compression-level*)
400
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
 
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
 ;;; Utils
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
 
470
c6caddf91c72 zstdd and zstdc
Richard Westhaver <ellis@rwest.io>
parents: 441
diff changeset
36
 ;;; Errors
435
849bbe48e32d added dat/mime, removed sans-io
Richard Westhaver <ellis@rwest.io>
parents: 431
diff changeset
37
 (eval-always (deferror flate-error () () (:auto t)))
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
38
 
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
39
 (deferror compression-error (flate-error) () (:auto t))
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
40
 (deferror decompression-error (flate-error) () (:auto t))
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
41
 
470
c6caddf91c72 zstdd and zstdc
Richard Westhaver <ellis@rwest.io>
parents: 441
diff changeset
42
 ;;; Proto
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
43
 (defgeneric finish-compression (self))
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
44
 (defgeneric finish-decompression (self))
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
45
 ;; TODO 2024-06-08: maybe move this to generic io/stream protocol - 'RESET'
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
46
 (defgeneric reset-compressor (self))
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
47
 (defgeneric reset-decompressor (self))
441
9fa3b9154bb2 add pod/containerfile, rm pod/buildah, some work on zstd
Richard Westhaver <ellis@rwest.io>
parents: 435
diff changeset
48
 (defgeneric make-compressed-stream (&optional stream))
9fa3b9154bb2 add pod/containerfile, rm pod/buildah, some work on zstd
Richard Westhaver <ellis@rwest.io>
parents: 435
diff changeset
49
 (defgeneric make-decompressed-stream (&optional stream))
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
50
 (defgeneric compress-object (self))
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
51
 (defgeneric decompress-object (self))
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
52
 
470
c6caddf91c72 zstdd and zstdc
Richard Westhaver <ellis@rwest.io>
parents: 441
diff changeset
53
 (defgeneric compress (input output state))
c6caddf91c72 zstdd and zstdc
Richard Westhaver <ellis@rwest.io>
parents: 441
diff changeset
54
 (defgeneric decompress (input output state))
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
55
 
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
56
 ;; decompress
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
57
 
400
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
58
 ;;; Compression
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
59
 
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
60
 ;; AKA 'DEFLATE'
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
61
 
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
62
 ;; compress-octet
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
63
 ;; compress-octet-vector
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
64
 
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
65
 ;; finish-compression (finish-output?)
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
66
 ;; with-compressor
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
67
 ;; reset-compressor
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
68
 
441
9fa3b9154bb2 add pod/containerfile, rm pod/buildah, some work on zstd
Richard Westhaver <ellis@rwest.io>
parents: 435
diff changeset
69
 ;; make-compressed-stream
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
70
 
441
9fa3b9154bb2 add pod/containerfile, rm pod/buildah, some work on zstd
Richard Westhaver <ellis@rwest.io>
parents: 435
diff changeset
71
 (defclass compressor () ())
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
72
 
441
9fa3b9154bb2 add pod/containerfile, rm pod/buildah, some work on zstd
Richard Westhaver <ellis@rwest.io>
parents: 435
diff changeset
73
 (defclass compressed-stream (fundamental-binary-stream)
9fa3b9154bb2 add pod/containerfile, rm pod/buildah, some work on zstd
Richard Westhaver <ellis@rwest.io>
parents: 435
diff changeset
74
   ())
400
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
75
 
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
76
 ;;; Decompression
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
77
 
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
78
 ;; AKA 'INFLATE'
400
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
79
 
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
80
 ;; From chipz:
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
81
 ;; We provide several convenience functions for decompression:
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
82
 ;;
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
83
 ;; * decompress a buffer to a newly-consed buffer;
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
84
 ;; * decompress a stream to a newly-consed buffer;
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
85
 ;; * decompress a pathname to a newly-consed buffer;
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
86
 ;; * decompress a buffer to a user-specified buffer;
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
87
 ;; * decompress a buffer to a stream;
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
88
 ;; * decompress a stream to a stream.
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
89
 ;; * decompress a pathname to another pathname;
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
90
 ;; * decompress a pathname to a stream;
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
91
 ;;
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
92
 ;; We do not provide stream->buffer decompression, as we have no way of
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
93
 ;; knowing how much to read from the stream to fill the buffer, no way
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
94
 ;; of determining what to do with possible state left in the
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
95
 ;; INFLATE-STATE that we used, etc.  Application-specific logic will
122554547517 init flate.lisp
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
96
 ;; have to handle those bits.
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
97
 
441
9fa3b9154bb2 add pod/containerfile, rm pod/buildah, some work on zstd
Richard Westhaver <ellis@rwest.io>
parents: 435
diff changeset
98
 ;; make-decompressed-stream
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
99
 ;; decompress-octet
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
100
 ;; decompress-octet-vector
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
101
 
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
102
 (defclass decompressor () ())
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
103
 
441
9fa3b9154bb2 add pod/containerfile, rm pod/buildah, some work on zstd
Richard Westhaver <ellis@rwest.io>
parents: 435
diff changeset
104
 (defclass decompressed-stream (fundamental-binary-stream)
9fa3b9154bb2 add pod/containerfile, rm pod/buildah, some work on zstd
Richard Westhaver <ellis@rwest.io>
parents: 435
diff changeset
105
   ())
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
106
 
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
107
 ;;; API
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
108
 
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
109
 ;; zstd-stream
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 400
diff changeset
110
 ;; zstd-file