+(defvar opt-format :bind
+ "Which format to use on output.")
+(defvar opt-debug nil
+ "Whether to emit stack backtraces on error.")
+
+(defun directory-exists-p (name)
+
+ ;; Make a pathname for NAME which has the right form for a directory.
+ (let ((dirpath
+ (let ((path (pathname name)))
+ (if (null (pathname-name path))
+ path
+ (make-pathname :directory
+ (append (or (pathname-directory path)
+ (list :relative))
+ (list (pathname-name path)))
+ :name nil
+ :type nil
+ :defaults path)))))
+
+ ;; Now check that it exists.
+ #+clisp (and (ext:probe-directory dirpath) (truename dirpath))
+ #-clisp (probe-file dirpath)))
+
+(eval-when (:compile-toplevel :load-toplevel)
+ (defopthandler dir (var arg) ()
+ (let ((path (directory-exists-p arg)))
+ (if (and path
+ (not (pathname-name path)))
+ (setf var path)
+ (option-parse-error "path `~A' doesn't name a directory." arg))))
+ (let ((duration-units (make-hash-table :test #'equal)))
+ (dolist (item '((("Gs") #.(* 1000 1000 1000))
+ (("Ms") #.(* 1000 1000))
+ (("ks") 1000)
+ (("hs") 100)
+ (("das") 10)
+ (("yr" "year" "years" "y") #.(* 365 24 60 60))
+ (("wk" "week" "weeks" "w") #.(* 7 24 60 60))
+ (("day" "days" "dy" "d") #.(* 24 60 60))
+ (("hr" "hour" "hours" "h") #.(* 60 60))
+ (("min" "minute" "minutes" "m") 60)
+ (("s" "second" "seconds" "sec" "") 1)))
+ (dolist (name (car item))
+ (setf (gethash name duration-units) (cadr item))))
+ (defopthandler dur (var arg) ()
+ (let ((len (length arg)))
+ (multiple-value-bind (n i) (parse-integer arg :junk-allowed t)
+ (unless n
+ (option-parse-error "invalid duration `~A': ~
+ integer expected" arg))
+ (loop (cond ((or (>= i len)
+ (not (whitespace-char-p (char arg i))))
+ (return))
+ (t
+ (incf i))))
+ (let ((u0 i))
+ (loop (cond ((or (>= i len)
+ (whitespace-char-p (char arg i)))
+ (return))
+ (t
+ (incf i))))
+ (let* ((u1 i)
+ (unit (subseq arg u0 u1))
+ (scale (gethash unit duration-units)))
+ (unless scale
+ (option-parse-error "invalid duration `~A': ~
+ unknown unit `~A'"
+ arg unit))
+ (setf var (* n scale)))))))))