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