xref: /csrg-svn/old/lisp/fp/fp.vax/handlers.l (revision 21729)
112068Sbaden ;  FP interpreter/compiler
212068Sbaden ;  Copyright (c) 1982  Scott B. Baden
312068Sbaden ;  Berkeley, California
4*21729Sdist ;
5*21729Sdist ;  Copyright (c) 1982 Regents of the University of California.
6*21729Sdist ;  All rights reserved.  The Berkeley software License Agreement
7*21729Sdist ;  specifies the terms and conditions for redistribution.
8*21729Sdist ;
9*21729Sdist (setq SCCS-handlers.l "@(#)handlers.l	5.1 (Berkeley) 05/31/85")
1012068Sbaden 
1112068Sbaden ;; Handlers snarfed from FRANZ
1212068Sbaden 
1312068Sbaden ; special atoms:
1412068Sbaden (declare (special debug-level-count break-level-count
1512068Sbaden 		  errlist tpl-errlist user-top-level
1612068Sbaden 		  franz-not-virgin piport ER%tpl ER%all
1712068Sbaden 		  $ldprint ptport infile
1812068Sbaden 		  top-level-eof * ** *** + ++ +++ ^w)
1912068Sbaden 	 (macros t))
2012068Sbaden 
2112068Sbaden (eval-when (compile eval load)
2212068Sbaden   (or (get 'fpMacs 'loaded) (load 'fpMacs)))
2312068Sbaden 
2412068Sbaden 
2512068Sbaden ; this is the break handler, it should be tied to
2612068Sbaden ; ER%tpl always.
2712068Sbaden ; it is entered if there is an error which no one wants to handle.
2812068Sbaden ; We loop forever, printing out our error level until someone
2912068Sbaden ; types a ^D which goes to the next break level above us (or the
3012068Sbaden ; top-level if there are no break levels above us.
3112068Sbaden ; a (return n) will return that value to the error message
3212068Sbaden ; which called us, if that is possible (that is if the error is
3312068Sbaden ; continuable)
3412068Sbaden ;
3512068Sbaden (def break-err-handler
3612068Sbaden   (lexpr (n)
3712068Sbaden 	 ((lambda (message break-level-count retval rettype ^w)
3812068Sbaden 		  (setq piport nil)
3912068Sbaden 		  (cond ((greaterp n 0)
4012068Sbaden 			 (cond ((eq (cadddr (arg 1)) '|NAMESTACK OVERFLOW|)
4112068Sbaden 
4212068Sbaden 				(msg N "non-terminating" (N 2) '? N)
4312068Sbaden 				(cond
4412068Sbaden 				 (ptport
4512068Sbaden 				  (let ((scriptName (truename ptport)))
4612068Sbaden 				       (resetio)
4712068Sbaden 				       (setq ptport (outfile scriptName 'append))
4812068Sbaden 				       (cond ((null ptport)
4912068Sbaden 					      (msg "can't reopen script-file "
5012068Sbaden 						   scriptName
5112068Sbaden 						   N))))))
5212068Sbaden 				(and (null ptport) (resetio))
5312068Sbaden 				(reset)))
5412068Sbaden 			 (print 'Error:)
5512068Sbaden 			 (mapc '(lambda (a) (patom " ") (patom a) )
5612068Sbaden 			       (cdddr (arg 1)))
5712068Sbaden 			 (terpr)
5812068Sbaden 			 (cond ((caddr (arg 1)) (setq rettype 'contuab))
5912068Sbaden 			       (t (setq rettype nil))))
6012068Sbaden 			(t (setq rettype 'localcall)))
6112068Sbaden 
6212068Sbaden 		  (do nil (nil)
6312068Sbaden 		      (cond ((dtpr
6412068Sbaden 			      (setq
6512068Sbaden 			       retval
6612068Sbaden 			       (*catch
6712068Sbaden 				'break-catch
6812068Sbaden 				(do ((form)) (nil)
6912068Sbaden 				    (patom "<")
7012068Sbaden 				    (patom break-level-count)
7112068Sbaden 				    (patom ">: ")
7212068Sbaden 				    (cond ((eq top-level-eof
7312068Sbaden 					       (setq form (read nil top-level-eof)))
7412068Sbaden 					   (cond ((null (status isatty))
7512068Sbaden 						  (exit)))
7612068Sbaden 					   (eval 1)		; force interrupt check
7712068Sbaden 					   (return (sub1 break-level-count)))
7812068Sbaden 					  ((and (dtpr form) (eq 'return (car form)))
7912068Sbaden 					   (cond ((or (eq rettype 'contuab)
8012068Sbaden 						      (eq rettype 'localcall))
8112068Sbaden 						  (return (ncons (eval (cadr form)))))
8212068Sbaden 						 (t (patom "Can't continue from this error")
8312068Sbaden 						    (terpr))))
8412068Sbaden 					  ((and (dtpr form) (eq 'retbrk (car form)))
8512068Sbaden 					   (cond ((numberp (setq form (eval (cadr form))))
8612068Sbaden 						  (return form))
8712068Sbaden 						 (t (return (sub1 break-level-count)))))
8812068Sbaden 					  (t (print (eval form))
8912068Sbaden 					     (terpr)))))))
9012068Sbaden 			     (return (cond ((eq rettype 'localcall)
9112068Sbaden 					    (car retval))
9212068Sbaden 					   (t retval))))
9312068Sbaden 			    ((lessp retval break-level-count)
9412068Sbaden 			     (setq tpl-errlist errlist)
9512068Sbaden 			     (*throw 'break-catch retval))
9612068Sbaden 			    (t (terpr)))))
9712068Sbaden 	  nil
9812068Sbaden 	  (add1 break-level-count)
9912068Sbaden 	  nil
10012068Sbaden 	  nil
10112068Sbaden 	  nil)))
10212068Sbaden 
10312068Sbaden 
10412068Sbaden 
10512068Sbaden ; this reset function is designed to work with the franz-top-level.
10612068Sbaden ; When franz-top-level begins, it makes franz-reset be reset.
10712068Sbaden ; when a reset occurs now, we set the global variable tpl-errlist to
10812068Sbaden ; the current value of errlist and throw to top level.  At top level,
10912068Sbaden ; then tpl-errlist will be evaluated.
11012068Sbaden ;
11112068Sbaden (def franz-reset
11212068Sbaden   (lambda nil
11312068Sbaden 	  (setq tpl-errlist errlist)
11412068Sbaden 	  (errset (*throw 'top-level-catch '?)
11512068Sbaden 		  nil)
11612068Sbaden 	  (old-reset-function)))
11712068Sbaden 
11812068Sbaden 
11912068Sbaden 
12012068Sbaden ;---- autoloader functions
12112068Sbaden 
12212068Sbaden 
12312068Sbaden (def undef-func-handler
12412068Sbaden   (lambda (args)
12512068Sbaden 	  (prog (funcnam file n)
12612068Sbaden 		(setq funcnam (caddddr args))
12712068Sbaden 		(setq n (nreverse (explode (setq funcnam (caddddr args)))))
12812068Sbaden 		(cond ((and (not (greaterp 4 (length n)))
12912068Sbaden 			    (eq 'pf_ (implode `(,(car n) ,(cadr n) ,(caddr n)))))
13012068Sbaden 		       (cond ((and ptport (null infile)) (terpri ptport)))
13112068Sbaden 		       (msg N (implode (nreverse (cdddr n))) " not defined"
13212068Sbaden 			    N)
13312068Sbaden 		       (bottom))
13412068Sbaden 		      (t
13512068Sbaden 		       (cond ((symbolp funcnam)
13612068Sbaden 			      (cond ((setq file (get funcnam 'autoload))
13712068Sbaden 				     (cond ($ldprint
13812068Sbaden 					    (patom "[autoload ") (patom file)
13912068Sbaden 					    (patom "]")(terpr)))
14012068Sbaden 				     (load file))
14112068Sbaden 				    (t (return nil)))
14212068Sbaden 			      (cond ((getd funcnam) (return (ncons funcnam)))
14312068Sbaden 				    (t (patom "Autoload file does not contain func ")
14412068Sbaden 				       (return nil))))))))))
14512068Sbaden 
14612068Sbaden 
14712068Sbaden 
14812068Sbaden (defun break-resp (x)		; reset on a break (handled like inf recursion)
14912068Sbaden   (msg (N 2) "       [break]" (N 2) '? N)
15012068Sbaden   (cond
15112068Sbaden    (ptport
15212068Sbaden     (let ((scriptName (truename ptport)))
15312068Sbaden 	 (resetio)
15412068Sbaden 	 (setq ptport (outfile scriptName 'append))
15512068Sbaden 	 (cond ((null ptport)
15612068Sbaden 		(msg "can't reopen script-file " scriptName N))))))
15712068Sbaden   (and (null ptport) (resetio))
15812068Sbaden   (reset))
15912068Sbaden 
160