;;; -*- Mode:Lisp; Readtable:ZL; Package:FILE-SYSTEM; Base:10; Patch-File:T -*-
;;; Patch file for Local-File version 74.3
;;; Reason:
;;;  Ignore :super-image keyword on OPEN.
;;; Written 23-Jun-88 18:16:34 by pld at site Gigamos Cambridge
;;; while running on Claude Debussy from band 2
;;; with Experimental System 124.69, Experimental Local-File 74.2, Experimental File-Server 23.1, Experimental Unix-Interface 12.0, Experimental ZMail 72.0, Experimental Tape 23.6, Experimental Lambda-Diag 16.2, microcode 1756, SDU Boot Tape 3.14, SDU ROM 102, K 124.



; From modified file DJ: L.FILE; FSGUTS.LISP#444 at 23-Jun-88 18:16:47
#10R FILE-SYSTEM#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: FILE; FSGUTS  "

(DEFUN LMFS-OPEN-FILE (PATHNAME DIRECTORY NAME TYPE VERSION
		       &KEY (ERROR T) (DIRECTION :INPUT) (CHARACTERS :default)
		       (BYTE-SIZE :DEFAULT) DELETED PRESERVE-DATES
		       (ELEMENT-TYPE 'STRING-CHAR ELEMENT-TYPE-P)
		       (IF-EXISTS (IF (MEMQ (PATHNAME-VERSION PATHNAME)
					    ;; :UNSPECIFIC here is to prevent lossage
					    ;; writing ITS files with no version numbers.
					    '(:NEWEST :UNSPECIFIC))
				      :NEW-VERSION :SUPERSEDE)
				  IF-EXISTS-P)
		       (IF-DOES-NOT-EXIST
			 (COND ((MEMQ DIRECTION '(:PROBE :PROBE-DIRECTORY :PROBE-LINK))
				NIL)
			       ((AND (MEMQ DIRECTION '(:OUTPUT :IO))
				     (NOT (MEMQ IF-EXISTS '(:OVERWRITE :APPEND))))
				:CREATE)
			       ;; Note: if DIRECTION is NIL, this defaults to :ERROR
			       ;; for compatibility with the past.
			       ;; A Common-Lisp program would use :PROBE
			       ;; and get NIL as the default for this.
			       (T :ERROR)))
		       ;;The following are ignored
		       INHIBIT-LINKS super-image
		       &AUX FILE INITIAL-PLIST OLD-FILE
		       PHONY-CHARACTERS SIGN-EXTEND-BYTES)
  "Implements the :OPEN message for local-file pathnames."
  (declare (ignore inhibit-links))
  (declare (ignore super-image))
 ;  ESTIMATED-LENGTH
  (IDENTIFY-FILE-OPERATION :OPEN
    (HANDLING-ERRORS ERROR
      (CASE DIRECTION
	((:INPUT :OUTPUT :IO :PROBE-DIRECTORY))
	((NIL :PROBE :PROBE-LINK) (SETQ DIRECTION :PROBE))
	(T (FERROR 'UNIMPLEMENTED-OPTION "~S is not a valid DIRECTION argument" DIRECTION)))
      (UNLESS (MEMQ IF-EXISTS '(:ERROR :NEW-VERSION :RENAME :RENAME-AND-DELETE
				:OVERWRITE :APPEND :SUPERSEDE NIL))
	(FERROR 'UNIMPLEMENTED-OPTION "~S is not a valid IF-EXISTS argument" IF-EXISTS))
      (UNLESS (MEMQ IF-DOES-NOT-EXIST
		    '(:ERROR :CREATE NIL))
	(FERROR 'UNIMPLEMENTED-OPTION
		"~S is not a valid IF-DOES-NOT-EXISTS argument" IF-EXISTS))
      (WHEN ELEMENT-TYPE-P
	(SETF (VALUES CHARACTERS BYTE-SIZE PHONY-CHARACTERS SIGN-EXTEND-BYTES)
	      (DECODE-ELEMENT-TYPE ELEMENT-TYPE BYTE-SIZE)))
      (IF (OR PHONY-CHARACTERS SIGN-EXTEND-BYTES)
	  (FERROR 'UNIMPLEMENTED-OPTION "~S as element-type is not implemented."
		  ELEMENT-TYPE))
      (IF (NOT (MEMQ BYTE-SIZE '(16. 8 4 2 1 :DEFAULT)))
	  (LM-SIGNAL-ERROR 'INVALID-BYTE-SIZE))
      (SETF (VALUES FILE OLD-FILE)
	    (LOOKUP-FILE DIRECTORY NAME TYPE VERSION
			 (AND (NEQ DIRECTION :PROBE-DIRECTORY) IF-DOES-NOT-EXIST)
			 (AND (MEMQ DIRECTION '(:OUTPUT :IO))
			      IF-EXISTS)
			 (NEQ DIRECTION :PROBE) DELETED))
      (WHEN (IF FILE (OR (NOT (MEMQ DIRECTION '(:OUTPUT :IO))) IF-EXISTS)
	      (OR (EQ DIRECTION :PROBE-DIRECTORY) IF-DOES-NOT-EXIST))
	(WHEN OLD-FILE
	  (SELECTQ IF-EXISTS
	    (:RENAME
	     (LMFS-RENAME-FILE OLD-FILE DIRECTORY
			       (STRING-APPEND "_OLD_" NAME) TYPE :NEWEST))
	    (:RENAME-AND-DELETE 
	     (LMFS-RENAME-FILE OLD-FILE DIRECTORY
			       (STRING-APPEND "_OLD_" NAME) TYPE :NEWEST)
	     (LMFS-DELETE-FILE OLD-FILE NIL))))
	;; Empty out the file, if supposed to.
	(WHEN (EQ IF-EXISTS :TRUNCATE)
	  (LET ((NBLOCKS (MAP-NBLOCKS (FILE-MAP FILE))))
	    (SETF (MAP-NBLOCKS (FILE-MAP FILE)) 0)
	    ;; Write the directory showing the file empty.
	    (WRITE-DIRECTORY-FILES (FILE-DIRECTORY FILE))
	    (SETF (MAP-NBLOCKS (FILE-MAP FILE)) NBLOCKS)
	    ;; Then mark the blocks free.
	    (USING-PUT
	      (CHANGE-MAP-DISK-SPACE (FILE-MAP FILE)
				     (IF (FILE-DELETED? FILE) PUT-RESERVED PUT-USED)
				     PUT-FREE))
	    (SETF (MAP-NBLOCKS (FILE-MAP FILE)) 0)))
	(SELECTQ DIRECTION
	  ((:PROBE :INPUT)
	   (IF (EQ CHARACTERS :DEFAULT)
	       (SETQ CHARACTERS (FILE-ATTRIBUTE FILE :CHARACTERS)))
	   (COND ((NULL BYTE-SIZE)
		  (SETQ BYTE-SIZE (IF CHARACTERS 8 16.)))
		 ((EQ BYTE-SIZE :DEFAULT)
		  (SETQ BYTE-SIZE (FILE-DEFAULT-BYTE-SIZE FILE)))))
	  ((:OUTPUT :IO)
	   (if (eq characters :default)
	       (setq characters t))
	   (IF (MEMQ BYTE-SIZE '(:DEFAULT NIL))
	       (SETQ BYTE-SIZE (IF CHARACTERS 8 16.)))
	   (SETF (FILE-DEFAULT-BYTE-SIZE FILE) BYTE-SIZE)
	   (SETF (FILE-ATTRIBUTE FILE :CHARACTERS) CHARACTERS)
	   (UNLESS PRESERVE-DATES
	     (SETF (FILE-CREATION-DATE-INTERNAL FILE)
		   (TIME:GET-UNIVERSAL-TIME)))
	   (LMFS-CHANGE-FILE-PROPERTIES FILE INITIAL-PLIST)))
	(IF (EQ DIRECTION :PROBE-DIRECTORY)
	    (MAKE-INSTANCE 'LM-PROBE-STREAM
			   :TRUENAME (SEND PATHNAME :NEW-PATHNAME
					    :NAME NIL :TYPE NIL :VERSION NIL)
			   :PATHNAME PATHNAME)
	  (MAKE-INSTANCE
	    (SELECTQ DIRECTION
	      (:INPUT (IF CHARACTERS 'LM-CHARACTER-INPUT-STREAM 'LM-INPUT-STREAM))
	      (:OUTPUT (IF CHARACTERS 'LM-CHARACTER-OUTPUT-STREAM 'LM-OUTPUT-STREAM))
	      (:IO (IF CHARACTERS 'LM-CHARACTER-IO-STREAM 'LM-IO-STREAM))
	      ((:PROBE :PROBE-DIRECTORY) 'LM-PROBE-STREAM))
	    :FILE FILE
	    :IF-EXISTS IF-EXISTS
	    :PATHNAME PATHNAME
	    :BYTE-SIZE BYTE-SIZE))))))

))
