|
|
1.1 ! root 1: /* ! 2: char id_dfe[] = "@(#)dfe.c 1.2"; ! 3: * ! 4: * direct formatted external i/o ! 5: */ ! 6: ! 7: #include "fio.h" ! 8: ! 9: extern int rd_ed(),rd_ned(),w_ed(),w_ned(); ! 10: int y_getc(),y_putc(),y_rnew(),y_wnew(),y_tab(); ! 11: ! 12: char *dfe = "dfe"; ! 13: char *rdfe = "read dfe"; ! 14: char *wdfe = "write dfe"; ! 15: ! 16: s_rdfe(a) cilist *a; ! 17: { ! 18: int n; ! 19: reading = YES; ! 20: if(n=c_dfe(a,READ)) return(n); ! 21: if(curunit->uwrt) nowreading(curunit); ! 22: getn = y_getc; ! 23: doed = rd_ed; ! 24: doned = rd_ned; ! 25: dotab = y_tab; ! 26: dorevert = doend = donewrec = y_rnew; ! 27: if(pars_f(fmtbuf)) err(errflag,F_ERFMT,rdfe) ! 28: fmt_bg(); ! 29: return(OK); ! 30: } ! 31: ! 32: s_wdfe(a) cilist *a; ! 33: { ! 34: int n; ! 35: reading = NO; ! 36: if(n=c_dfe(a,WRITE)) return(n); ! 37: curunit->uend = NO; ! 38: if(!curunit->uwrt) nowwriting(curunit); ! 39: putn = y_putc; ! 40: doed = w_ed; ! 41: doned = w_ned; ! 42: dotab = y_tab; ! 43: dorevert = doend = donewrec = y_wnew; ! 44: if(pars_f(fmtbuf)) err(errflag,F_ERFMT,wdfe) ! 45: fmt_bg(); ! 46: return(OK); ! 47: } ! 48: ! 49: e_rdfe() ! 50: { ! 51: en_fio(); ! 52: return(OK); ! 53: } ! 54: ! 55: e_wdfe() ! 56: { ! 57: en_fio(); ! 58: return(OK); ! 59: } ! 60: ! 61: c_dfe(a,flag) cilist *a; ! 62: { int n; ! 63: sequential = NO; ! 64: external = formatted = FORMATTED; ! 65: lfname = NULL; ! 66: elist = NO; ! 67: cursor=scale=recpos=reclen=0; ! 68: radix = 10; ! 69: signit = YES; ! 70: fmtbuf = a->cifmt; ! 71: errflag = a->cierr; ! 72: endflag = a->ciend; ! 73: lunit = a->ciunit; ! 74: if(not_legal(lunit)) err(errflag,F_ERUNIT,dfe); ! 75: curunit = &units[lunit]; ! 76: if(!curunit->ufd && (n=fk_open(flag,DIR,FMT,(ftnint)lunit))) ! 77: err(errflag,n,dfe) ! 78: cf = curunit->ufd; ! 79: elist = YES; ! 80: lfname = curunit->ufnm; ! 81: if(!curunit->ufmt) err(errflag,F_ERNOFIO,dfe) ! 82: if(!curunit->useek || !curunit->url) err(errflag,F_ERNODIO,dfe) ! 83: recnum = a->cirec - 1; ! 84: fseek(cf, (long)curunit->url * recnum, 0); ! 85: cblank = curunit->ublnk; ! 86: cplus = NO; ! 87: return(OK); ! 88: } ! 89: ! 90: y_getc() ! 91: { ! 92: int ch; ! 93: if(curunit->uend) return(EOF); ! 94: if(curunit->url==1 || recpos++ < curunit->url) ! 95: { ! 96: if((ch=getc(cf))!=EOF) ! 97: { ! 98: return(ch); ! 99: } ! 100: if(feof(cf)) ! 101: { ! 102: curunit->uend = YES; ! 103: return(EOF); ! 104: } ! 105: err(errflag,errno,rdfe); ! 106: } ! 107: else return(' '); ! 108: } ! 109: ! 110: y_putc(c) ! 111: { ! 112: if(curunit->url!=1 && recpos++ >= curunit->url) err(errflag,F_EREREC,wdfe) ! 113: putc(c,cf); ! 114: return(OK); ! 115: } ! 116: ! 117: y_tab() ! 118: { int n; ! 119: if(curunit->url==1) ! 120: { ! 121: if(cursor < 0 && -cursor > ftell(cf)) return(F_ERBREC); ! 122: } ! 123: else ! 124: { if(reclen < recpos) reclen = recpos; ! 125: if((recpos + cursor) < 0) return(F_ERBREC); ! 126: n = reclen - recpos; /* n >= 0 */ ! 127: if(!reading && (cursor-n) > 0) ! 128: { recpos = reclen; ! 129: cursor -= n; ! 130: fseek(cf,(long)n,1); ! 131: while(cursor--) if(n=(*putn)(' ')) return(n); ! 132: return(cursor=0); ! 133: } ! 134: recpos += cursor; ! 135: if(recpos >= curunit->url) err(errflag,F_EREREC,dfe) ! 136: } ! 137: fseek(cf,(long)cursor,1); ! 138: return(cursor=0); ! 139: } ! 140: ! 141: /* ! 142: /*y_rev() ! 143: /*{ /*what about work done?*/ ! 144: /* if(curunit->url==1) return(0); ! 145: /* while(recpos<curunit->url) (*putn)(' '); ! 146: /* recpos=0; ! 147: /* return(0); ! 148: /*} ! 149: /* ! 150: /*y_err() ! 151: /*{ ! 152: /* err(errflag, F_EREREC, dfe); ! 153: /*} ! 154: */ ! 155: ! 156: y_rnew() ! 157: { if(curunit->url != 1) ! 158: { fseek(cf,(long)curunit->url*(++recnum),0); ! 159: recpos = reclen = cursor = 0; ! 160: } ! 161: return(OK); ! 162: } ! 163: ! 164: y_wnew() ! 165: { if(curunit->url != 1) ! 166: { if(reclen > recpos) ! 167: { fseek(cf,(long)(reclen-recpos),1); ! 168: recpos = reclen; ! 169: } ! 170: while(recpos < curunit->url) (*putn)(' '); ! 171: recnum++; ! 172: recpos = reclen = cursor = 0; ! 173: } ! 174: return(OK); ! 175: } ! 176: ! 177: y_rend() ! 178: { ! 179: return(OK); ! 180: } ! 181: ! 182: y_wend() ! 183: { ! 184: return(y_wnew()); ! 185: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.