missing arg
[unix-history] / usr / src / usr.bin / f77 / libI77 / backspace.c
CommitLineData
7bd0b8c0 1/*
1604dff5 2char id_backspace[] = "@(#)backspace.c 1.4";
7bd0b8c0
DW
3 *
4 * Backspace records
5 */
6
7#include "fio.h"
8
9char *bksp = "backspace";
10char last_char();
11
12f_back(a) alist *a;
13{ unit *b;
14 int n,i;
15 long x,y;
2621bc46 16
7bd0b8c0
DW
17 lfname = NULL;
18 elist = NO;
19 external = YES;
20 errflag = a->aerr;
21 lunit = a->aunit;
3bbbaca0 22 if (not_legal(lunit)) err(errflag,F_ERUNIT,bksp)
7bd0b8c0
DW
23 b= &units[lunit];
24 if(!b->ufd && (n=fk_open(READ,SEQ,FMT,(ftnint)lunit)) )
25 err(errflag,n,bksp)
26 lfname = b->ufnm;
27 if(b->uend)
28 { b->uend = NO;
1604dff5 29 clearerr(b->ufd);
7bd0b8c0
DW
30 return(OK);
31 }
32 if((x=ftell(b->ufd))==0) return(OK);
3bbbaca0 33 if(!b->useek) err(errflag,F_ERNOBKSP,bksp)
2621bc46 34 if(b->uwrt && (n=t_runc(b,errflag))) return(n);
7bd0b8c0
DW
35 if(b->url) /* direct access, purely academic */
36 { y = x%(long)b->url;
37 x -= y?y:b->url;
38 fseek(b->ufd,x,0);
39 return(OK);
40 }
41 if(!b->ufmt) /* unformatted sequential */
42 { fseek(b->ufd,-(long)sizeof(int),1);
43 fread((char *)&n,sizeof(int),1,b->ufd);
44 fseek(b->ufd,-(long)n-2*sizeof(int),1);
45 return(OK);
46 }
47 if(x==1) /* formatted sequential */
48 { rewind(b->ufd);
49 return(OK);
50 }
51 while(last_char(b->ufd)!='\n'); /* slow but simple */
52 return(OK);
53}