optparse: Expose function for printing options.
authorMark Wooding <mdw@distorted.org.uk>
Tue, 3 Jul 2007 12:04:45 +0000 (13:04 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 3 Jul 2007 12:20:09 +0000 (13:20 +0100)
Also don't fail if no help is defined, and make the test program output
a little more useful.

optparse-test
optparse.lisp

index 83662c2..4441483 100755 (executable)
@@ -48,7 +48,7 @@
             (:arg "OBJECT")
             (read opt-object)
             (:doc (concatenate 'string
             (:arg "OBJECT")
             (read opt-object)
             (:doc (concatenate 'string
-                               "Read object ("
+                               "Read object (time = "
                                (princ-to-string (get-universal-time))
                                ")")))
            (#\k "keyword" (:arg "KEYWORD") (keyword opt-keyword)
                                (princ-to-string (get-universal-time))
                                ")")))
            (#\k "keyword" (:arg "KEYWORD") (keyword opt-keyword)
index 8a8fc43..37d27de 100644 (file)
@@ -849,15 +849,9 @@ Ambiguous long option `~A' -- could be any of:~{~%  --~A~}"
        (format stream "~{~A ~:_~}" (listify u)))
       (pprint-newline :mandatory stream))))
 
        (format stream "~{~A ~:_~}" (listify u)))
       (pprint-newline :mandatory stream))))
 
-(defun show-help (prog ver usage opts &optional (stream *standard-output*))
-  "Basic help-showing function.  PROG is the program name, probably from
-   *command-line-strings*.  VER is the program's version number.  USAGE is a
-   list of the possible usages of the program, each of which may be a list of
-   items to be supplied.  OPTS is the list of supported options, as provided
-   to the options parser.  STREAM is the stream to write on."
-  (format stream "~A, version ~A~2%" prog ver)
-  (show-usage prog usage stream)
-  (terpri stream)
+(defun show-options-help (opts &optional (stream *standard-output*))
+  "Write help for OPTS to the STREAM.  This is the core of the `show-help'
+   function."
   (let (newlinep)
     (dolist (o opts)
       (let ((doc (opt-documentation o)))
   (let (newlinep)
     (dolist (o opts)
       (let ((doc (opt-documentation o)))
@@ -885,6 +879,17 @@ Ambiguous long option `~A' -- could be any of:~{~%  --~A~}"
                 (print-text doc stream))
               (terpri stream)))))))
 
                 (print-text doc stream))
               (terpri stream)))))))
 
+(defun show-help (prog ver usage opts &optional (stream *standard-output*))
+  "Basic help-showing function.  PROG is the program name, probably from
+   *command-line-strings*.  VER is the program's version number.  USAGE is a
+   list of the possible usages of the program, each of which may be a list of
+   items to be supplied.  OPTS is the list of supported options, as provided
+   to the options parser.  STREAM is the stream to write on."
+  (format stream "~A, version ~A~2%" prog ver)
+  (show-usage prog usage stream)
+  (terpri stream)
+  (show-options-help opts stream))
+
 (defun sanity-check-option-list (opts)
   "Check the option list OPTS for basic sanity.  Reused short and long option
    names are diagnosed.  Maybe other problems will be reported later.
 (defun sanity-check-option-list (opts)
   "Check the option list OPTS for basic sanity.  Reused short and long option
    names are diagnosed.  Maybe other problems will be reported later.
@@ -926,6 +931,7 @@ Ambiguous long option `~A' -- could be any of:~{~%  --~A~}"
   (show-help *program-name* *version* *usage* *options*)
   (typecase *help*
     (string (terpri) (write-string *help*))
   (show-help *program-name* *version* *usage* *options*)
   (typecase *help*
     (string (terpri) (write-string *help*))
+    (null nil)
     ((or function symbol) (terpri) (funcall *help*)))
   (format t "~&")
   (exit 0))
     ((or function symbol) (terpri) (funcall *help*)))
   (format t "~&")
   (exit 0))