1: /* 2: * Copyright (c) 1980 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: * 6: * @(#)err.c 5.2 7/30/85 7: */ 8: 9: /* 10: * fatal(): i/o error routine 11: * flush_(): flush file buffer 12: */ 13: 14: #include <sys/types.h> 15: #include <sys/stat.h> 16: #include <signal.h> 17: #include "fio.h" 18: 19: /* 20: * global definitions 21: */ 22: 23: unit units[MXUNIT]; /*unit table*/ 24: flag reading; /*1 if reading, 0 if writing*/ 25: flag external; /*1 if external io, 0 if internal */ 26: flag sequential; /*1 if sequential io, 0 if direct*/ 27: flag formatted; /*1 if formatted io, 0 if unformatted, 28: -1 if list directed, -2 if namelist */ 29: char *fmtbuf, *icptr, *icend, *fmtptr; 30: int (*doed)(),(*doned)(); 31: int (*doend)(),(*donewrec)(),(*dorevert)(),(*dotab)(); 32: int (*lioproc)(); 33: int (*getn)(),(*putn)(),(*ungetn)(); /*for formatted io*/ 34: FILE *cf; /*current file structure*/ 35: unit *curunit; /*current unit structure*/ 36: int lunit; /*current logical unit*/ 37: char *lfname; /*current filename*/ 38: int recpos; /*place in current record*/ 39: ftnint recnum; /* current record number */ 40: int reclen; /* current record length */ 41: int cursor,scale; 42: int radix; 43: ioflag signit,tab,cplus,cblank,elist,errflag,endflag,lquit,l_first; 44: flag leof; 45: int lcount,line_len; 46: struct ioiflg ioiflg_; /* initialization flags */ 47: 48: /*error messages*/ 49: 50: extern char *sys_errlist[]; 51: extern int sys_nerr; 52: 53: extern char *f_errlist[]; 54: extern int f_nerr; 55: 56: 57: fatal(n,s) char *s; 58: { 59: ftnint lu; 60: 61: for (lu=1; lu < MXUNIT; lu++) 62: flush_(&lu); 63: if(n<0) 64: fprintf(stderr,"%s: [%d] end of file\n",s,n); 65: else if(n>=0 && n<sys_nerr) 66: fprintf(stderr,"%s: [%d] %s\n",s,n,sys_errlist[n]); 67: else if(n>=F_ER && n<F_MAXERR) 68: fprintf(stderr,"%s: [%d] %s\n",s,n,f_errlist[n-F_ER]); 69: else 70: fprintf(stderr,"%s: [%d] unknown error number\n",s,n); 71: if(external) 72: { 73: if(!lfname) switch (lunit) 74: { case STDERR: lfname = "stderr"; 75: break; 76: case STDIN: lfname = "stdin"; 77: break; 78: case STDOUT: lfname = "stdout"; 79: break; 80: default: lfname = ""; 81: } 82: fprintf(stderr,"logical unit %d, named '%s'\n",lunit,lfname); 83: } 84: if (elist) 85: { fprintf(stderr,"lately: %s %s %s %s I/O\n", 86: reading?"reading":"writing", 87: sequential?"sequential":"direct", 88: formatted>0?"formatted":(formatted==0?"unformatted": 89: (formatted==LISTDIRECTED?"list":"namelist")), 90: external?"external":"internal"); 91: if (formatted) 92: { if(fmtbuf) prnt_fmt(n); 93: if (external) 94: { if(reading && curunit->useek) 95: prnt_ext(); /* print external data */ 96: } 97: else prnt_int(); /* print internal array */ 98: } 99: } 100: f77_abort(n); 101: } 102: 103: LOCAL 104: prnt_ext() 105: { int ch; 106: int i=1; 107: long loc; 108: fprintf (stderr, "part of last data: "); 109: loc = ftell(curunit->ufd); 110: if(loc) 111: { if(loc==1L) rewind(curunit->ufd); 112: else for(;i<12 && last_char(curunit->ufd)!='\n';i++); 113: while(i--) ffputc(fgetc(curunit->ufd),stderr); 114: } 115: fputc('|',stderr); 116: for(i=0;i<5 && (ch=fgetc(curunit->ufd))!=EOF;i++) ffputc(ch,stderr); 117: fputc('\n',stderr); 118: } 119: 120: LOCAL 121: prnt_int() 122: { char *ep; 123: fprintf (stderr,"part of last string: "); 124: ep = icptr - (recpos<12?recpos:12); 125: while (ep<icptr) ffputc(*ep++,stderr); 126: fputc('|',stderr); 127: while (ep<(icptr+5) && ep<icend) ffputc(*ep++,stderr); 128: fputc('\n',stderr); 129: } 130: 131: LOCAL 132: prnt_fmt(n) int n; 133: { int i; char *ep; 134: fprintf(stderr, "format: "); 135: if(n==F_ERFMT) 136: { i = fmtptr - fmtbuf; 137: ep = fmtptr - (i<25?i:25); 138: if(ep != fmtbuf) fprintf(stderr, "... "); 139: i = i + 5; 140: } 141: else 142: { ep = fmtbuf; 143: i = 25; 144: fmtptr = fmtbuf - 1; 145: } 146: while(i && *ep) 147: { ffputc((*ep==GLITCH)?'"':*ep,stderr); 148: if(ep==fmtptr) fputc('|',stderr); 149: ep++; i--; 150: } 151: if(*ep) fprintf(stderr, " ..."); 152: fputc('\n',stderr); 153: } 154: 155: LOCAL 156: ffputc(c, f) 157: int c; 158: FILE *f; 159: { 160: c &= 0177; 161: if (c < ' ' || c == 0177) 162: { 163: fputc('^', f); 164: c ^= 0100; 165: } 166: fputc(c, f); 167: } 168: 169: ftnint 170: flush_(u) ftnint *u; 171: { 172: FILE *F; 173: 174: if(not_legal(*u)) 175: return(F_ERUNIT); 176: F = units[*u].ufd; 177: if(F) 178: return(fflush(F)); 179: else 180: return(F_ERNOPEN); 181: }