12486Sdlw /* 2*2584Sdlw char id_dfe[] = "@(#)dfe.c 1.2"; 32486Sdlw * 42486Sdlw * direct formatted external i/o 52486Sdlw */ 62486Sdlw 72486Sdlw #include "fio.h" 82486Sdlw 92486Sdlw extern int rd_ed(),rd_ned(),w_ed(),w_ned(); 102486Sdlw int y_getc(),y_putc(),y_rnew(),y_wnew(),y_tab(); 112486Sdlw 122486Sdlw char *dfe = "dfe"; 132486Sdlw char *rdfe = "read dfe"; 142486Sdlw char *wdfe = "write dfe"; 152486Sdlw 162486Sdlw s_rdfe(a) cilist *a; 172486Sdlw { 182486Sdlw int n; 192486Sdlw reading = YES; 202486Sdlw if(n=c_dfe(a,READ)) return(n); 212486Sdlw if(curunit->uwrt) nowreading(curunit); 222486Sdlw getn = y_getc; 232486Sdlw doed = rd_ed; 242486Sdlw doned = rd_ned; 252486Sdlw dotab = y_tab; 262486Sdlw dorevert = doend = donewrec = y_rnew; 27*2584Sdlw if(pars_f(fmtbuf)) err(errflag,F_ERFMT,rdfe) 282486Sdlw fmt_bg(); 292486Sdlw return(OK); 302486Sdlw } 312486Sdlw 322486Sdlw s_wdfe(a) cilist *a; 332486Sdlw { 342486Sdlw int n; 352486Sdlw reading = NO; 362486Sdlw if(n=c_dfe(a,WRITE)) return(n); 372486Sdlw curunit->uend = NO; 382486Sdlw if(!curunit->uwrt) nowwriting(curunit); 392486Sdlw putn = y_putc; 402486Sdlw doed = w_ed; 412486Sdlw doned = w_ned; 422486Sdlw dotab = y_tab; 432486Sdlw dorevert = doend = donewrec = y_wnew; 44*2584Sdlw if(pars_f(fmtbuf)) err(errflag,F_ERFMT,wdfe) 452486Sdlw fmt_bg(); 462486Sdlw return(OK); 472486Sdlw } 482486Sdlw 492486Sdlw e_rdfe() 502486Sdlw { 512486Sdlw en_fio(); 522486Sdlw return(OK); 532486Sdlw } 542486Sdlw 552486Sdlw e_wdfe() 562486Sdlw { 572486Sdlw en_fio(); 582486Sdlw return(OK); 592486Sdlw } 602486Sdlw 612486Sdlw c_dfe(a,flag) cilist *a; 622486Sdlw { int n; 632486Sdlw sequential = NO; 642486Sdlw external = formatted = FORMATTED; 652486Sdlw lfname = NULL; 662486Sdlw elist = NO; 672486Sdlw cursor=scale=recpos=reclen=0; 682486Sdlw radix = 10; 692486Sdlw signit = YES; 702486Sdlw fmtbuf = a->cifmt; 712486Sdlw errflag = a->cierr; 722486Sdlw endflag = a->ciend; 732486Sdlw lunit = a->ciunit; 74*2584Sdlw if(not_legal(lunit)) err(errflag,F_ERUNIT,dfe); 752486Sdlw curunit = &units[lunit]; 762486Sdlw if(!curunit->ufd && (n=fk_open(flag,DIR,FMT,(ftnint)lunit))) 772486Sdlw err(errflag,n,dfe) 782486Sdlw cf = curunit->ufd; 792486Sdlw elist = YES; 802486Sdlw lfname = curunit->ufnm; 81*2584Sdlw if(!curunit->ufmt) err(errflag,F_ERNOFIO,dfe) 82*2584Sdlw if(!curunit->useek || !curunit->url) err(errflag,F_ERNODIO,dfe) 832486Sdlw recnum = a->cirec - 1; 842486Sdlw fseek(cf, (long)curunit->url * recnum, 0); 852486Sdlw cblank = curunit->ublnk; 862486Sdlw cplus = NO; 872486Sdlw return(OK); 882486Sdlw } 892486Sdlw 902486Sdlw y_getc() 912486Sdlw { 922486Sdlw int ch; 932486Sdlw if(curunit->uend) return(EOF); 942486Sdlw if(curunit->url==1 || recpos++ < curunit->url) 952486Sdlw { 962486Sdlw if((ch=getc(cf))!=EOF) 972486Sdlw { 982486Sdlw return(ch); 992486Sdlw } 1002486Sdlw if(feof(cf)) 1012486Sdlw { 1022486Sdlw curunit->uend = YES; 1032486Sdlw return(EOF); 1042486Sdlw } 1052486Sdlw err(errflag,errno,rdfe); 1062486Sdlw } 1072486Sdlw else return(' '); 1082486Sdlw } 1092486Sdlw 1102486Sdlw y_putc(c) 1112486Sdlw { 112*2584Sdlw if(curunit->url!=1 && recpos++ >= curunit->url) err(errflag,F_EREREC,wdfe) 1132486Sdlw putc(c,cf); 1142486Sdlw return(OK); 1152486Sdlw } 1162486Sdlw 1172486Sdlw y_tab() 1182486Sdlw { int n; 1192486Sdlw if(curunit->url==1) 1202486Sdlw { 121*2584Sdlw if(cursor < 0 && -cursor > ftell(cf)) return(F_ERBREC); 1222486Sdlw } 1232486Sdlw else 1242486Sdlw { if(reclen < recpos) reclen = recpos; 125*2584Sdlw if((recpos + cursor) < 0) return(F_ERBREC); 1262486Sdlw n = reclen - recpos; /* n >= 0 */ 1272486Sdlw if(!reading && (cursor-n) > 0) 1282486Sdlw { recpos = reclen; 1292486Sdlw cursor -= n; 1302486Sdlw fseek(cf,(long)n,1); 1312486Sdlw while(cursor--) if(n=(*putn)(' ')) return(n); 1322486Sdlw return(cursor=0); 1332486Sdlw } 1342486Sdlw recpos += cursor; 135*2584Sdlw if(recpos >= curunit->url) err(errflag,F_EREREC,dfe) 1362486Sdlw } 1372486Sdlw fseek(cf,(long)cursor,1); 1382486Sdlw return(cursor=0); 1392486Sdlw } 1402486Sdlw 1412486Sdlw /* 1422486Sdlw /*y_rev() 1432486Sdlw /*{ /*what about work done?*/ 1442486Sdlw /* if(curunit->url==1) return(0); 1452486Sdlw /* while(recpos<curunit->url) (*putn)(' '); 1462486Sdlw /* recpos=0; 1472486Sdlw /* return(0); 1482486Sdlw /*} 1492486Sdlw /* 1502486Sdlw /*y_err() 1512486Sdlw /*{ 152*2584Sdlw /* err(errflag, F_EREREC, dfe); 1532486Sdlw /*} 1542486Sdlw */ 1552486Sdlw 1562486Sdlw y_rnew() 1572486Sdlw { if(curunit->url != 1) 1582486Sdlw { fseek(cf,(long)curunit->url*(++recnum),0); 1592486Sdlw recpos = reclen = cursor = 0; 1602486Sdlw } 1612486Sdlw return(OK); 1622486Sdlw } 1632486Sdlw 1642486Sdlw y_wnew() 1652486Sdlw { if(curunit->url != 1) 1662486Sdlw { if(reclen > recpos) 1672486Sdlw { fseek(cf,(long)(reclen-recpos),1); 1682486Sdlw recpos = reclen; 1692486Sdlw } 1702486Sdlw while(recpos < curunit->url) (*putn)(' '); 1712486Sdlw recnum++; 1722486Sdlw recpos = reclen = cursor = 0; 1732486Sdlw } 1742486Sdlw return(OK); 1752486Sdlw } 1762486Sdlw 1772486Sdlw y_rend() 1782486Sdlw { 1792486Sdlw return(OK); 1802486Sdlw } 1812486Sdlw 1822486Sdlw y_wend() 1832486Sdlw { 1842486Sdlw return(y_wnew()); 1852486Sdlw } 186