Annotation of 43BSDTahoe/usr.lib/libI77/err.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.