|
|
1.1 ! root 1: /* @(#)err.c 1.3 */ ! 2: /* 3.0 SID # 1.3 */ ! 3: #include <sys/types.h> ! 4: #include <sys/stat.h> ! 5: #include <stdio.h> ! 6: #include "fio.h" ! 7: #define STR(x) (x==NULL?"":x) ! 8: ! 9: /*global definitions*/ ! 10: unit units[MXUNIT]; /*unit table*/ ! 11: flag init; /*0 on entry, 1 after initializations*/ ! 12: cilist *elist; /*active external io list*/ ! 13: flag reading; /*1 if reading, 0 if writing*/ ! 14: flag cplus,cblank; ! 15: char *fmtbuf; ! 16: flag external; /*1 if external io, 0 if internal */ ! 17: int (*doed)(),(*doned)(); ! 18: int (*doend)(),(*donewrec)(),(*dorevert)(); ! 19: flag sequential; /*1 if sequential io, 0 if direct*/ ! 20: flag formatted; /*1 if formatted io, 0 if unformatted*/ ! 21: int (*getn)(),(*putn)(); /*for formatted io*/ ! 22: FILE *cf; /*current file*/ ! 23: unit *curunit; /*current unit*/ ! 24: int recpos; /*place in current record*/ ! 25: int cursor,scale; ! 26: ! 27: /*error messages*/ ! 28: char *F_err[] = ! 29: { ! 30: "error in format", /* 100 */ ! 31: "illegal unit number", /* 101 */ ! 32: "formatted io not allowed", /* 102 */ ! 33: "unformatted io not allowed", /* 103 */ ! 34: "direct io not allowed", /* 104 */ ! 35: "sequential io not allowed", /* 105 */ ! 36: "can't backspace file", /* 106 */ ! 37: "null file name", /* 107 */ ! 38: "can't stat file", /* 108 */ ! 39: "unit not connected", /* 109 */ ! 40: "off end of record", /* 110 */ ! 41: "truncation failed in endfile", /* 111 */ ! 42: "incomprehensible list input", /* 112 */ ! 43: "out of free space", /* 113 */ ! 44: "unit not connected", /* 114 */ ! 45: "read unexpected character", /* 115 */ ! 46: "blank logical input field", /* 116 */ ! 47: "bad variable type", /* 117 */ ! 48: "bad namelist name", /* 118 */ ! 49: "variable not in namelist", /* 119 */ ! 50: "no end record", /* 120 */ ! 51: "variable count incorrect" /* 121 */ ! 52: }; ! 53: #define MAXERR (sizeof(F_err)/sizeof(char *)+100) ! 54: fatal(n,s) char *s; ! 55: { ! 56: if(n<100 && n>=0) perror(s); /*SYSDEP*/ ! 57: else if(n>=(int)MAXERR) ! 58: { fprintf(stderr,"%s: illegal error number %d\n",s,n); ! 59: } ! 60: else if(n<0) fprintf(stderr,"%s: end of file %d\n",s,n); ! 61: else ! 62: fprintf(stderr,"%s: %s\n",s,F_err[n-100]); ! 63: fprintf(stderr,"apparent state: unit %d named %s\n",curunit-units, ! 64: STR(curunit->ufnm)); ! 65: fprintf(stderr,"last format: %s\n",STR(fmtbuf)); ! 66: fprintf(stderr,"lately %s %s %s %s IO\n",reading?"reading":"writing", ! 67: sequential?"sequential":"direct",formatted?"formatted":"unformatted", ! 68: external?"external":"internal"); ! 69: _cleanup(); ! 70: abort(); ! 71: } ! 72: /*initialization routine*/ ! 73: f_init() ! 74: { unit *p; ! 75: init=1; ! 76: p= &units[0]; ! 77: p->ufd=stderr; ! 78: p->useek=canseek(stderr); ! 79: if(isatty(fileno(stderr))) { ! 80: setbuf(stderr, malloc(BUFSIZ)); ! 81: setvbuf(stderr, _IOLBF, 0, 0); ! 82: } /* wastes space, but win for debugging in windows */ ! 83: p->ufmt=1; ! 84: p->uwrt=1; ! 85: p = &units[5]; ! 86: p->ufd=stdin; ! 87: p->useek=canseek(stdin); ! 88: p->ufmt=1; ! 89: p->uwrt=0; ! 90: p= &units[6]; ! 91: p->ufd=stdout; ! 92: p->useek=canseek(stdout); ! 93: /* IOLBUF and setvbuf only in system 5+ */ ! 94: if(isatty(fileno(stdout))) { ! 95: extern char * _sobuf; ! 96: setbuf(stdout, _sobuf); ! 97: setvbuf(stdout, _IOLBF, 0, 0); /* the buf arg in setvbuf? */ ! 98: p->useek = 1; /* only within a record no bigger than BUFSIZ */ ! 99: } ! 100: p->ufmt=1; ! 101: p->uwrt=1; ! 102: } ! 103: canseek(f) FILE *f; /*SYSDEP*/ ! 104: { struct stat x; ! 105: if(fstat(fileno(f),&x) < 0) ! 106: return(0); ! 107: switch(x.st_mode & S_IFMT) { ! 108: case S_IFDIR: ! 109: case S_IFREG: ! 110: if(x.st_nlink > 0) /* !pipe */ ! 111: return(1); ! 112: else ! 113: return(0); ! 114: case S_IFCHR: ! 115: if(isatty(fileno(f))) ! 116: return(0); ! 117: return(1); ! 118: case S_IFBLK: ! 119: return(1); ! 120: } ! 121: return(0); /* who knows what it is? */ ! 122: } ! 123: nowreading(x) unit *x; ! 124: { ! 125: long loc; ! 126: x->uwrt=0; ! 127: loc=ftell(x->ufd); ! 128: if(freopen(x->ufnm,"r",x->ufd) == NULL) ! 129: return(1); ! 130: (void) fseek(x->ufd,loc,0); ! 131: return(0); ! 132: } ! 133: nowwriting(x) unit *x; ! 134: { ! 135: long loc; ! 136: loc=ftell(x->ufd); ! 137: x->uwrt=1; ! 138: if(!freopen(x->ufnm,"r+",x->ufd) && !freopen(x->ufnm, "w+", x->ufd)) ! 139: return(1); ! 140: (void) fseek(x->ufd,loc,0); ! 141: return(0); ! 142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.