;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:8; Patch-File:T -*-
;;; Patch file for System version 123.185
;;; Reason:
;;;  Problem with rubout handler C-M-t -- Exchange Sexps: can try to
;;;  reference beyond active length of rubout handler buffer.
;;; Written 19-Jan-88 14:59:47 by pld at site Gigamos Cambridge
;;; while running on Jack Flanders from band 2
;;; with Experimental System 123.184, Experimental Local-File 73.3, Experimental FILE-Server 22.1, Experimental Unix-Interface 11.0, Experimental Tape 18.0, Experimental KERMIT 34.3, Experimental ZMail 71.0, Experimental Lambda-Diag 15.0, microcode 1754, SDU Boot Tape 3.12, SDU ROM 8.



; From modified file DJ: L.WINDOW; RH.LISP#189 at 19-Jan-88 15:03:19
#8R TV#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "TV")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: WINDOW; RH  "


(defun-rh rh-search-forward-sexp (pos)
  (declare (values new-pos success))
  (let* ((buffer rubout-handler-buffer)
	 (end (length buffer))
	 (new-pos (1- pos))
	 (c))
    (if (>= pos (1- end))
	(values pos nil)
      (labels ((new-c ()
		 (unless (= new-pos end)
		   (incf new-pos)
		   (setq c (elt buffer new-pos))))
	       (skip-atom ()
		 (loop
		   (when (= new-pos end)
		     (return))
		   (cond ((memq c '(#// #/\))
			  (new-c)
			  (new-c))
			 ((eq c #/|)
			  (skip-string #/|)
			  (new-c))
			 ((memq (zwei:char-syntax c zwei:*list-syntax-table*) `(,zwei:list-alphabetic ,zwei:list-colon))
			  (new-c))
			 (t
			  (decf new-pos)
			  (return)))))
	       (skip-string (delim)
		 (loop
		   (when (= new-pos end)
		     (return))
		   (new-c)
		   (when (eq c delim)
		     (return))))
	       (skip-list ()
		 (loop
		   (when (= new-pos end)
		     (return))
		   (new-c)
		   (when (= c #/()
		     (skip-list)
		     (new-c))
		   (when (= c #/))
		     (return))))
	       )
	(loop					;Skip initial whitespace
	  (when (= new-pos end)
	    (return-from rh-search-forward-sexp (values pos nil)))
	  (new-c)
	  (unless (or (member c '(#/space #/tab #/return))
		      (eq (zwei:char-syntax c zwei:*list-syntax-table*) zwei:list-single-quote))
	    (return)))
	(cond ((eq c #/")
	       (skip-string #/"))
	      ((eq c #/()
	       (skip-list))
	      ((eq c #/)))
	      (t
	       (skip-atom)))
	(values (min (1+ new-pos) end) t)))))

))

; From modified file DJ: L.WINDOW; RH.LISP#189 at 19-Jan-88 15:03:20
#8R TV#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "TV")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: WINDOW; RH  "


(defun-rh rh-search-backward-sexp (pos &optional (skip-leading-whitespace t))
  (declare (values new-pos success))
  (if (zerop pos)
      (values pos nil)
    (let* ((buffer rubout-handler-buffer)
	   (new-pos pos)
	   (c))
      (labels ((new-c ()
		 (unless (zerop new-pos)
		   (decf new-pos))
		      (setq c (elt buffer new-pos)))
	       (skip-atom ()
		 (loop
		   (cond ((eq c #/|)
			  (skip-string #/|)
			  (if (zerop new-pos)
			      (return)
			    (new-c)))
			 ((memq (zwei:char-syntax c zwei:*list-syntax-table*)
				`(,zwei:list-alphabetic ,zwei:list-colon ,zwei:list-slash))
			  (if (zerop new-pos)
			      (return)
			    (new-c)))
			 (t
			  (unless (zerop new-pos)
			    (new-c)
			    (unless (memq c '(#// #/\))
			      (incf new-pos)))
			  (incf new-pos)
			  (return)))))
	       (skip-string (delim)
		 (loop
		   (when (zerop new-pos)
		     (return))
		   (new-c)
		   (when (eq c delim)
		     (return))))
	       (skip-list ()
		 (loop
		   (when (zerop new-pos)
		     (return))
		   (new-c)
		   (when (= c #/))
		     (skip-list)
		     (new-c))
		   (when (= c #/()
		     (return))))
	       )
	(loop					;Skip trailing whitespace
	  (when (zerop new-pos)
	    (return))
	  (new-c)
	  (unless (member c '(#/space #/tab #/return))
	    (return)))
	(cond ((eq c #/")
	       (skip-string #/"))
	      ((eq c #/))
	       (skip-list))
	      ((eq c #/())
	      (t
	       (skip-atom)))
	(loop
	  (when (zerop new-pos)
	    (return))
	  (new-c)
	  (when (or (member c '(#/space #/tab #/return))
		    (neq (zwei:char-syntax c zwei:*list-syntax-table*) zwei:list-single-quote))
	    (incf new-pos)
	    (return)))
	(when skip-leading-whitespace
	  (loop					;Skip leading whitespace
	    (when (zerop new-pos)
	      (return))
	    (new-c)
	    (unless (member c '(#/space #/tab #/return))
	      (incf new-pos)
	      (return))))
	(values (max new-pos 0) t)))))

))
