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