12484Sdlw /* 2*14824Sdlw char id_backspace[] = "@(#)backspace.c 1.6"; 32484Sdlw * 42484Sdlw * Backspace records 52484Sdlw */ 62484Sdlw 72484Sdlw #include "fio.h" 82484Sdlw 910674Sdlw static char bksp[] = "backspace"; 1010674Sdlw char last_char(); 112484Sdlw 1210674Sdlw f_back(a) 1310674Sdlw 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; 2310674Sdlw if (not_legal(lunit)) 2410674Sdlw err(errflag, F_ERUNIT, bksp) 252484Sdlw b= &units[lunit]; 2610674Sdlw if(!b->ufd && (n = fk_open(READ, SEQ, FMT, (ftnint)lunit)) ) 2710674Sdlw err(errflag, n, bksp) 282484Sdlw lfname = b->ufnm; 292484Sdlw if(b->uend) 302484Sdlw { b->uend = NO; 316600Sdlw clearerr(b->ufd); 322484Sdlw return(OK); 332484Sdlw } 3410674Sdlw if((x = ftell(b->ufd)) == 0) 3510674Sdlw return(OK); 3610674Sdlw if(!b->useek) 3710674Sdlw err(errflag, F_ERNOBKSP, bksp) 38*14824Sdlw if(b->uwrt && (n = t_runc(b, errflag, bksp))) /* sets 'reading' */ 3910674Sdlw 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 } 5210674Sdlw if(x == 1) /* formatted sequential */ 532484Sdlw { rewind(b->ufd); 542484Sdlw return(OK); 552484Sdlw } 5610674Sdlw while (last_char(b->ufd) != '\n') /* slow but simple */ 5710674Sdlw ; 582484Sdlw return(OK); 592484Sdlw } 60