xref: /csrg-svn/usr.bin/pascal/libpc/ERROR.c (revision 1648)
1*1648Smckusick /* Copyright (c) 1979 Regents of the University of California */
2*1648Smckusick 
3*1648Smckusick static char sccsid[] = "@(#)ERROR.c 1.1 10/30/80";
4*1648Smckusick 
5*1648Smckusick #include	"stdio.h"
6*1648Smckusick #include	"signal.h"
7*1648Smckusick #include	"h01errs.h"
8*1648Smckusick 
9*1648Smckusick /*
10*1648Smckusick  * Routine ERROR is called from the runtime library when a runtime error
11*1648Smckusick  * occurs. Its arguments are the internal number of the error which occurred,
12*1648Smckusick  * and an error specific piece of error data. The error file is constructed
13*1648Smckusick  * from errdata by the makefile using the editor script make.ed1.
14*1648Smckusick  */
15*1648Smckusick ERROR(errnum, errdata)
16*1648Smckusick 
17*1648Smckusick 	long		errnum;
18*1648Smckusick 	union cvt {
19*1648Smckusick 		long	longdat;
20*1648Smckusick 		char	*strngdat;
21*1648Smckusick 		double	dbldat;
22*1648Smckusick 	} errdata;
23*1648Smckusick {
24*1648Smckusick 	PFLUSH();
25*1648Smckusick 	fputc('\n',stderr);
26*1648Smckusick 	SETRACE();
27*1648Smckusick 	switch (errnum) {
28*1648Smckusick 	case ECHR:
29*1648Smckusick 		fprintf(stderr, "Argument to chr of %d is out of range\n"
30*1648Smckusick 			,errdata.longdat);
31*1648Smckusick 		return(errdata.longdat);
32*1648Smckusick 	case EHALT:
33*1648Smckusick 		fputs("Call to procedure halt\n",stderr);
34*1648Smckusick 		PCEXIT(0);
35*1648Smckusick 	case ENILPTR:
36*1648Smckusick 		fputs("Pointer value out of legal range\n",stderr);
37*1648Smckusick 		return(0);
38*1648Smckusick 	case EPASTEOF:
39*1648Smckusick 		fprintf(stderr,"%s: Tried to read past end of file\n"
40*1648Smckusick 			,errdata.strngdat);
41*1648Smckusick 		return(0);
42*1648Smckusick 	case EREADIT:
43*1648Smckusick 		fprintf(stderr,"%s: Attempt to read, but open for writing\n"
44*1648Smckusick 			,errdata.strngdat);
45*1648Smckusick 		return(0);
46*1648Smckusick 	case EWRITEIT:
47*1648Smckusick 		fprintf(stderr,"%s: Attempt to write, but open for reading\n"
48*1648Smckusick 			,errdata.strngdat);
49*1648Smckusick 		return(0);
50*1648Smckusick 	case ECLOSE:
51*1648Smckusick 		fprintf(stderr,"%s: Close failed\n",errdata.strngdat);
52*1648Smckusick 		return(0);
53*1648Smckusick 	case ELLIMIT:
54*1648Smckusick 		fprintf(stderr,"%s: Line limit exceeded\n",errdata.strngdat);
55*1648Smckusick 		return(0);
56*1648Smckusick 	case ESQRT:
57*1648Smckusick 		fprintf(stderr,"Negative argument of %E to sqrt\n"
58*1648Smckusick 			,errdata.dbldat);
59*1648Smckusick 		return(errdata.dbldat);
60*1648Smckusick 	case EREFINAF:
61*1648Smckusick 		fprintf(stderr,"%s: ",errdata.strngdat);
62*1648Smckusick 	case ENOFILE:
63*1648Smckusick 		fputs("Reference to an inactive file\n",stderr);
64*1648Smckusick 		return(0);
65*1648Smckusick 	case EWRITE:
66*1648Smckusick 		fputs("Could not write to ",stderr);
67*1648Smckusick 		perror(errdata.strngdat);
68*1648Smckusick 		return(0);
69*1648Smckusick 	case EOPEN:
70*1648Smckusick 		fputs("Could not open ",stderr);
71*1648Smckusick 		perror(errdata.strngdat);
72*1648Smckusick 		return(0);
73*1648Smckusick 	case ECREATE:
74*1648Smckusick 		fputs("Could not create ",stderr);
75*1648Smckusick 		perror(errdata.strngdat);
76*1648Smckusick 		return(0);
77*1648Smckusick 	case EREMOVE:
78*1648Smckusick 		fputs("Could not remove ",stderr);
79*1648Smckusick 		perror(errdata.strngdat);
80*1648Smckusick 		return(0);
81*1648Smckusick 	case ESEEK:
82*1648Smckusick 		fputs("Could not reset ",stderr);
83*1648Smckusick 		perror(errdata.strngdat);
84*1648Smckusick 		return(0);
85*1648Smckusick 	case ENAMESIZE:
86*1648Smckusick 		fprintf(stderr,"%s: File name too long\n",errdata.strngdat);
87*1648Smckusick 		return(0);
88*1648Smckusick 	case ELN:
89*1648Smckusick 		fprintf(stderr,"Non-positive argument of %E to ln\n"
90*1648Smckusick 			,errdata.dbldat);
91*1648Smckusick 		return(errdata.dbldat);
92*1648Smckusick 	case EBADINUM:
93*1648Smckusick 		fprintf(stderr,"%s: Bad data found on integer read\n"
94*1648Smckusick 			,errdata.strngdat);
95*1648Smckusick 		return(0);
96*1648Smckusick 	case EBADFNUM:
97*1648Smckusick 		fprintf(stderr,"%s: Bad data found on real read\n"
98*1648Smckusick 			,errdata.strngdat);
99*1648Smckusick 		return(0);
100*1648Smckusick 	case ENUMNTFD:
101*1648Smckusick 		fprintf(stderr,
102*1648Smckusick 			"Unknown name \"%s\" found on enumerated type read\n",
103*1648Smckusick 			errdata.strngdat);
104*1648Smckusick 		return(0);
105*1648Smckusick 	case ENAMRNG:
106*1648Smckusick 		fprintf(stderr,
107*1648Smckusick 			"Enumerated type value of %d is out of range on output\n",
108*1648Smckusick 			errdata.longdat);
109*1648Smckusick 		return(errdata.longdat);
110*1648Smckusick 	case EFMTSIZE:
111*1648Smckusick 		fprintf(stderr,"Negative format width: %d\n",errdata.longdat);
112*1648Smckusick 		return(0);
113*1648Smckusick 	case EGOTO:
114*1648Smckusick 		fputs("Active frame not found in non-local goto\n", stderr);
115*1648Smckusick 		return(0);
116*1648Smckusick 	case ECASE:
117*1648Smckusick 		fprintf(stderr,"Label of %d not found in case\n"
118*1648Smckusick 			,errdata.longdat);
119*1648Smckusick 		return(errdata.longdat);
120*1648Smckusick 	case EOUTOFMEM:
121*1648Smckusick 		fputs("Ran out of memory\n",stderr);
122*1648Smckusick 		return(0);
123*1648Smckusick 	case ECTLWR:
124*1648Smckusick 		fprintf(stderr, "Range lower bound of %d out of set bounds\n",
125*1648Smckusick 			errdata.longdat);
126*1648Smckusick 		return(0);
127*1648Smckusick 	case ECTUPR:
128*1648Smckusick 		fprintf(stderr, "Range upper bound of %d out of set bounds\n",
129*1648Smckusick 			errdata.longdat);
130*1648Smckusick 		return(0);
131*1648Smckusick 	case ECTSNG:
132*1648Smckusick 		fprintf(stderr, "Value of %d out of set bounds\n",
133*1648Smckusick 			errdata.longdat);
134*1648Smckusick 		return(0);
135*1648Smckusick 	case ENARGS:
136*1648Smckusick 		if (errdata.longdat < 0)
137*1648Smckusick 			fprintf(stderr,
138*1648Smckusick 				"There were %d too few arguments to formal routine\n",
139*1648Smckusick 				-errdata.longdat);
140*1648Smckusick 		else
141*1648Smckusick 			fprintf(stderr,
142*1648Smckusick 				"There were %d too many arguments to formal routine\n",
143*1648Smckusick 				errdata.longdat);
144*1648Smckusick 		return(0);
145*1648Smckusick 	case EARGV:
146*1648Smckusick 		fprintf(stderr,"Argument to argv of %d is out of range\n"
147*1648Smckusick 			,errdata.longdat);
148*1648Smckusick 		return(errdata.longdat);
149*1648Smckusick 	case EPACK:
150*1648Smckusick 		fprintf(stderr,"i = %d: Bad i to pack(a,i,z)\n"
151*1648Smckusick 			,errdata.longdat);
152*1648Smckusick 		return(errdata.longdat);
153*1648Smckusick 	case EUNPACK:
154*1648Smckusick 		fprintf(stderr,"i = %d: Bad i to unpack(z,a,i)\n"
155*1648Smckusick 			,errdata.longdat);
156*1648Smckusick 		return(errdata.longdat);
157*1648Smckusick 	case ERANGE:
158*1648Smckusick 		fprintf(stderr,"Value of %d is out of range\n",errdata.longdat);
159*1648Smckusick 		return(errdata.longdat);
160*1648Smckusick 	case ESUBSC:
161*1648Smckusick 		fprintf(stderr,"Subscript value of %d is out of range\n"
162*1648Smckusick 			,errdata.longdat);
163*1648Smckusick 		return(errdata.longdat);
164*1648Smckusick 	case EASRT:
165*1648Smckusick 		fprintf(stderr,"Assertion failed: %s\n",errdata.strngdat);
166*1648Smckusick 		return(0);
167*1648Smckusick 	case ESTLIM:
168*1648Smckusick 		fprintf(stderr,
169*1648Smckusick 			"Statement count limit exceeded, %d statements executed\n",
170*1648Smckusick 			errdata.longdat);
171*1648Smckusick 		return(errdata.longdat);
172*1648Smckusick 	default:
173*1648Smckusick 		fputs("Panic: unknown error\n",stderr);
174*1648Smckusick 		return(0);
175*1648Smckusick 	}
176*1648Smckusick }
177