|
|
1.1 root 1: #include "global.h"
2: /* error ****************************************************************/
3: /* this routine is always called on a non-fatal error. The first argu- */
4: /* ment is printed out. The second a boolean flag indicating if the */
5: /* error routine is permitted to return a pointer to a lisp value if */
6: /* the "cont" command is executed. */
7:
8: /* error from lisp C code, this temporarily replaces the old error
9: * allowing us to interface with the new errset scheme with minimum
10: * difficulty. We assume that an error which comes to this routine
11: * is of an "undefined error type" ER%misc . Soon all calls to this
12: * routine will be removed.
13: *
14: */
15:
16: lispval
17: error(mesg,contvl)
18: char *mesg;
19: lispval contvl;
20: {
21: lispval errorh();
22:
23: return(errorh(Vermisc,mesg,nil,contvl,0));
24: }
25:
26:
27: /* new error handler, works with errset
28: *
29: * call is errorh(type,message,valret,contuab) where
30: * type is an atom which classifys the error, and whose clb, if not nil
31: * is the name of a function to call to handle the error.
32: * message is a character string to print to describe the error
33: * valret is the value to return to an errset if one is found,
34: * and contuab is non nil if this error is continuable.
35: */
36:
37: #include "catchframe.h"
38:
39: lispval
40: errorh(type,message,valret,contuab,uniqid)
41: lispval type,valret;
42: int uniqid,contuab;
43: char *message;
44: {
45: register struct catchfr *curp; /* must be first register decl */
46: register lispval handy;
47: lispval *work = 1 + (lispval *) &uniqid; int limit = nargs() - 5;
48: lispval Lread(), calhan();
49: struct argent *savedlbot = lbot;
50: struct nament * savedbnp = bnp;
51: int curdep ; /* error depth */
52: typedef struct catchfr *cp;
53: extern int errp;
54: int myerrp = errp, what;
55: int saveme[SAVSIZE];
56: snpand(2);
57:
58: if(type->clb != nil) /* if there is an error handler */
59: {
60: handy = calhan(limit,work,type->clb,uniqid,message);
61: if(contuab && (TYPE(handy) == DTPR))
62: return(handy->car);
63: }
64:
65: /* search stack for error catcher */
66:
67: for (curp = (cp) errp ; curp != (cp) nil ; curp = curp->link)
68: {
69: if((curp->labl == type)
70: || ( (TYPE(curp->labl) == DTPR) && (curp->labl->car == Verall)))
71: {
72: if((curp->flag != nil)
73: && (type != Vererr)) {
74: /* print the full error message */
75: printf("%s ",message);
76: while(limit-->0) {
77: printr(*work++,stdout);
78: fflush(stdout);
79: }
80: fputc('\n',stdout);
81: fflush(stdout);
82: }
83: popnames(curp->svbnp); /* un shallow bind */
84: errp = (int) curp->link; /* set error to next frame */
85: asm(" addl3 $16,r11,sp"); /* skip link,flag,labl,svbnp */
86: asm(" movc3 $40,(sp),_setsav");/*restore (return) context*/
87: asm(" movab 40(sp),sp"); /* skip past "" "" */
88: asm(" popr $0x2540"); /* restore registers */
89: asm(" movl 12(ap),r0"); /* set return value */
90: asm(" rsb"); /* return to errset */
91: /* NOT REACHED */
92: }
93: }
94:
95: /* no one will catch this error, we must see if there is an
96: error-goes-to-top-level catcher */
97:
98: if (Vertpl->clb != nil)
99: {
100:
101: handy = calhan(limit,work,Vertpl,uniqid,message);
102: if( contuab && (TYPE(handy) == DTPR))
103: return(handy->car);
104: }
105:
106: /* at this point, print error mssage and break, just like
107: the current error scheme */
108: printf("%s: ",message);
109: while(limit-->0) {
110: printr(*work++,stdout);
111: fflush(stdout);
112: }
113:
114: curdep = ++depth;
115: getexit(saveme);
116: while(what = setexit()) {
117: errp = myerrp;
118: depth = curdep;
119: switch(what) {
120: case BRRETB:
121: if (curdep == (int) contval) {
122: popnames(savedbnp);
123: lbot = savedlbot;
124: continue;
125: }
126: default:
127: resexit(saveme);
128: reset(what);
129:
130: case BRRETN:
131: if (contuab)
132: {
133: popnames(savedbnp);
134: lbot = savedlbot;
135: depth = curdep -1;
136: resexit(saveme);
137: return(contval);
138: }
139: printf("CAN'T CONTINUE\n");
140:
141: }
142: }
143: lbot = np;
144: np++->val = P(stdin);
145: np++->val = eofa;
146: while(TRUE) {
147:
148: fprintf(stdout,"\n%d:>",curdep);
149: dmpport(stdout);
150: vtemp = Lread();
151: if(vtemp == eofa) exit(0);
152: printr(eval(vtemp),stdout);
153: }
154: }
155: static lispval
156: calhan(limit,work,handler,uniqid,message)
157: register lispval *work;
158: lispval handler;
159: register limit;
160: register char *message;
161: int uniqid;
162: {
163: register lispval handy;
164: register struct argent *lbot, *np;
165: lbot = np;
166: protect(handler->clb); /* funcall the handler */
167: protect(handy = newdot()); /* with a list consisting of */
168: handy->car = inewint(uniqid); /* identifying number, */
169: handy = handy->cdr = newdot();
170: handy->car = matom(message); /* message to be typed out, */
171: while(limit-- > 0)
172: { /* any other args. */
173: handy = handy->cdr = newdot();
174: handy->car = *work++;
175: }
176: handy->cdr = nil;
177:
178: handy = Lfuncal();
179: np=lbot;
180: }
181:
182: /* lispend **************************************************************/
183: /* Fatal errors come here, with their epitaph. */
184: lispend(mesg)
185: char mesg[];
186: {
187: dmpport(poport);
188: fprintf(errport,"%s\n",mesg);
189: dmpport(errport);
190: exit(0);
191: }
192:
193: /* namerr ***************************************************************/
194: /* handles namestack overflow, at present by simply giving a message */
195:
196: namerr()
197: {
198: np -= 10;
199: error("NAMESTACK OVERFLOW",FALSE);
200: /* NOT REACHED */
201: }
202: binderr()
203: {
204: bnp -= 10;
205: error("Bindstack overflow.",FALSE);
206: }
207: rtaberr()
208: {
209: bindfix(Vreadtable,strtab,nil);
210: error("Illegal read table.",FALSE);
211: }
212: badmem()
213: {
214: error("Attempt to allocate beyond static structures.",FALSE);
215: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.