/* * Copyright (c) 1980 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. * * @(#)err.c 5.2.1 1996/3/22 */ /* * fatal(): i/o error routine * flush_(): flush file buffer */ #include #include #include #include "fio.h" /* * global definitions */ unit units[MXUNIT]; /*unit table*/ flag reading; /*1 if reading, 0 if writing*/ flag external; /*1 if external io, 0 if internal */ flag sequential; /*1 if sequential io, 0 if direct*/ flag formatted; /*1 if formatted io, 0 if unformatted, -1 if list directed, -2 if namelist */ char *fmtbuf, *icptr, *icend, *fmtptr; int (*doed)(),(*doned)(); int (*doend)(),(*donewrec)(),(*dorevert)(),(*dotab)(); int (*lioproc)(); int (*getn)(),(*putn)(),(*ungetn)(); /*for formatted io*/ FILE *cf; /*current file structure*/ unit *curunit; /*current unit structure*/ int lunit; /*current logical unit*/ char *lfname; /*current filename*/ int recpos; /*place in current record*/ ftnint recnum; /* current record number */ int reclen; /* current record length */ int cursor,scale; int radix; ioflag signit,tab,cplus,cblank,elist,errflag,endflag,lquit,l_first; flag leof; int lcount,line_len; struct ioiflg ioiflg_; /* initialization flags */ /*error messages*/ extern char *f_errlist[]; extern int f_nerr; fatal(n,s) char *s; { ftnint lu; for (lu=1; lu < MXUNIT; lu++) flush_(&lu); if(n<0) fprintf(stderr,"%s: [%d] end of file\n",s,n); else if(n>=F_ER && n0?"formatted":(formatted==0?"unformatted": (formatted==LISTDIRECTED?"list":"namelist")), external?"external":"internal"); if (formatted) { if(fmtbuf) prnt_fmt(n); if (external) { if(reading && curunit->useek) prnt_ext(); /* print external data */ } else prnt_int(); /* print internal array */ } } f77_abort(1, n); } LOCAL prnt_ext() { int ch; int i=1; long loc; fprintf (stderr, "part of last data: "); loc = ftell(curunit->ufd); if(loc) { if(loc==1L) rewind(curunit->ufd); else for(;i<12 && last_char(curunit->ufd)!='\n';i++); while(i--) ffputc(fgetc(curunit->ufd),stderr); } fputc('|',stderr); for(i=0;i<5 && (ch=fgetc(curunit->ufd))!=EOF;i++) ffputc(ch,stderr); fputc('\n',stderr); } LOCAL prnt_int() { char *ep; fprintf (stderr,"part of last string: "); ep = icptr - (recpos<12?recpos:12); while (ep