From 5a64d91b912d7794a9aa56ac781d04029a94a405 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 19 Apr 2008 22:32:08 +0100 Subject: [PATCH] Track changes to runlisp. sys-base is now less dependent on runlisp for setting itself up. It doesn't run as well as it does through runlisp but it does at least work. (The code in sys-base is a clone-and-hack job of the guts of runlisp: try to keep them in sync.) Runlisp renamed its command-line arguments variable, to avoid the annoying conflict with CMU CL's ext:*command-line-strings*; track this change. --- optparse-test | 5 +---- optparse.lisp | 20 ++++++++++---------- sys-base.lisp | 48 ++++++++++++++++++++++++++++-------------------- 3 files changed, 39 insertions(+), 34 deletions(-) diff --git a/optparse-test b/optparse-test index 4f3ad5f..cd1c4f9 100755 --- a/optparse-test +++ b/optparse-test @@ -91,7 +91,4 @@ (format t "keyword: ~S~%" opt-keyword) (format t "enum: ~S~%" opt-enum) (format t "object: ~S~%" opt-object)) -(test (cdr *command-line-strings*)) - - - +(test (cdr *command-line*)) diff --git a/optparse.lisp b/optparse.lisp index 37d27de..6e06fc0 100644 --- a/optparse.lisp +++ b/optparse.lisp @@ -28,7 +28,7 @@ (defpackage #:optparse (:use #:common-lisp #:mdw.base #:mdw.sys-base #:mdw.str) - (:export #:exit #:*program-name* #:*command-line-strings* + (:export #:exit #:*program-name* #:*command-line* #:moan #:die #:option #:optionp #:make-option #:opt-short-name #:opt-long-name #:opt-tag #:opt-negated-tag @@ -136,7 +136,7 @@ (:constructor make-option-parser (&key ((:args argstmp) - (cdr *command-line-strings*)) + (cdr *command-line*)) (options *options*) (non-option :skip) ((:numericp numeric-p)) @@ -152,7 +152,7 @@ "An option parser object. Slots: ARGS The arguments to be parsed. Usually this will be - *command-line-strings*. + *command-line*. OPTIONS List of option structures describing the acceptable options. @@ -840,9 +840,9 @@ Ambiguous long option `~A' -- could be any of:~{~% --~A~}" (defun show-usage (prog usage &optional (stream *standard-output*)) "Basic usage-showing function. PROG is the program name, probably from - *command-line-strings*. USAGE is a list of possible usages of the - program, each of which is a list of items to be supplied by the user. In - simple cases, a single string is sufficient." + *command-line*. USAGE is a list of possible usages of the program, each + of which is a list of items to be supplied by the user. In simple cases, + a single string is sufficient." (pprint-logical-block (stream nil :prefix "Usage: ") (dolist (u (listify usage)) (pprint-logical-block (stream nil :prefix (format nil "~A " prog)) @@ -881,10 +881,10 @@ Ambiguous long option `~A' -- could be any of:~{~% --~A~}" (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." + *command-line*. 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) diff --git a/sys-base.lisp b/sys-base.lisp index e973e90..359da3f 100644 --- a/sys-base.lisp +++ b/sys-base.lisp @@ -25,17 +25,37 @@ (defpackage #:runlisp (:use #:common-lisp) - (:export #:*lisp-interpreter* #:*command-line-strings* #:run) - #+cmu (:import-from #:ext #:*command-line-strings*)) -(defvar runlisp:*command-line-strings* '("")) - + (:export #:*raw-command-line* #:*command-line* #:exit) + #+clisp (:import-from #:ext #:exit)) (defpackage #:mdw.sys-base (:use #:common-lisp #:runlisp) - (:export #:exit #:hard-exit #:*program-name* #:*command-line-strings*) - (:import-from #:runlisp #:*lisp-interpreter* #:*command-line-strings*) - #+clisp (:import-from #:ext #:exit)) + (:export #:exit #:hard-exit #:*program-name* #:*command-line*) + (:import-from #:runlisp #:*raw-command-line* #:*command-line* #:exit)) (in-package #:mdw.sys-base) +(defvar *raw-command-line* + (or #+cmu ext:*command-line-strings* + #+sbcl sb-ext:*posix-argv* + #+ecl (loop from i below (ext:argc) collect (ext:argv i)) + #+clisp (coerce (ext:argv) 'list) + '("" "--" ""))) + +(defvar *command-line* + (or (cdr (member "--" *raw-command-line* :test #'string=)) + *raw-command-line*)) + +#-clisp +(unless (fboundp 'exit) + (defun exit (&optional (code 0)) + "Polite way to end a program." + #+(or cmu ecl) (ext:quit code) + #+sbcl (sb-ext:quit :unix-status code) + #-(or cmu ecl sbcl) + (progn + (unless (zerop code) + (format t "~&Exiting unsuccessfully with code ~D.~%" code)) + (abort)))) + (defun hard-exit (&optional (code 0)) "Stops the program immediately in its tracks. Does nothing else. Use after fork, for example, to avoid flushing buffers." @@ -44,20 +64,8 @@ #+sbcl (sb-ext:quit :unix-status code :recklessly-p t) #+(or clisp ecl) (ext:quit code)) -#-clisp -(defun exit (&optional (code 0)) - "Polite way to end a program. If running in an interactive Lisp, just - return to the top-level REPL." - (if (boundp '*lisp-interpreter*) - #+(or cmu ecl) (ext:quit code) - #+sbcl (sb-ext:quit :unix-status code) - (progn - (unless (zerop code) - (format t "~&Exiting unsuccessfully with code ~D.~%" code)) - (abort)))) - (defvar *program-name* - (pathname-name (car *command-line-strings*)) + (pathname-name (car *command-line*)) "A plausible guess at the program's name, stripped of strange extensions.") ;;;----- That's all, folks -------------------------------------------------- -- 2.11.0