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