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