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