156 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* $Id$ */
 | 
						|
/*
 | 
						|
 * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | 
						|
 *
 | 
						|
 *          This product is part of the Amsterdam Compiler Kit.
 | 
						|
 *
 | 
						|
 * Permission to use, sell, duplicate or disclose this software must be
 | 
						|
 * obtained in writing. Requests for such permissions may be sent to
 | 
						|
 *
 | 
						|
 *      Dr. Andrew S. Tanenbaum
 | 
						|
 *      Wiskundig Seminarium
 | 
						|
 *      Vrije Universiteit
 | 
						|
 *      Postbox 7161
 | 
						|
 *      1007 MC Amsterdam
 | 
						|
 *      The Netherlands
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdlib.h>
 | 
						|
#include <errno.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <em_abs.h>
 | 
						|
#include "pc.h"
 | 
						|
 | 
						|
static struct errm
 | 
						|
{
 | 
						|
	int errno;
 | 
						|
	char* errmes;
 | 
						|
} errors[] = {
 | 
						|
	{ EARRAY, "array bound error" },
 | 
						|
	{ ERANGE, "range bound error" },
 | 
						|
	{ ESET, "set bound error" },
 | 
						|
	{ EIOVFL, "integer overflow" },
 | 
						|
	{ EFOVFL, "real overflow" },
 | 
						|
	{ EFUNFL, "real underflow" },
 | 
						|
	{ EIDIVZ, "divide by 0" },
 | 
						|
	{ EFDIVZ, "divide by 0.0" },
 | 
						|
	{ EIUND, "undefined integer" },
 | 
						|
	{ EFUND, "undefined real" },
 | 
						|
	{ ECONV, "conversion error" },
 | 
						|
 | 
						|
	{ ESTACK, "stack overflow" },
 | 
						|
	{ EHEAP, "heap overflow" },
 | 
						|
	{ EILLINS, "illegal instruction" },
 | 
						|
	{ EODDZ, "illegal size argument" },
 | 
						|
	{ ECASE, "case error" },
 | 
						|
	{ EMEMFLT, "addressing non existent memory" },
 | 
						|
	{ EBADPTR, "bad pointer used" },
 | 
						|
	{ EBADPC, "program counter out of range" },
 | 
						|
	{ EBADLAE, "bad argument of lae" },
 | 
						|
	{ EBADMON, "bad monitor call" },
 | 
						|
	{ EBADLIN, "argument if LIN too high" },
 | 
						|
	{ EBADGTO, "GTO descriptor error" },
 | 
						|
 | 
						|
	{ EARGC, "more args expected" },
 | 
						|
	{ EEXP, "error in exp" },
 | 
						|
	{ ELOG, "error in ln" },
 | 
						|
	{ ESQT, "error in sqrt" },
 | 
						|
	{ EASS, "assertion failed" },
 | 
						|
	{ EPACK, "array bound error in pack" },
 | 
						|
	{ EUNPACK, "array bound error in unpack" },
 | 
						|
	{ EMOD, "only positive j in 'i mod j'" },
 | 
						|
	{ EBADF, "file not yet open" },
 | 
						|
	{ EFREE, "dispose error" },
 | 
						|
	{ EFUNASS, "function not assigned" },
 | 
						|
	{ EWIDTH, "illegal field width" },
 | 
						|
 | 
						|
	{ EWRITEF, "not writable" },
 | 
						|
	{ EREADF, "not readable" },
 | 
						|
	{ EEOF, "end of file" },
 | 
						|
	{ EFTRUNC, "truncated" },
 | 
						|
	{ ERESET, "reset error" },
 | 
						|
	{ EREWR, "rewrite error" },
 | 
						|
	{ ECLOSE, "close error" },
 | 
						|
	{ EREAD, "read error" },
 | 
						|
	{ EWRITE, "write error" },
 | 
						|
	{ EDIGIT, "digit expected" },
 | 
						|
	{ EASCII, "non-ASCII char read" },
 | 
						|
	{ -1, 0 }
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
void _catch(unsigned int erno)
 | 
						|
{
 | 
						|
	register struct errm* ep = &errors[0];
 | 
						|
	char *p, *q, *s, **qq;
 | 
						|
	char buf[20];
 | 
						|
	unsigned i;
 | 
						|
	int j = erno;
 | 
						|
	char* pp[11];
 | 
						|
	char xbuf[100];
 | 
						|
 | 
						|
	qq = pp;
 | 
						|
	if (p = FILN)
 | 
						|
		*qq++ = p;
 | 
						|
	else
 | 
						|
		*qq++ = _pargv[0];
 | 
						|
 | 
						|
	while (ep->errno != erno && ep->errmes != 0)
 | 
						|
		ep++;
 | 
						|
	p = buf;
 | 
						|
	s = xbuf;
 | 
						|
	if (i = LINO)
 | 
						|
	{
 | 
						|
		*qq++ = ", ";
 | 
						|
		do
 | 
						|
			*p++ = i % 10 + '0';
 | 
						|
		while (i /= 10);
 | 
						|
		while (p > buf)
 | 
						|
			*s++ = *--p;
 | 
						|
	}
 | 
						|
	*s++ = ':';
 | 
						|
	*s++ = ' ';
 | 
						|
	*s++ = '\0';
 | 
						|
	*qq++ = xbuf;
 | 
						|
	if ((erno & ~037) == 0140 && (_curfil->flags & 0377) == MAGIC)
 | 
						|
	{
 | 
						|
		/* file error */
 | 
						|
		*qq++ = "file ";
 | 
						|
		*qq++ = _curfil->fname;
 | 
						|
		*qq++ = ": ";
 | 
						|
	}
 | 
						|
	if (ep->errmes)
 | 
						|
		*qq++ = ep->errmes;
 | 
						|
	else
 | 
						|
	{
 | 
						|
		*qq++ = "error number ";
 | 
						|
		*qq++ = s;
 | 
						|
		p = buf;
 | 
						|
		if (j < 0)
 | 
						|
		{
 | 
						|
			j = -j;
 | 
						|
			*s++ = '-';
 | 
						|
		}
 | 
						|
		do
 | 
						|
			*p++ = j % 10 + '0';
 | 
						|
		while (j /= 10);
 | 
						|
		while (p > buf)
 | 
						|
			*s++ = *--p;
 | 
						|
		*s = 0;
 | 
						|
	}
 | 
						|
	*qq++ = "\n";
 | 
						|
	*qq = 0;
 | 
						|
	qq = pp;
 | 
						|
	while (q = *qq++)
 | 
						|
	{
 | 
						|
		p = q;
 | 
						|
		while (*p)
 | 
						|
			p++;
 | 
						|
		if (write(2, q, (int)(p - q)) < 0)
 | 
						|
			;
 | 
						|
	}
 | 
						|
	_exit(erno + 1);
 | 
						|
error:
 | 
						|
	_trp(erno);
 | 
						|
}
 |