ack/lang/pc/libpc/catch.c
1984-07-20 11:03:31 +00:00

96 lines
1.8 KiB
C

/* $Header$ */
/*
* (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 <em_abs.h>
#include <em_path.h>
#include <pc_file.h>
#define MESLEN 30
extern struct file *_curfil;
extern int _pargc;
extern char **_pargv;
extern char **_penvp;
extern char *_hol0();
extern _trp();
extern exit();
extern int open();
extern int read();
extern int write();
/* Modified not to use a table of indices any more. This circumvents yet
another point where byte order in words would make you lose.
*/
_catch(erno) unsigned erno; {
char *p,*q,**qq;
unsigned i;
int fd;
char *pp[8];
char mes[MESLEN];
char c;
qq = pp;
if (p = FILN)
*qq++ = p;
else
*qq++ = _pargv[0];
p = &("xxxxx: "[5]);
if (i = LINO) {
*qq++ = ", ";
do
*--p = i % 10 + '0';
while (i /= 10);
}
*qq++ = p;
if ((erno & ~037) == 0140 && (_curfil->flags&0377)==MAGIC) {
/* file error */
*qq++ = "file ";
*qq++ = _curfil->fname;
*qq++ = ": ";
}
if ((fd=open(RTERR_PATH,0))<0)
goto error;
/* skip to correct message */
for(i=0;i<erno;i++)
do if (read(fd,&c,1)!=1)
goto error;
while (c!= '\n');
if(read(fd,mes,MESLEN-1)<=0)
goto error;
mes[MESLEN-1]=0;
for(i=0;i<MESLEN-1;i++)
if(mes[i]=='\n')
mes[i+1]=0;
*qq++ = mes;
*qq = 0;
qq = pp;
while (q = *qq++) {
p = q;
while (*p)
p++;
if (write(2,q,p-q) < 0)
;
}
exit(erno);
error:
_trp(erno);
}