xref: /original-bsd/usr.bin/f77/libI77/c_sfe.c (revision da818fbb)
1 /*
2  * Copyright (c) 1980 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  *	@(#)c_sfe.c	5.3	02/25/90
7  */
8 
9 /*
10  * sequential formatted external I/O - common read & write routines
11  */
12 
13 #include "fio.h"
14 
15 c_sfe(a,flg,mode,str) cilist *a; char *str; /* check */
16 {	unit *p;
17 	int n;
18 
19 	external=YES;
20 	formatted=FORMATTED;
21 	fmtbuf=a->cifmt;
22 	lfname = NULL;
23 	elist = NO;
24 	errflag = a->cierr;
25 	endflag = a->ciend;
26 	lunit = a->ciunit;
27 	if(not_legal(lunit)) err(errflag,F_ERUNIT,str);
28 	curunit = p = &units[lunit];
29 	if(!p->ufd && (n=fk_open(flg,mode,FMT,(ftnint)lunit)) )
30 		err(errflag,n,str)
31 	cf = curunit->ufd;
32 	elist = YES;
33 	lfname = curunit->ufnm;
34 	if(!p->ufmt) err(errflag,F_ERNOFIO,str)
35 	cursor=recpos=scale=reclen=0;
36 	radix = 10;
37 	signit = YES;
38 	cblank = curunit->ublnk;
39 	cplus = NO;
40 	return(OK);
41 }
42 
43 x_tab()
44 {	int n;
45 	if(reclen < recpos) reclen = recpos;
46 	if(curunit->useek)
47 	{	if((recpos+cursor) < 0) cursor = -recpos;	/* to BOR */
48 		n = reclen - recpos;	/* distance to eor, n>=0 */
49 		if((cursor-n) > 0)
50 		{	fseek(cf,(long)n,1);  /* find current eor */
51 			recpos = reclen;
52 			cursor -= n;
53 		}
54 		else
55 		{	fseek(cf,(long)cursor,1);  /* do not pass go */
56 			recpos += cursor;
57 			return(cursor=0);
58 		}
59 	}
60 	else
61 		if(cursor < 0) return(F_ERSEEK);   /* can't go back */
62 	while(cursor--)
63 	{	if(reading)
64 		{	n = (*getn)();
65 			if(n=='\n') return(cursor=0);	/* be tolerant */
66 			if(n==EOF) return(EOF);
67 		}
68 		else	(*putn)(' ');	/* fill in the empty record */
69 	}
70 	return(cursor=0);
71 }
72