1.1--- a/lisp/lib/io/flate.lisp Sat Jun 08 01:38:26 2024 -0400
1.2+++ b/lisp/lib/io/flate.lisp Sun Jun 09 02:04:18 2024 -0400
1.3@@ -25,16 +25,64 @@
1.4 (in-package :io/flate)
1.5
1.6 ;;; Vars
1.7+(defparameter *compression-buffer-size* 4096)
1.8+(defparameter *decompression-buffer-size* 4096)
1.9
1.10 ;;; Utils
1.11
1.12+;;; Proto
1.13+(deferror flate-error () () (:auto t))
1.14+
1.15+(deferror compression-error (flate-error) () (:auto t))
1.16+(deferror decompression-error (flate-error) () (:auto t))
1.17+
1.18+(defgeneric finish-compression (self))
1.19+(defgeneric finish-decompression (self))
1.20+;; TODO 2024-06-08: maybe move this to generic io/stream protocol - 'RESET'
1.21+(defgeneric reset-compressor (self))
1.22+(defgeneric reset-decompressor (self))
1.23+(defgeneric make-compressing-stream (compressor stream))
1.24+(defgeneric make-decompressing-stream (decompressor stream))
1.25+(defgeneric compress-object (self))
1.26+(defgeneric decompress-object (self))
1.27+
1.28+(defgeneric compress (input state output))
1.29+(defgeneric decompress (input state output))
1.30+
1.31+;; decompress
1.32+
1.33 ;;; Compression
1.34
1.35-;; (Deflate)
1.36+;; AKA 'DEFLATE'
1.37+
1.38+;; compress-octet
1.39+;; compress-octet-vector
1.40+
1.41+;; finish-compression (finish-output?)
1.42+;; with-compressor
1.43+;; reset-compressor
1.44+
1.45+;; make-compressing-stream
1.46+
1.47+(defclass compressor ()
1.48+ ((input
1.49+ :initarg :input
1.50+ :accessor compressor-input)
1.51+ (start
1.52+ :initarg :start
1.53+ :accessor compressor-start)
1.54+ (end
1.55+ :initarg :end
1.56+ :accessor compressor-end)))
1.57+
1.58+(defclass compressing-stream (fundamental-binary-output-stream)
1.59+ ((compressor
1.60+ :initarg :compressor
1.61+ :accessor compressor)))
1.62
1.63 ;;; Decompression
1.64
1.65-;; (Inflate)
1.66+;; AKA 'INFLATE'
1.67
1.68 ;; From chipz:
1.69 ;; We provide several convenience functions for decompression:
1.70@@ -53,3 +101,19 @@
1.71 ;; of determining what to do with possible state left in the
1.72 ;; INFLATE-STATE that we used, etc. Application-specific logic will
1.73 ;; have to handle those bits.
1.74+
1.75+;; make-decompressing-stream
1.76+;; decompress-octet
1.77+;; decompress-octet-vector
1.78+
1.79+(defclass decompressor () ())
1.80+
1.81+(defclass decompressing-stream (fundamental-binary-input-stream)
1.82+ ((decompressor
1.83+ :initarg :compressor
1.84+ :accessor decompressor)))
1.85+
1.86+;;; API
1.87+
1.88+;; zstd-stream
1.89+;; zstd-file