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