;;; -*- Mode:Lisp; Readtable:T; Package:USER; Base:8; Patch-File:T -*- ;;; Patch file for System version 124.118 ;;; Reason: ;;; FQUERY fixes. Aside from various logic improvements: ;;; ;;; 1. now works with :TYPE :READLINE option. ;;; ;;; 2. :ANY choice is handled better in prompt and help string. FQUERY will ;;; display "anything, Y, or N" when :ANY is the first or intermediate ;;; choice. You see "F, Z, or anything else" when :ANY is last. ;;; ;;; ;;; 3. You can specify :ANY for the entire choice-list, which is just like ;;; (:ANY) -- only one choice, "type anything". ;;; ;;; --Keith + PLD ;;; Written 28-Jun-88 16:48:21 by keith (Keith Corbett) at site Gigamos Cambridge ;;; while running on Breaking Glass from band 1 ;;; with Experimental System 124.115, Experimental Local-File 74.3, Experimental File-Server 23.1, Experimental Unix-Interface 12.0, Experimental ZMail 72.1, Experimental Tape 23.6, Experimental Lambda-Diag 16.2, Tiger 28.0, microcode 1761, SDU Boot Tape 3.14, SDU ROM 103, Beta 3 plus patches. ; From modified file DJ: L.IO1; FQUERY.LISP#59 at 28-Jun-88 16:48:52 #8R FORMAT#: (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FORMAT"))) (COMPILER::PATCH-SOURCE-FILE "SYS: IO1; FQUERY  " (DEFUN FQUERY-DECODE-OPTIONS (&KEY (MAKE-COMPLETE T) (TYPE :TYI) (CHOICES Y-OR-N-P-CHOICES) STREAM BEEP CLEAR-INPUT (FRESH-LINE T) (CONDITION 'FQUERY) SIGNAL-CONDITION (LIST-CHOICES T) SELECT ;no longer used (HELP-FUNCTION 'DEFAULT-FQUERY-HELP) DEFAULT-VALUE TIMEOUT) SIGNAL-CONDITION SELECT (let((choices (if (eq choices :any) '(:any) choices))) (VALUES MAKE-COMPLETE TYPE CHOICES STREAM BEEP CLEAR-INPUT FRESH-LINE CONDITION LIST-CHOICES HELP-FUNCTION DEFAULT-VALUE TIMEOUT))) )) ; From modified file DJ: L.IO1; FQUERY.LISP#59 at 28-Jun-88 16:48:55 #8R FORMAT#: (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FORMAT"))) (COMPILER::PATCH-SOURCE-FILE "SYS: IO1; FQUERY  " (defun string-to-handle-any-as-choice(remaining-choices &optional first-p) (cond (remaining-choices "anything") (first-p "anything") (t "anything else"))) )) ; From modified file DJ: L.IO1; FQUERY.LISP#59 at 28-Jun-88 16:48:59 #8R FORMAT#: (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FORMAT"))) (COMPILER::PATCH-SOURCE-FILE "SYS: IO1; FQUERY  " (DEFUN FQUERY-PROMPT (STREAM &REST IGNORE) (AND FQUERY-FORMAT-STRING (APPLY #'FORMAT STREAM FQUERY-FORMAT-STRING FQUERY-FORMAT-ARGS)) (AND FQUERY-LIST-CHOICES (DO ((CHOICES FQUERY-CHOICES (CDR CHOICES)) (FIRST-P T NIL) (MANY (> (LENGTH FQUERY-CHOICES) 2)) (CHOICE)) ((NULL CHOICES) (OR FIRST-P (SEND STREAM :STRING-OUT ") "))) (SEND STREAM :STRING-OUT (COND (FIRST-P "(") ((NOT (NULL (CDR CHOICES))) ", ") (MANY ", or ") (T " or "))) (IF (EQ (CAR CHOICES) :ANY) (SEND STREAM :STRING-OUT (string-to-handle-any-as-choice (cdr choices) first-p)) (progn (SETQ CHOICE (CADAR CHOICES)) ; character lossage (COND ((TYPEP CHOICE '(OR NUMBER CHARACTER)) (FORMAT STREAM "~:@C" CHOICE)) ((EQUAL CHOICE "") (PRINC "nothing" STREAM)) (T (SEND STREAM :STRING-OUT CHOICE))))))) (AND FQUERY-TIMEOUT ;attempt to print out what will return default-value. (DO ((CHOICES FQUERY-CHOICES (CDR CHOICES)) (choice)) ((NULL CHOICES) (FORMAT STREAM "(Automatic default returns ~s after ~a) " fquery-default-value (time:print-interval-or-never (// fquery-timeout 60.) nil))) (setq choice (car choices)) (cond ((eq choice :any)) ((equal fquery-default-value (if (consp (car choice)) (caar choice) (car choice))) (return (format stream "(Automatic default after ~a, ~a) " (time:print-interval-or-never (// fquery-timeout 60.) nil) (cadr choice))))))) ) )) ; From modified file DJ: L.IO1; FQUERY.LISP#59 at 28-Jun-88 16:49:09 #8R FORMAT#: (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FORMAT"))) (COMPILER::PATCH-SOURCE-FILE "SYS: IO1; FQUERY  " (DEFUN DEFAULT-FQUERY-HELP (STREAM CHOICES TYPE) (declare(ignore TYPE)) ;Not used (DO ((CHOICES CHOICES (CDR CHOICES)) (FIRST-P T NIL) (CHOICE)) ((NULL CHOICES) (OR FIRST-P (SEND STREAM :STRING-OUT ") "))) (SEND STREAM :STRING-OUT (COND (FIRST-P "(Type ") ((NOT (NULL (CDR CHOICES))) ", ") (T " or "))) (SETQ CHOICE (CAR CHOICES)) (COND ((EQ CHOICE :ANY) (PRINC (string-to-handle-any-as-choice (cdr choices) first-p) STREAM)) (T ;;Print the first input which selects this choice. ;;Don't confuse the user by mentioning possible alternative inputs. ; character lossage (COND ((TYPEP (CADR CHOICE) '(OR NUMBER CHARACTER)) (FORMAT STREAM "~:@C" (CADR CHOICE))) ((EQUAL (CADR CHOICE) "") (PRINC "nothing" STREAM)) (T (SEND STREAM :STRING-OUT (CADR CHOICE)))) ;; If that would echo as something else, say so (IF (CONSP (CAR CHOICE)) (FORMAT STREAM " (~A)" (CADAR CHOICE))))))) )) ; From modified file DJ: L.IO1; FQUERY.LISP#59 at 28-Jun-88 16:49:13 #8R FORMAT#: (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FORMAT"))) (COMPILER::PATCH-SOURCE-FILE "SYS: IO1; FQUERY  " (DEFSELECT READLINE-FQUERY-FUNCTION (:READ (STREAM &AUX STRING) (labels ((read-it () (if (operation-handled-p stream :rubout-handler) (SETQ STRING (SEND STREAM :RUBOUT-HANDLER `((:EDITING-COMMAND ,(char-int #/Help) #/HELP) ;Just in case (:PROMPT FQUERY-PROMPT) (:DONT-SAVE T)) 'FQUERY-READLINE-WITH-HELP STREAM)) (setq string (send stream :line-in))) (STRING-TRIM '(#/SP) STRING))) (if (null fquery-timeout) (read-it) (with-timeout (fquery-timeout (values fquery-default-value t)) (read-it))))) (:ECHO (ECHO STREAM) ECHO STREAM) (:MEMBER (STRING LIST) (MEM #'STRING-EQUAL STRING LIST))) ))