12484Sdlw /* 2*10674Sdlw char id_backspace[] = "@(#)backspace.c 1.5"; 32484Sdlw * 42484Sdlw * Backspace records 52484Sdlw */ 62484Sdlw 72484Sdlw #include "fio.h" 82484Sdlw 9*10674Sdlw static char bksp[] = "backspace"; 10*10674Sdlw char last_char(); 112484Sdlw 12*10674Sdlw f_back(a) 13*10674Sdlw alist *a; 142484Sdlw { unit *b; 152484Sdlw int n,i; 162484Sdlw long x,y; 174728Sdlw 182484Sdlw lfname = NULL; 192484Sdlw elist = NO; 202484Sdlw external = YES; 212484Sdlw errflag = a->aerr; 222484Sdlw lunit = a->aunit; 23*10674Sdlw if (not_legal(lunit)) 24*10674Sdlw err(errflag, F_ERUNIT, bksp) 252484Sdlw b= &units[lunit]; 26*10674Sdlw if(!b->ufd && (n = fk_open(READ, SEQ, FMT, (ftnint)lunit)) ) 27*10674Sdlw err(errflag, n, bksp) 282484Sdlw lfname = b->ufnm; 292484Sdlw if(b->uend) 302484Sdlw { b->uend = NO; 316600Sdlw clearerr(b->ufd); 322484Sdlw return(OK); 332484Sdlw } 34*10674Sdlw if((x = ftell(b->ufd)) == 0) 35*10674Sdlw return(OK); 36*10674Sdlw if(!b->useek) 37*10674Sdlw err(errflag, F_ERNOBKSP, bksp) 38*10674Sdlw if(b->uwrt && (n = t_runc(b, errflag))) 39*10674Sdlw return(n); 402484Sdlw if(b->url) /* direct access, purely academic */ 412484Sdlw { y = x%(long)b->url; 422484Sdlw x -= y?y:b->url; 432484Sdlw fseek(b->ufd,x,0); 442484Sdlw return(OK); 452484Sdlw } 462484Sdlw if(!b->ufmt) /* unformatted sequential */ 472484Sdlw { fseek(b->ufd,-(long)sizeof(int),1); 482484Sdlw fread((char *)&n,sizeof(int),1,b->ufd); 492484Sdlw fseek(b->ufd,-(long)n-2*sizeof(int),1); 502484Sdlw return(OK); 512484Sdlw } 52*10674Sdlw if(x == 1) /* formatted sequential */ 532484Sdlw { rewind(b->ufd); 542484Sdlw return(OK); 552484Sdlw } 56*10674Sdlw if (b->uwrt && ! nowreading(b)) 57*10674Sdlw err(errflag, errno, bksp) 58*10674Sdlw while (last_char(b->ufd) != '\n') /* slow but simple */ 59*10674Sdlw ; 602484Sdlw return(OK); 612484Sdlw } 62