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
f_back(a)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