;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:8; Patch-File:T -*-
;;; Private patches made by keith
;;; Reason:
;;;  Test - removed ART-Q-LIST from ZWEI for font-stack, use FIND instead of MEMQ
;;; Written 24-Sep-88 20:09:34 by keith (Keith Corbett) at site Gigamos Cambridge
;;; while running on Breaking Glass from band 1
;;; with Experimental System 126.91, Experimental ZMail 74.1, Experimental Local-File 76.0, Experimental File-Server 25.0, Experimental Unix-Interface 14.0, Experimental Tape 25.1, Experimental Lambda-Diag 18.0, Experimental ZWEI 126.11, microcode 1762, SDU Boot Tape 3.14, SDU ROM 103.



; From modified file DJ: L.ZWEI; DEFS.LISP#168 at 24-Sep-88 20:09:43
#8R ZWEI#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "ZWEI")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: ZWEI; DEFS  "

(DEFFLAVOR INTERVAL-STREAM-WITH-FONTS
	   ((*FONT-FLAG* NIL)
	    (**FONT** 0)
	    ;;;Changed *FONT-STACK* from ART-Q-LIST to normal array. -Keith 9/24/88 
	    (*FONT-STACK* (MAKE-ARRAY 50. ':TYPE 'ART-Q ':FILL-POINTER 0)))
	   (INTERVAL-STREAM)
  :INITABLE-INSTANCE-VARIABLES)

))

; From modified file DJ: L.ZWEI; METH.LISP#53 at 24-Sep-88 20:10:37
#8R ZWEI#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "ZWEI")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: ZWEI; METH  "

(DEFMETHOD (INTERVAL-STREAM-WITH-FONTS :TYI) (&OPTIONAL EOF &AUX CH)
  (COND ((STRINGP *FONT-FLAG*)
	 (SETQ CH (CHAR-INT (CHAR *FONT-FLAG* *INDEX*)))
	 (AND ( (SETQ *INDEX* (1+ *INDEX*)) *STOP-INDEX*)
	      (SETQ *FONT-FLAG* NIL
		    *INDEX* 0
		    *STOP-INDEX* (IF (EQ *LINE* *LAST-LINE*) *LAST-INDEX*
				   (LINE-LENGTH *LINE*))))
	 CH)
	((NULL *INDEX*)
	 (AND EOF (ERROR EOF)))
	((EQ *FONT-FLAG* T)
	 (SETQ *FONT-FLAG* NIL)
	 (+ #/0 **FONT**))
	((NUMBERP *FONT-FLAG*)
	 (PROG1 *FONT-FLAG*
		(SETQ *FONT-FLAG* NIL)))
	((< *INDEX* *STOP-INDEX*)
	 (SETQ CH (CHAR *LINE* *INDEX*))
	 (COND (( **FONT** (CHAR-FONT CH))
		(COND ((find (CHAR-FONT CH) *FONT-STACK*)
		       (SETQ **FONT** (VECTOR-POP *FONT-STACK*))
		       (SETQ *FONT-FLAG* #/*))
		      (T
		       (INTERVAL-WITH-FONTS-IO-PUSH-FONT)
		       (SETQ **FONT** (CHAR-FONT CH))
		       (SETQ *FONT-FLAG* T)))
		(CHAR-INT #/))
	       (T
		(SETQ *INDEX* (1+ *INDEX*))
		(IF ( (CHAR-CODE CH) (CHAR-CODE #/))
		    (CHAR-CODE CH)
		  (SETQ *FONT-FLAG* (CHAR-INT CH))))))
	((EQ *LINE* *LAST-LINE*)
	 (SETQ *INDEX* NIL)
	 (AND EOF (ERROR EOF)))
	((ANTICIPATE-FONT-POP))
	(T
	 (SETQ *LINE* (LINE-NEXT *LINE*))
	 (IF (SETQ CH (GETF (LINE-PLIST *LINE*) ':DIAGRAM))
	     (LET* ((STRING (SEND CH :STRING-FOR-FILE *LINE*))
		    (LENGTH (STRING-LENGTH STRING)))
	       (AND (PLUSP LENGTH)
		    (SETQ *FONT-FLAG* STRING
			  *INDEX* 0 *STOP-INDEX* LENGTH)))
	   (SETQ *INDEX* 0 *STOP-INDEX* (IF (EQ *LINE* *LAST-LINE*)
					    *LAST-INDEX*
					  (LINE-LENGTH *LINE*))))
	 (CHAR-INT #/NEWLINE))))

))

; From modified file DJ: L.ZWEI; METH.LISP#53 at 24-Sep-88 20:10:48
#8R ZWEI#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "ZWEI")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: ZWEI; METH  "

(DEFMETHOD (INTERVAL-STREAM-WITH-FONTS :LINE-IN) (&OPTIONAL SIZE EOF)
  (LET ((RET-LINE)
	(AT-END-P (EQ *LINE* *LAST-LINE*)))
    (COND ((AND (NULL SIZE)
		(NULL *FONT-FLAG*)
		(EQ 0 *INDEX*)
		(NOT AT-END-P))
	   (IF (AND (ZEROP **FONT**)
		    (DOTIMES (I (LINE-LENGTH *LINE*) T)
		      (OR (ZEROP (CHAR-FONT (CHAR *LINE* I)))
			  (RETURN NIL))))
	       ;; Easy case, line is all in font 0 and that font is current.
	       (SETQ RET-LINE *LINE*)
	     ;; Otherwise, look through actual line
	     ;; storing font changes into RET-LINE when needed.
	     (SETQ RET-LINE (MAKE-ARRAY (+ 8. (STRING-LENGTH *LINE*)) :FILL-POINTER 0
					:TYPE ART-STRING))
	     (DOTIMES (I (LINE-LENGTH *LINE*))
	       (LET ((CH (CHAR *LINE* I)))
		 (UNLESS (= (CHAR-FONT CH) **FONT**)
		   (COND ((find (CHAR-FONT CH) *FONT-STACK*)
			  (DO ()
			      ((= (CHAR-FONT CH) **FONT**))
			    (SETQ **FONT** (VECTOR-POP *FONT-STACK*))
			    (VECTOR-PUSH-EXTEND #/ RET-LINE)
			    (VECTOR-PUSH-EXTEND #/* RET-LINE)))
			 (T
			  (INTERVAL-WITH-FONTS-IO-PUSH-FONT)
			  (SETQ **FONT** (CHAR-FONT CH))
			  (VECTOR-PUSH-EXTEND #/ RET-LINE)
			  (VECTOR-PUSH-EXTEND (+ #/0 **FONT**) RET-LINE))))
		 (SETQ CH (CHAR-CODE CH))
		 (IF (= CH (CHAR-CODE #/))
		     (VECTOR-PUSH-EXTEND #/ RET-LINE))
		 (VECTOR-PUSH-EXTEND CH RET-LINE)))
	     ;; Do one or more * now if would otherwise happen after the next few Returns.
	     (DO ()
		 ((NOT (ANTICIPATE-FONT-POP)))
	       (VECTOR-PUSH-EXTEND #/ RET-LINE)
	       (VECTOR-PUSH-EXTEND #/* RET-LINE)
	       (SETQ *FONT-FLAG* NIL)))
	   (SETQ *LINE* (LINE-NEXT *LINE*))
	   (SETQ *STOP-INDEX* (IF (EQ *LINE* *LAST-LINE*)
				  *LAST-INDEX*
				(LINE-LENGTH *LINE*))))
	  ((NULL *INDEX*)
	   ;; End of file.
	   (SETQ RET-LINE (MAKE-STRING 0))
	   (AND EOF (ERROR EOF)))
	  (T
	   ;; Hard case; do it using our :TYI method.
	   (SETF (VALUES RET-LINE AT-END-P)
		 (STREAM-DEFAULT-HANDLER SELF :LINE-IN SIZE (LIST EOF)))
	   ;; If we are now processing the last line, set *INDEX* to NIL
	   ;; so the next :LINE-IN can get an error if desired.
	   (IF AT-END-P (SETQ *INDEX* NIL))))
    (VALUES RET-LINE AT-END-P)))

))

; From modified file DJ: L.ZWEI; METH.LISP#53 at 24-Sep-88 20:11:41
#8R ZWEI#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "ZWEI")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: ZWEI; METH  "

(DEFUN ANTICIPATE-FONT-POP ()
  (DECLARE (:SELF-FLAVOR INTERVAL-STREAM-WITH-FONTS))
  (DO ((LINE (LINE-NEXT *LINE*) (LINE-NEXT LINE))
       F)
      ((EQ LINE *LAST-LINE*))
    (OR (GETF (LINE-PLIST LINE) ':DIAGRAM)
	(ZEROP (LINE-LENGTH LINE))
	(RETURN (UNLESS (= **FONT** (SETQ F (CHAR-FONT (CHAR LINE 0))))
		  (WHEN (find F *FONT-STACK*)
		    (SETQ **FONT** (VECTOR-POP *FONT-STACK*))
		    (SETQ *FONT-FLAG* #/*)
		    #/))))))

))
