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