xref: /csrg-svn/old/lisp/fp/fp.vax/handlers.l (revision 12068)
1*12068Sbaden (setq SCCS-handlers.l "@(#)handlers.l	1.1	04/27/83")
2*12068Sbaden ;  FP interpreter/compiler
3*12068Sbaden ;  Copyright (c) 1982  Scott B. Baden
4*12068Sbaden ;  Berkeley, California
5*12068Sbaden 
6*12068Sbaden ;; Handlers snarfed from FRANZ
7*12068Sbaden 
8*12068Sbaden ; special atoms:
9*12068Sbaden (declare (special debug-level-count break-level-count
10*12068Sbaden 		  errlist tpl-errlist user-top-level
11*12068Sbaden 		  franz-not-virgin piport ER%tpl ER%all
12*12068Sbaden 		  $ldprint ptport infile
13*12068Sbaden 		  top-level-eof * ** *** + ++ +++ ^w)
14*12068Sbaden 	 (macros t))
15*12068Sbaden 
16*12068Sbaden (eval-when (compile eval load)
17*12068Sbaden   (or (get 'fpMacs 'loaded) (load 'fpMacs)))
18*12068Sbaden 
19*12068Sbaden 
20*12068Sbaden ; this is the break handler, it should be tied to
21*12068Sbaden ; ER%tpl always.
22*12068Sbaden ; it is entered if there is an error which no one wants to handle.
23*12068Sbaden ; We loop forever, printing out our error level until someone
24*12068Sbaden ; types a ^D which goes to the next break level above us (or the
25*12068Sbaden ; top-level if there are no break levels above us.
26*12068Sbaden ; a (return n) will return that value to the error message
27*12068Sbaden ; which called us, if that is possible (that is if the error is
28*12068Sbaden ; continuable)
29*12068Sbaden ;
30*12068Sbaden (def break-err-handler
31*12068Sbaden   (lexpr (n)
32*12068Sbaden 	 ((lambda (message break-level-count retval rettype ^w)
33*12068Sbaden 		  (setq piport nil)
34*12068Sbaden 		  (cond ((greaterp n 0)
35*12068Sbaden 			 (cond ((eq (cadddr (arg 1)) '|NAMESTACK OVERFLOW|)
36*12068Sbaden 
37*12068Sbaden 				(msg N "non-terminating" (N 2) '? N)
38*12068Sbaden 				(cond
39*12068Sbaden 				 (ptport
40*12068Sbaden 				  (let ((scriptName (truename ptport)))
41*12068Sbaden 				       (resetio)
42*12068Sbaden 				       (setq ptport (outfile scriptName 'append))
43*12068Sbaden 				       (cond ((null ptport)
44*12068Sbaden 					      (msg "can't reopen script-file "
45*12068Sbaden 						   scriptName
46*12068Sbaden 						   N))))))
47*12068Sbaden 				(and (null ptport) (resetio))
48*12068Sbaden 				(reset)))
49*12068Sbaden 			 (print 'Error:)
50*12068Sbaden 			 (mapc '(lambda (a) (patom " ") (patom a) )
51*12068Sbaden 			       (cdddr (arg 1)))
52*12068Sbaden 			 (terpr)
53*12068Sbaden 			 (cond ((caddr (arg 1)) (setq rettype 'contuab))
54*12068Sbaden 			       (t (setq rettype nil))))
55*12068Sbaden 			(t (setq rettype 'localcall)))
56*12068Sbaden 
57*12068Sbaden 		  (do nil (nil)
58*12068Sbaden 		      (cond ((dtpr
59*12068Sbaden 			      (setq
60*12068Sbaden 			       retval
61*12068Sbaden 			       (*catch
62*12068Sbaden 				'break-catch
63*12068Sbaden 				(do ((form)) (nil)
64*12068Sbaden 				    (patom "<")
65*12068Sbaden 				    (patom break-level-count)
66*12068Sbaden 				    (patom ">: ")
67*12068Sbaden 				    (cond ((eq top-level-eof
68*12068Sbaden 					       (setq form (read nil top-level-eof)))
69*12068Sbaden 					   (cond ((null (status isatty))
70*12068Sbaden 						  (exit)))
71*12068Sbaden 					   (eval 1)		; force interrupt check
72*12068Sbaden 					   (return (sub1 break-level-count)))
73*12068Sbaden 					  ((and (dtpr form) (eq 'return (car form)))
74*12068Sbaden 					   (cond ((or (eq rettype 'contuab)
75*12068Sbaden 						      (eq rettype 'localcall))
76*12068Sbaden 						  (return (ncons (eval (cadr form)))))
77*12068Sbaden 						 (t (patom "Can't continue from this error")
78*12068Sbaden 						    (terpr))))
79*12068Sbaden 					  ((and (dtpr form) (eq 'retbrk (car form)))
80*12068Sbaden 					   (cond ((numberp (setq form (eval (cadr form))))
81*12068Sbaden 						  (return form))
82*12068Sbaden 						 (t (return (sub1 break-level-count)))))
83*12068Sbaden 					  (t (print (eval form))
84*12068Sbaden 					     (terpr)))))))
85*12068Sbaden 			     (return (cond ((eq rettype 'localcall)
86*12068Sbaden 					    (car retval))
87*12068Sbaden 					   (t retval))))
88*12068Sbaden 			    ((lessp retval break-level-count)
89*12068Sbaden 			     (setq tpl-errlist errlist)
90*12068Sbaden 			     (*throw 'break-catch retval))
91*12068Sbaden 			    (t (terpr)))))
92*12068Sbaden 	  nil
93*12068Sbaden 	  (add1 break-level-count)
94*12068Sbaden 	  nil
95*12068Sbaden 	  nil
96*12068Sbaden 	  nil)))
97*12068Sbaden 
98*12068Sbaden 
99*12068Sbaden 
100*12068Sbaden ; this reset function is designed to work with the franz-top-level.
101*12068Sbaden ; When franz-top-level begins, it makes franz-reset be reset.
102*12068Sbaden ; when a reset occurs now, we set the global variable tpl-errlist to
103*12068Sbaden ; the current value of errlist and throw to top level.  At top level,
104*12068Sbaden ; then tpl-errlist will be evaluated.
105*12068Sbaden ;
106*12068Sbaden (def franz-reset
107*12068Sbaden   (lambda nil
108*12068Sbaden 	  (setq tpl-errlist errlist)
109*12068Sbaden 	  (errset (*throw 'top-level-catch '?)
110*12068Sbaden 		  nil)
111*12068Sbaden 	  (old-reset-function)))
112*12068Sbaden 
113*12068Sbaden 
114*12068Sbaden 
115*12068Sbaden ;---- autoloader functions
116*12068Sbaden 
117*12068Sbaden 
118*12068Sbaden (def undef-func-handler
119*12068Sbaden   (lambda (args)
120*12068Sbaden 	  (prog (funcnam file n)
121*12068Sbaden 		(setq funcnam (caddddr args))
122*12068Sbaden 		(setq n (nreverse (explode (setq funcnam (caddddr args)))))
123*12068Sbaden 		(cond ((and (not (greaterp 4 (length n)))
124*12068Sbaden 			    (eq 'pf_ (implode `(,(car n) ,(cadr n) ,(caddr n)))))
125*12068Sbaden 		       (cond ((and ptport (null infile)) (terpri ptport)))
126*12068Sbaden 		       (msg N (implode (nreverse (cdddr n))) " not defined"
127*12068Sbaden 			    N)
128*12068Sbaden 		       (bottom))
129*12068Sbaden 		      (t
130*12068Sbaden 		       (cond ((symbolp funcnam)
131*12068Sbaden 			      (cond ((setq file (get funcnam 'autoload))
132*12068Sbaden 				     (cond ($ldprint
133*12068Sbaden 					    (patom "[autoload ") (patom file)
134*12068Sbaden 					    (patom "]")(terpr)))
135*12068Sbaden 				     (load file))
136*12068Sbaden 				    (t (return nil)))
137*12068Sbaden 			      (cond ((getd funcnam) (return (ncons funcnam)))
138*12068Sbaden 				    (t (patom "Autoload file does not contain func ")
139*12068Sbaden 				       (return nil))))))))))
140*12068Sbaden 
141*12068Sbaden 
142*12068Sbaden 
143*12068Sbaden (defun break-resp (x)		; reset on a break (handled like inf recursion)
144*12068Sbaden   (msg (N 2) "       [break]" (N 2) '? N)
145*12068Sbaden   (cond
146*12068Sbaden    (ptport
147*12068Sbaden     (let ((scriptName (truename ptport)))
148*12068Sbaden 	 (resetio)
149*12068Sbaden 	 (setq ptport (outfile scriptName 'append))
150*12068Sbaden 	 (cond ((null ptport)
151*12068Sbaden 		(msg "can't reopen script-file " scriptName N))))))
152*12068Sbaden   (and (null ptport) (resetio))
153*12068Sbaden   (reset))
154*12068Sbaden 
155