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