xref: /csrg-svn/usr.bin/f77/libI77/c_sfe.c (revision 47943)
1*47943Sbostic /*-
2*47943Sbostic  * Copyright (c) 1980 The Regents of the University of California.
3*47943Sbostic  * All rights reserved.
420986Slibs  *
5*47943Sbostic  * %sccs.include.proprietary.c%
623066Skre  */
723066Skre 
8*47943Sbostic #ifndef lint
9*47943Sbostic static char sccsid[] = "@(#)c_sfe.c	5.4 (Berkeley) 04/12/91";
10*47943Sbostic #endif /* not lint */
11*47943Sbostic 
1223066Skre /*
1320986Slibs  * sequential formatted external I/O - common read & write routines
1420986Slibs  */
1520986Slibs 
1620986Slibs #include "fio.h"
1720986Slibs 
c_sfe(a,flg,mode,str)1840228Sdonn c_sfe(a,flg,mode,str) cilist *a; char *str; /* check */
1920986Slibs {	unit *p;
2020986Slibs 	int n;
2120986Slibs 
2224097Sjerry 	external=YES;
2324097Sjerry 	formatted=FORMATTED;
2420986Slibs 	fmtbuf=a->cifmt;
2520986Slibs 	lfname = NULL;
2620986Slibs 	elist = NO;
2720986Slibs 	errflag = a->cierr;
2820986Slibs 	endflag = a->ciend;
2920986Slibs 	lunit = a->ciunit;
3020986Slibs 	if(not_legal(lunit)) err(errflag,F_ERUNIT,str);
3120986Slibs 	curunit = p = &units[lunit];
3240228Sdonn 	if(!p->ufd && (n=fk_open(flg,mode,FMT,(ftnint)lunit)) )
3320986Slibs 		err(errflag,n,str)
3420986Slibs 	cf = curunit->ufd;
3520986Slibs 	elist = YES;
3620986Slibs 	lfname = curunit->ufnm;
3720986Slibs 	if(!p->ufmt) err(errflag,F_ERNOFIO,str)
3820986Slibs 	cursor=recpos=scale=reclen=0;
3920986Slibs 	radix = 10;
4020986Slibs 	signit = YES;
4120986Slibs 	cblank = curunit->ublnk;
4220986Slibs 	cplus = NO;
4320986Slibs 	return(OK);
4420986Slibs }
4520986Slibs 
x_tab()4620986Slibs x_tab()
4720986Slibs {	int n;
4820986Slibs 	if(reclen < recpos) reclen = recpos;
4920986Slibs 	if(curunit->useek)
5020986Slibs 	{	if((recpos+cursor) < 0) cursor = -recpos;	/* to BOR */
5120986Slibs 		n = reclen - recpos;	/* distance to eor, n>=0 */
5220986Slibs 		if((cursor-n) > 0)
5320986Slibs 		{	fseek(cf,(long)n,1);  /* find current eor */
5420986Slibs 			recpos = reclen;
5520986Slibs 			cursor -= n;
5620986Slibs 		}
5720986Slibs 		else
5820986Slibs 		{	fseek(cf,(long)cursor,1);  /* do not pass go */
5920986Slibs 			recpos += cursor;
6020986Slibs 			return(cursor=0);
6120986Slibs 		}
6220986Slibs 	}
6320986Slibs 	else
6420986Slibs 		if(cursor < 0) return(F_ERSEEK);   /* can't go back */
6520986Slibs 	while(cursor--)
6620986Slibs 	{	if(reading)
6720986Slibs 		{	n = (*getn)();
6820986Slibs 			if(n=='\n') return(cursor=0);	/* be tolerant */
6920986Slibs 			if(n==EOF) return(EOF);
7020986Slibs 		}
7120986Slibs 		else	(*putn)(' ');	/* fill in the empty record */
7220986Slibs 	}
7320986Slibs 	return(cursor=0);
7420986Slibs }
75