xref: /csrg-svn/usr.bin/pascal/libpc/ERROR.c (revision 3857)
11648Smckusick /* Copyright (c) 1979 Regents of the University of California */
21648Smckusick 
3*3857Smckusic static char sccsid[] = "@(#)ERROR.c 1.7 06/08/81";
41648Smckusick 
52179Smckusic #include	<stdio.h>
62179Smckusic #include	<signal.h>
72179Smckusic #include	"h00vars.h"
81648Smckusick #include	"h01errs.h"
91648Smckusick 
101648Smckusick /*
111648Smckusick  * Routine ERROR is called from the runtime library when a runtime error
121648Smckusick  * occurs. Its arguments are the internal number of the error which occurred,
131648Smckusick  * and an error specific piece of error data. The error file is constructed
141648Smckusick  * from errdata by the makefile using the editor script make.ed1.
151648Smckusick  */
163002Smckusic long
17*3857Smckusic ERROR(msg, d1, d2, d3, d4)
181648Smckusick 
19*3857Smckusic 	char	*msg;
20*3857Smckusic 	int	d1, d2, d3, d4;
21*3857Smckusic {
221648Smckusick 	union cvt {
23*3857Smckusic 		int	intdat;
241648Smckusick 		long	longdat;
251648Smckusick 		char	*strngdat;
261648Smckusick 		double	dbldat;
271648Smckusick 	} errdata;
28*3857Smckusic 
29*3857Smckusic 	errdata.dbldat = 0.0;
30*3857Smckusic 	errdata.intdat = d1;
311648Smckusick 	PFLUSH();
321648Smckusick 	fputc('\n',stderr);
331648Smckusick 	SETRACE();
34*3857Smckusic 	switch ((int)msg) {
351648Smckusick 	case ECHR:
363002Smckusic 		fprintf(stderr, "Argument to chr of %D is out of range\n"
371648Smckusick 			,errdata.longdat);
381648Smckusick 		return(errdata.longdat);
391648Smckusick 	case EHALT:
401648Smckusick 		fputs("Call to procedure halt\n",stderr);
411648Smckusick 		PCEXIT(0);
421648Smckusick 	case ENILPTR:
431648Smckusick 		fputs("Pointer value out of legal range\n",stderr);
441648Smckusick 		return(0);
451648Smckusick 	case EPASTEOF:
461648Smckusick 		fprintf(stderr,"%s: Tried to read past end of file\n"
471648Smckusick 			,errdata.strngdat);
481648Smckusick 		return(0);
491648Smckusick 	case EREADIT:
501648Smckusick 		fprintf(stderr,"%s: Attempt to read, but open for writing\n"
511648Smckusick 			,errdata.strngdat);
521648Smckusick 		return(0);
531648Smckusick 	case EWRITEIT:
541648Smckusick 		fprintf(stderr,"%s: Attempt to write, but open for reading\n"
551648Smckusick 			,errdata.strngdat);
561648Smckusick 		return(0);
571648Smckusick 	case ECLOSE:
581648Smckusick 		fprintf(stderr,"%s: Close failed\n",errdata.strngdat);
591648Smckusick 		return(0);
601648Smckusick 	case ELLIMIT:
611648Smckusick 		fprintf(stderr,"%s: Line limit exceeded\n",errdata.strngdat);
621648Smckusick 		return(0);
631648Smckusick 	case ESQRT:
643002Smckusic 		fprintf(stderr,"Negative argument of %e to sqrt\n"
651648Smckusick 			,errdata.dbldat);
661648Smckusick 		return(errdata.dbldat);
671648Smckusick 	case EREFINAF:
681648Smckusick 		fprintf(stderr,"%s: ",errdata.strngdat);
691648Smckusick 	case ENOFILE:
701648Smckusick 		fputs("Reference to an inactive file\n",stderr);
711648Smckusick 		return(0);
721648Smckusick 	case EWRITE:
731648Smckusick 		fputs("Could not write to ",stderr);
741648Smckusick 		perror(errdata.strngdat);
751648Smckusick 		return(0);
761648Smckusick 	case EOPEN:
771648Smckusick 		fputs("Could not open ",stderr);
781648Smckusick 		perror(errdata.strngdat);
791648Smckusick 		return(0);
801648Smckusick 	case ECREATE:
811648Smckusick 		fputs("Could not create ",stderr);
821648Smckusick 		perror(errdata.strngdat);
831648Smckusick 		return(0);
841648Smckusick 	case EREMOVE:
851648Smckusick 		fputs("Could not remove ",stderr);
861648Smckusick 		perror(errdata.strngdat);
871648Smckusick 		return(0);
881648Smckusick 	case ESEEK:
891648Smckusick 		fputs("Could not reset ",stderr);
901648Smckusick 		perror(errdata.strngdat);
911648Smckusick 		return(0);
921648Smckusick 	case ENAMESIZE:
931648Smckusick 		fprintf(stderr,"%s: File name too long\n",errdata.strngdat);
941648Smckusick 		return(0);
951648Smckusick 	case ELN:
963002Smckusic 		fprintf(stderr,"Non-positive argument of %e to ln\n"
971648Smckusick 			,errdata.dbldat);
981648Smckusick 		return(errdata.dbldat);
991648Smckusick 	case EBADINUM:
1001648Smckusick 		fprintf(stderr,"%s: Bad data found on integer read\n"
1011648Smckusick 			,errdata.strngdat);
1021648Smckusick 		return(0);
1031648Smckusick 	case EBADFNUM:
1041648Smckusick 		fprintf(stderr,"%s: Bad data found on real read\n"
1051648Smckusick 			,errdata.strngdat);
1061648Smckusick 		return(0);
1071648Smckusick 	case ENUMNTFD:
1081648Smckusick 		fprintf(stderr,
1091648Smckusick 			"Unknown name \"%s\" found on enumerated type read\n",
1101648Smckusick 			errdata.strngdat);
1111648Smckusick 		return(0);
1121648Smckusick 	case ENAMRNG:
1131648Smckusick 		fprintf(stderr,
1143002Smckusic 			"Enumerated type value of %D is out of range on output\n",
1151648Smckusick 			errdata.longdat);
1161648Smckusick 		return(errdata.longdat);
1171648Smckusick 	case EFMTSIZE:
1183178Smckusic 		fprintf(stderr,"Non-positive format width: %D\n",errdata.longdat);
1191648Smckusick 		return(0);
1201648Smckusick 	case EGOTO:
1211648Smckusick 		fputs("Active frame not found in non-local goto\n", stderr);
1221648Smckusick 		return(0);
1231648Smckusick 	case ECASE:
1243002Smckusic 		fprintf(stderr,"Label of %D not found in case\n"
1251648Smckusick 			,errdata.longdat);
1261648Smckusick 		return(errdata.longdat);
1271648Smckusick 	case EOUTOFMEM:
1281648Smckusick 		fputs("Ran out of memory\n",stderr);
1291648Smckusick 		return(0);
1301648Smckusick 	case EARGV:
1313002Smckusic 		fprintf(stderr,"Argument to argv of %D is out of range\n"
1321648Smckusick 			,errdata.longdat);
1331648Smckusick 		return(errdata.longdat);
1341648Smckusick 	case EPACK:
1353002Smckusic 		fprintf(stderr,"i = %D: Bad i to pack(a,i,z)\n"
1361648Smckusick 			,errdata.longdat);
1371648Smckusick 		return(errdata.longdat);
1381648Smckusick 	case EUNPACK:
1393002Smckusic 		fprintf(stderr,"i = %D: Bad i to unpack(z,a,i)\n"
1401648Smckusick 			,errdata.longdat);
1411648Smckusick 		return(errdata.longdat);
1421648Smckusick 	case ERANGE:
1433002Smckusic 		fprintf(stderr,"Value of %D is out of range\n",errdata.longdat);
1441648Smckusick 		return(errdata.longdat);
1451648Smckusick 	case ESUBSC:
1463002Smckusic 		fprintf(stderr,"Subscript value of %D is out of range\n"
1471648Smckusick 			,errdata.longdat);
1481648Smckusick 		return(errdata.longdat);
1491648Smckusick 	case EASRT:
1501648Smckusick 		fprintf(stderr,"Assertion failed: %s\n",errdata.strngdat);
1511648Smckusick 		return(0);
1521648Smckusick 	case ESTLIM:
1531648Smckusick 		fprintf(stderr,
1543002Smckusic 			"Statement count limit exceeded, %D statements executed\n",
1551648Smckusick 			errdata.longdat);
1561648Smckusick 		return(errdata.longdat);
1571648Smckusick 	default:
158*3857Smckusic 		fprintf(stderr, msg, d1, d2, d3, d4);
1591648Smckusick 		return(0);
1601648Smckusick 	}
1611648Smckusick }
162