;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:8; Patch-File:T -*-
;;; Patch file for System version 123.280
;;; Reason:
;;;  Thank you, Bob Kerns, for fixing the compiler bug that caused SI:INTERNAL-READ
;;;  to be mis-compiled.  This patch recompiles that function....
;;; Written 13-May-88 10:22:58 by pld at site Gigamos Cambridge
;;; while running on Azathoth from band 3
;;; with Experimental System 123.279, Experimental Local-File 73.6, Experimental FILE-Server 22.5, Experimental Unix-Interface 11.0, Experimental KERMIT 34.3, Experimental ZMail 71.2, Experimental Lambda-Diag 15.0, Experimental Tape 22.4, microcode 1756, SDU Boot Tape 3.14, SDU ROM 8, the old ones.



; From file DJ: L.IO; READ.LISP#462 at 13-May-88 10:22:59
#8R SYSTEM-INTERNALS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: IO; READ  "

(DEFUN INTERNAL-READ (&OPTIONAL (STREAM *STANDARD-INPUT*)
		      (EOF-ERRORP T) EOF-VALUE RECURSIVE-P
		      PRESERVE-WHITESPACE DISCARD-CLOSEPARENS CHECK-INDENTATION
		      &AUX W-O)
  "Read an s-expression from STREAM and return it.
End of file within an s-expression is an error.
End of file with no s-expression seen is controlled by EOF-ERRORP.
T means it is an error then too.  NIL means that end of file
with no s-expression returns EOF-VALUE.

RECURSIVE-P non-NIL is used for recursive calls, e.g. from read macro definitions.
Recursive calls must be distinguished to make READ-PRESERVING-WHITESPACE
and #n= /"labels/" work properly.

PRESERVE-WHITESPACE if non-NIL says do not discard the terminating delimiter even
if it is whitespace.  This argument is ignored if RECURSIVE-P is non-NIL,
and the outer, nonrecursive call gets to control the matter.

DISCARD-CLOSEPARENS if non-NIL says if we see a close paren
just keep reading past it, with no error.

CHECK-INDENTATION controls whether indentation is checked within this
s-expression.  If RECURSIVE-P is non-NIL, this argument is ignored
and the outer, nonrecursive call gets to control the matter."
  (COND ((EQ STREAM T) (SETQ STREAM *TERMINAL-IO*))
	((EQ STREAM NIL) (SETQ STREAM *STANDARD-INPUT*)))
  (LET-IF (NOT RECURSIVE-P)
	  ((XR-LABEL-BINDINGS NIL)
	   (READ-PRESERVE-DELIMITERS PRESERVE-WHITESPACE)
	   (READ-CHECK-INDENTATION CHECK-INDENTATION)
	   (XR-XRTYI-LAST-CHAR #/RETURN)
	   (XR-XRTYI-PREV-CHAR NIL)
	   (READ-STREAM STREAM)
	   (MISSING-CLOSEPAREN-REPORTED NIL))
    (SETQ W-O (SEND STREAM ':WHICH-OPERATIONS))
    (COND ((MEMQ ':READ W-O)
	   (SEND STREAM ':READ NIL))
;	  ((AND (NOT RECURSIVE-P) (NEQ RUBOUT-HANDLER STREAM) (MEMQ ':RUBOUT-HANDLER W-O))
;	   (WITH-INPUT-EDITING (STREAM '((:ACTIVATION CHAR= #/END)))
;	     (INTERNAL-READ STREAM EOF-ERRORP EOF-VALUE T)))
	  ((PROG (THING TYPE XR-SHARP-ARGUMENT)
	       A (MULTIPLE-VALUE (THING TYPE) (XR-READ-THING STREAM))
		 (COND ((EQ TYPE 'READER-MACRO)
			(LET ((XR-LIST-SO-FAR ':TOPLEVEL)
			      (XR-SPLICE-P NIL)
			      VALUES)
			  (SETQ VALUES (INVOKE-READER-MACRO THING STREAM))
			  (IF (OR XR-SPLICE-P
				  ( (LENGTH VALUES) 1))
			      (GO A))
			  (RETURN (CAR VALUES))))
		       ((EQ TYPE 'SPECIAL-TOKEN)
			(COND ((EQ THING 'EOF)
			       (IF EOF-ERRORP
				   (CERROR :NO-ACTION NIL 'READ-END-OF-FILE
				     "End of file encountered by the reader on stream ~S."
				     STREAM)
				 (RETURN EOF-VALUE)))
			      ((AND DISCARD-CLOSEPARENS
				    (EQ THING 'CLOSE))
			       (GO A))
			      (T
			       (READ-ERROR "The special token ~S was read in at top level."
					   THING))))
		       (T (RETURN THING))))))))

))
