1 /*- 2 * Copyright (c) 1980 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.proprietary.c% 6 */ 7 8 #ifndef lint 9 static char sccsid[] = "@(#)backspace.c 5.3 (Berkeley) 04/12/91"; 10 #endif /* not lint */ 11 12 /* 13 * Backspace records 14 */ 15 16 #include "fio.h" 17 18 static char bksp[] = "backspace"; 19 char last_char(); 20 21 f_back(a) 22 alist *a; 23 { unit *b; 24 int n,i; 25 long x,y; 26 27 lfname = NULL; 28 elist = NO; 29 external = YES; 30 errflag = a->aerr; 31 lunit = a->aunit; 32 if (not_legal(lunit)) 33 err(errflag, F_ERUNIT, bksp) 34 b= &units[lunit]; 35 if(!b->ufd) return(OK); 36 lfname = b->ufnm; 37 if(b->uend) 38 { b->uend = NO; 39 clearerr(b->ufd); 40 return(OK); 41 } 42 if((x = ftell(b->ufd)) == 0) 43 return(OK); 44 if(!b->useek) 45 err(errflag, F_ERNOBKSP, bksp) 46 if(b->uwrt && (n = t_runc(b, errflag, bksp))) /* sets 'reading' */ 47 return(n); 48 if(b->url) /* direct access, purely academic */ 49 { y = x%(long)b->url; 50 x -= y?y:b->url; 51 fseek(b->ufd,x,0); 52 return(OK); 53 } 54 if(!b->ufmt) /* unformatted sequential */ 55 { fseek(b->ufd,-(long)sizeof(int),1); 56 fread((char *)&n,sizeof(int),1,b->ufd); 57 fseek(b->ufd,-(long)n-2*sizeof(int),1); 58 return(OK); 59 } 60 if(x == 1) /* formatted sequential */ 61 { rewind(b->ufd); 62 return(OK); 63 } 64 while (last_char(b->ufd) != '\n') /* slow but simple */ 65 ; 66 return(OK); 67 } 68