src/main.lisp @ 84fa1724b747
default tip
More work on the Huffman encoder and basic project skeleton
author |
Steve Losh <steve@stevelosh.com> |
date |
Sun, 26 Jul 2020 16:49:17 -0400 |
parents |
a3237e7f8fc8 |
children |
(none) |
(in-package :tdcb/main)
(defparameter *version* "0.0.0")
(defparameter *compressors* (make-hash-table :test #'equal))
(defparameter *extractors* (make-hash-table :test #'equal))
(defun ensure-compressor (name summary function)
(setf (gethash name *compressors*) (cons summary function)))
(defun ensure-extractor (name summary function)
(setf (gethash name *extractors*) (cons summary function)))
(defparameter *option-help*
(adopt:make-option 'help
:help "Print help and exit."
:long "help"
:short #\h
:reduce (constantly t)))
(defparameter *option-version*
(adopt:make-option 'version
:help "Print version information and exit."
:long "version"
:reduce (constantly t)))
(defparameter *option-algorithms*
(adopt:make-option 'algorithms
:help "Print a list of available algorithms and exit."
:long "algorithms"
:short #\A
:reduce (constantly t)))
(adopt:define-string *help-compress*
"This program compresses files using one of a variety of compression algorithms.~@
~@
Use --algorithms to view a list of available algorithms.")
(adopt:define-string *help-extract*
"This program extracts files that were compressed using one of a variety of ~
compression algorithms.~@
~@
Use --algorithms to view a list of available algorithms.")
(defparameter *compress-ui*
(adopt:make-interface
:name "c"
:summary "compress files with a variety of algorithms"
:usage "ALGORITHM [OPTIONS] [FILE...]"
:help *help-compress*
:contents (list
*option-help*
*option-version*
*option-algorithms*)))
(defparameter *extract-ui*
(adopt:make-interface
:name "e"
:summary "extract files with a variety of algorithms"
:usage "ALGORITHM [OPTIONS] [FILE...]"
:help *help-extract*
:contents (list
*option-help*
*option-version*
*option-algorithms*)))
(defun print-algorithms (algorithms)
(maphash (lambda (name value)
(format t "~A - ~A" name (first value)))
algorithms))
(defun toplevel (ui algorithms)
(handler-case
(handler-bind ((adopt:unrecognized-option #'adopt:treat-as-argument))
(multiple-value-bind (arguments options) (adopt:parse-options ui)
(cond
((gethash 'help options) (adopt:print-help-and-exit ui))
((gethash 'version options) (write-line *version*) (adopt:exit))
((gethash 'algorithms options) (print-algorithms algorithms) (adopt:exit))
((null arguments) (adopt:print-help-and-exit ui :stream *error-output* :exit-code 1))
(t (let ((algorithm (gethash (first arguments) algorithms)))
(if algorithm
(funcall (second algorithm) (rest arguments))
(error "Unknown algorithm ~S." (first arguments))))))))
(error (e) (adopt:print-error-and-exit e))))
(defun build/compress ()
(sb-ext:save-lisp-and-die "c"
:executable t
:save-runtime-options t
:toplevel (lambda () (toplevel *compress-ui* *compressors*))))
(defun build/extract ()
(sb-ext:save-lisp-and-die
"e"
:executable t
:save-runtime-options t
:toplevel (lambda () (toplevel *extract-ui* *extractors*))))