xref: /csrg-svn/usr.bin/f77/libI77/c_sfe.c (revision 23066)
120986Slibs /*
2*23066Skre  * Copyright (c) 1980 Regents of the University of California.
3*23066Skre  * All rights reserved.  The Berkeley software License Agreement
4*23066Skre  * specifies the terms and conditions for redistribution.
520986Slibs  *
6*23066Skre  *	@(#)c_sfe.c	5.1	06/07/85
7*23066Skre  */
8*23066Skre 
9*23066Skre /*
1020986Slibs  * sequential formatted external I/O - common read & write routines
1120986Slibs  */
1220986Slibs 
1320986Slibs #include "fio.h"
1420986Slibs 
1520986Slibs c_sfe(a,flag,mode,str) cilist *a; char *str; /* check */
1620986Slibs {	unit *p;
1720986Slibs 	int n;
1820986Slibs 
1920986Slibs 	external=formatted=FORMATTED;
2020986Slibs 	fmtbuf=a->cifmt;
2120986Slibs 	lfname = NULL;
2220986Slibs 	elist = NO;
2320986Slibs 	errflag = a->cierr;
2420986Slibs 	endflag = a->ciend;
2520986Slibs 	lunit = a->ciunit;
2620986Slibs 	if(not_legal(lunit)) err(errflag,F_ERUNIT,str);
2720986Slibs 	curunit = p = &units[lunit];
2820986Slibs 	if(!p->ufd && (n=fk_open(flag,mode,FMT,(ftnint)lunit)) )
2920986Slibs 		err(errflag,n,str)
3020986Slibs 	cf = curunit->ufd;
3120986Slibs 	elist = YES;
3220986Slibs 	lfname = curunit->ufnm;
3320986Slibs 	if(!p->ufmt) err(errflag,F_ERNOFIO,str)
3420986Slibs 	cursor=recpos=scale=reclen=0;
3520986Slibs 	radix = 10;
3620986Slibs 	signit = YES;
3720986Slibs 	cblank = curunit->ublnk;
3820986Slibs 	cplus = NO;
3920986Slibs 	return(OK);
4020986Slibs }
4120986Slibs 
4220986Slibs x_tab()
4320986Slibs {	int n;
4420986Slibs 	if(reclen < recpos) reclen = recpos;
4520986Slibs 	if(curunit->useek)
4620986Slibs 	{	if((recpos+cursor) < 0) cursor = -recpos;	/* to BOR */
4720986Slibs 		n = reclen - recpos;	/* distance to eor, n>=0 */
4820986Slibs 		if((cursor-n) > 0)
4920986Slibs 		{	fseek(cf,(long)n,1);  /* find current eor */
5020986Slibs 			recpos = reclen;
5120986Slibs 			cursor -= n;
5220986Slibs 		}
5320986Slibs 		else
5420986Slibs 		{	fseek(cf,(long)cursor,1);  /* do not pass go */
5520986Slibs 			recpos += cursor;
5620986Slibs 			return(cursor=0);
5720986Slibs 		}
5820986Slibs 	}
5920986Slibs 	else
6020986Slibs 		if(cursor < 0) return(F_ERSEEK);   /* can't go back */
6120986Slibs 	while(cursor--)
6220986Slibs 	{	if(reading)
6320986Slibs 		{	n = (*getn)();
6420986Slibs 			if(n=='\n') return(cursor=0);	/* be tolerant */
6520986Slibs 			if(n==EOF) return(EOF);
6620986Slibs 		}
6720986Slibs 		else	(*putn)(' ');	/* fill in the empty record */
6820986Slibs 	}
6920986Slibs 	return(cursor=0);
7020986Slibs }
71