|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <sys/stat.h> ! 3: #include <stdio.h> ! 4: #include "fio.h" ! 5: #define STR(x) (x==NULL?"":x) ! 6: ! 7: /*global definitions*/ ! 8: unit units[MXUNIT]; /*unit table*/ ! 9: flag init; /*0 on entry, 1 after initializations*/ ! 10: cilist *elist; /*active external io list*/ ! 11: flag reading; /*1 if reading, 0 if writing*/ ! 12: flag cplus,cblank; ! 13: char *fmtbuf; ! 14: flag external; /*1 if external io, 0 if internal */ ! 15: int (*doed)(),(*doned)(); ! 16: int (*doend)(),(*donewrec)(),(*dorevert)(); ! 17: flag sequential; /*1 if sequential io, 0 if direct*/ ! 18: flag formatted; /*1 if formatted io, 0 if unformatted*/ ! 19: int (*getn)(),(*putn)(); /*for formatted io*/ ! 20: FILE *cf; /*current file*/ ! 21: unit *curunit; /*current unit*/ ! 22: int recpos; /*place in current record*/ ! 23: int cursor,scale; ! 24: ! 25: /*error messages*/ ! 26: char *F_err[] = ! 27: { ! 28: "error in format", ! 29: "illegal unit number", ! 30: "formatted io not allowed", ! 31: "unformatted io not allowed", ! 32: "direct io not allowed", ! 33: "sequential io not allowed", ! 34: "can't backspace file", ! 35: "null file name", ! 36: "can't stat file", ! 37: "unit not connected", ! 38: "off end of record", ! 39: "truncation failed in endfile", ! 40: "incomprehensible list input", ! 41: "out of free space", ! 42: "unit not connected", ! 43: "read unexpected character", ! 44: "blank logical input field", ! 45: }; ! 46: #define MAXERR (sizeof(F_err)/sizeof(char *)+100) ! 47: fatal(n,s) char *s; ! 48: { ! 49: if(n<100 && n>=0) perror(s); /*SYSDEP*/ ! 50: else if(n>=(int)MAXERR) ! 51: { fprintf(stderr,"%s: illegal error number %d\n",s,n); ! 52: } ! 53: else if(n<0) fprintf(stderr,"%s: end of file %d\n",s,n); ! 54: else ! 55: fprintf(stderr,"%s: %s\n",s,F_err[n-100]); ! 56: fprintf(stderr,"apparent state: unit %d named %s\n",curunit-units, ! 57: STR(curunit->ufnm)); ! 58: fprintf(stderr,"last format: %s\n",STR(fmtbuf)); ! 59: fprintf(stderr,"lately %s %s %s %s IO\n",reading?"reading":"writing", ! 60: sequential?"sequential":"direct",formatted?"formatted":"unformatted", ! 61: external?"external":"internal"); ! 62: _cleanup(); ! 63: abort(); ! 64: } ! 65: /*initialization routine*/ ! 66: f_init() ! 67: { unit *p; ! 68: init=1; ! 69: p= &units[0]; ! 70: p->ufd=stderr; ! 71: p->useek=canseek(stderr); ! 72: p->ufmt=1; ! 73: p->uwrt=1; ! 74: p = &units[5]; ! 75: p->ufd=stdin; ! 76: p->useek=canseek(stdin); ! 77: p->ufmt=1; ! 78: p->uwrt=0; ! 79: p= &units[6]; ! 80: p->ufd=stdout; ! 81: p->useek=canseek(stdout); ! 82: p->ufmt=1; ! 83: p->uwrt=1; ! 84: } ! 85: canseek(f) FILE *f; /*SYSDEP*/ ! 86: { struct stat x; ! 87: (void) fstat(fileno(f),&x); ! 88: if(x.st_nlink > 0 /*pipe*/ && !isatty(fileno(f))) ! 89: { ! 90: return(1); ! 91: } ! 92: return(0); ! 93: } ! 94: nowreading(x) unit *x; ! 95: { ! 96: long loc; ! 97: x->uwrt=0; ! 98: loc=ftell(x->ufd); ! 99: if(freopen(x->ufnm,"r",x->ufd) == NULL) ! 100: return(1); ! 101: (void) fseek(x->ufd,loc,0); ! 102: return(0); ! 103: } ! 104: nowwriting(x) unit *x; ! 105: { ! 106: long loc; ! 107: loc=ftell(x->ufd); ! 108: x->uwrt=1; ! 109: if(freopen(x->ufnm,"a",x->ufd) == NULL) ! 110: return(1); ! 111: (void) fseek(x->ufd,loc,0); ! 112: return(0); ! 113: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.