|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.