xref: /csrg-svn/usr.bin/pascal/libpc/ERROR.c (revision 3002)
11648Smckusick /* Copyright (c) 1979 Regents of the University of California */
21648Smckusick 
3*3002Smckusic static char sccsid[] = "@(#)ERROR.c 1.3 03/07/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  */
16*3002Smckusic long
17*3002Smckusic ERROR(errnum, errordata)
181648Smckusick 
19*3002Smckusic 	short	errnum;
20*3002Smckusic 	double	errordata;
21*3002Smckusic {
221648Smckusick 	union cvt {
231648Smckusick 		long	longdat;
241648Smckusick 		char	*strngdat;
251648Smckusick 		double	dbldat;
261648Smckusick 	} errdata;
27*3002Smckusic 
28*3002Smckusic 	errdata.dbldat = errordata;
291648Smckusick 	PFLUSH();
302179Smckusic 	if (_entry[errnum].entryaddr != 0) {
312179Smckusic 		(*_entry[errnum].entryaddr)(errdata);
322179Smckusic 		return;
332179Smckusic 	}
341648Smckusick 	fputc('\n',stderr);
351648Smckusick 	SETRACE();
361648Smckusick 	switch (errnum) {
371648Smckusick 	case ECHR:
38*3002Smckusic 		fprintf(stderr, "Argument to chr of %D is out of range\n"
391648Smckusick 			,errdata.longdat);
401648Smckusick 		return(errdata.longdat);
411648Smckusick 	case EHALT:
421648Smckusick 		fputs("Call to procedure halt\n",stderr);
431648Smckusick 		PCEXIT(0);
441648Smckusick 	case ENILPTR:
451648Smckusick 		fputs("Pointer value out of legal range\n",stderr);
461648Smckusick 		return(0);
471648Smckusick 	case EPASTEOF:
481648Smckusick 		fprintf(stderr,"%s: Tried to read past end of file\n"
491648Smckusick 			,errdata.strngdat);
501648Smckusick 		return(0);
511648Smckusick 	case EREADIT:
521648Smckusick 		fprintf(stderr,"%s: Attempt to read, but open for writing\n"
531648Smckusick 			,errdata.strngdat);
541648Smckusick 		return(0);
551648Smckusick 	case EWRITEIT:
561648Smckusick 		fprintf(stderr,"%s: Attempt to write, but open for reading\n"
571648Smckusick 			,errdata.strngdat);
581648Smckusick 		return(0);
591648Smckusick 	case ECLOSE:
601648Smckusick 		fprintf(stderr,"%s: Close failed\n",errdata.strngdat);
611648Smckusick 		return(0);
621648Smckusick 	case ELLIMIT:
631648Smckusick 		fprintf(stderr,"%s: Line limit exceeded\n",errdata.strngdat);
641648Smckusick 		return(0);
651648Smckusick 	case ESQRT:
66*3002Smckusic 		fprintf(stderr,"Negative argument of %e to sqrt\n"
671648Smckusick 			,errdata.dbldat);
681648Smckusick 		return(errdata.dbldat);
691648Smckusick 	case EREFINAF:
701648Smckusick 		fprintf(stderr,"%s: ",errdata.strngdat);
711648Smckusick 	case ENOFILE:
721648Smckusick 		fputs("Reference to an inactive file\n",stderr);
731648Smckusick 		return(0);
741648Smckusick 	case EWRITE:
751648Smckusick 		fputs("Could not write to ",stderr);
761648Smckusick 		perror(errdata.strngdat);
771648Smckusick 		return(0);
781648Smckusick 	case EOPEN:
791648Smckusick 		fputs("Could not open ",stderr);
801648Smckusick 		perror(errdata.strngdat);
811648Smckusick 		return(0);
821648Smckusick 	case ECREATE:
831648Smckusick 		fputs("Could not create ",stderr);
841648Smckusick 		perror(errdata.strngdat);
851648Smckusick 		return(0);
861648Smckusick 	case EREMOVE:
871648Smckusick 		fputs("Could not remove ",stderr);
881648Smckusick 		perror(errdata.strngdat);
891648Smckusick 		return(0);
901648Smckusick 	case ESEEK:
911648Smckusick 		fputs("Could not reset ",stderr);
921648Smckusick 		perror(errdata.strngdat);
931648Smckusick 		return(0);
941648Smckusick 	case ENAMESIZE:
951648Smckusick 		fprintf(stderr,"%s: File name too long\n",errdata.strngdat);
961648Smckusick 		return(0);
971648Smckusick 	case ELN:
98*3002Smckusic 		fprintf(stderr,"Non-positive argument of %e to ln\n"
991648Smckusick 			,errdata.dbldat);
1001648Smckusick 		return(errdata.dbldat);
1011648Smckusick 	case EBADINUM:
1021648Smckusick 		fprintf(stderr,"%s: Bad data found on integer read\n"
1031648Smckusick 			,errdata.strngdat);
1041648Smckusick 		return(0);
1051648Smckusick 	case EBADFNUM:
1061648Smckusick 		fprintf(stderr,"%s: Bad data found on real read\n"
1071648Smckusick 			,errdata.strngdat);
1081648Smckusick 		return(0);
1091648Smckusick 	case ENUMNTFD:
1101648Smckusick 		fprintf(stderr,
1111648Smckusick 			"Unknown name \"%s\" found on enumerated type read\n",
1121648Smckusick 			errdata.strngdat);
1131648Smckusick 		return(0);
1141648Smckusick 	case ENAMRNG:
1151648Smckusick 		fprintf(stderr,
116*3002Smckusic 			"Enumerated type value of %D is out of range on output\n",
1171648Smckusick 			errdata.longdat);
1181648Smckusick 		return(errdata.longdat);
1191648Smckusick 	case EFMTSIZE:
120*3002Smckusic 		fprintf(stderr,"Negative format width: %D\n",errdata.longdat);
1211648Smckusick 		return(0);
1221648Smckusick 	case EGOTO:
1231648Smckusick 		fputs("Active frame not found in non-local goto\n", stderr);
1241648Smckusick 		return(0);
1251648Smckusick 	case ECASE:
126*3002Smckusic 		fprintf(stderr,"Label of %D not found in case\n"
1271648Smckusick 			,errdata.longdat);
1281648Smckusick 		return(errdata.longdat);
1291648Smckusick 	case EOUTOFMEM:
1301648Smckusick 		fputs("Ran out of memory\n",stderr);
1311648Smckusick 		return(0);
1321648Smckusick 	case ECTLWR:
133*3002Smckusic 		fprintf(stderr, "Range lower bound of %D out of set bounds\n",
1341648Smckusick 			errdata.longdat);
1351648Smckusick 		return(0);
1361648Smckusick 	case ECTUPR:
137*3002Smckusic 		fprintf(stderr, "Range upper bound of %D out of set bounds\n",
1381648Smckusick 			errdata.longdat);
1391648Smckusick 		return(0);
1401648Smckusick 	case ECTSNG:
141*3002Smckusic 		fprintf(stderr, "Value of %D out of set bounds\n",
1421648Smckusick 			errdata.longdat);
1431648Smckusick 		return(0);
1441648Smckusick 	case ENARGS:
1451648Smckusick 		if (errdata.longdat < 0)
1461648Smckusick 			fprintf(stderr,
147*3002Smckusic 				"There were %D too few arguments to formal routine\n",
1481648Smckusick 				-errdata.longdat);
1491648Smckusick 		else
1501648Smckusick 			fprintf(stderr,
151*3002Smckusic 				"There were %D too many arguments to formal routine\n",
1521648Smckusick 				errdata.longdat);
1531648Smckusick 		return(0);
1541648Smckusick 	case EARGV:
155*3002Smckusic 		fprintf(stderr,"Argument to argv of %D is out of range\n"
1561648Smckusick 			,errdata.longdat);
1571648Smckusick 		return(errdata.longdat);
1581648Smckusick 	case EPACK:
159*3002Smckusic 		fprintf(stderr,"i = %D: Bad i to pack(a,i,z)\n"
1601648Smckusick 			,errdata.longdat);
1611648Smckusick 		return(errdata.longdat);
1621648Smckusick 	case EUNPACK:
163*3002Smckusic 		fprintf(stderr,"i = %D: Bad i to unpack(z,a,i)\n"
1641648Smckusick 			,errdata.longdat);
1651648Smckusick 		return(errdata.longdat);
1661648Smckusick 	case ERANGE:
167*3002Smckusic 		fprintf(stderr,"Value of %D is out of range\n",errdata.longdat);
1681648Smckusick 		return(errdata.longdat);
1691648Smckusick 	case ESUBSC:
170*3002Smckusic 		fprintf(stderr,"Subscript value of %D is out of range\n"
1711648Smckusick 			,errdata.longdat);
1721648Smckusick 		return(errdata.longdat);
1731648Smckusick 	case EASRT:
1741648Smckusick 		fprintf(stderr,"Assertion failed: %s\n",errdata.strngdat);
1751648Smckusick 		return(0);
1761648Smckusick 	case ESTLIM:
1771648Smckusick 		fprintf(stderr,
178*3002Smckusic 			"Statement count limit exceeded, %D statements executed\n",
1791648Smckusick 			errdata.longdat);
1801648Smckusick 		return(errdata.longdat);
1811648Smckusick 	default:
1821648Smckusick 		fputs("Panic: unknown error\n",stderr);
1831648Smckusick 		return(0);
1841648Smckusick 	}
1851648Smckusick }
186