xref: /csrg-svn/usr.bin/f77/libI77/c_dfe.c (revision 24097)
120989Slibs /*
223064Skre  * Copyright (c) 1980 Regents of the University of California.
323064Skre  * All rights reserved.  The Berkeley software License Agreement
423064Skre  * specifies the terms and conditions for redistribution.
520989Slibs  *
6*24097Sjerry  *	@(#)c_dfe.c	5.2	07/30/85
723064Skre  */
823064Skre 
923064Skre /*
1020989Slibs  * direct formatted external i/o - common read/write routines
1120989Slibs  */
1220989Slibs 
1320989Slibs #include "fio.h"
1420989Slibs 
1520989Slibs c_dfe(a,flag,str) cilist *a; char *str;
1620989Slibs {	int n;
1720989Slibs 	sequential = NO;
18*24097Sjerry 	external = YES;
19*24097Sjerry 	formatted = FORMATTED;
2020989Slibs 	lfname = NULL;
2120989Slibs 	elist = NO;
2220989Slibs 	cursor=scale=recpos=reclen=0;
2320989Slibs 	radix = 10;
2420989Slibs 	signit = YES;
2520989Slibs 	fmtbuf = a->cifmt;
2620989Slibs 	errflag = a->cierr;
2720989Slibs 	endflag = a->ciend;
2820989Slibs 	lunit = a->ciunit;
2920989Slibs 	if(not_legal(lunit)) err(errflag,F_ERUNIT,str);
3020989Slibs 	curunit = &units[lunit];
3120989Slibs 	if(!curunit->ufd && (n=fk_open(flag,DIR,FMT,(ftnint)lunit)))
3220989Slibs 		err(errflag,n,str)
3320989Slibs 	cf = curunit->ufd;
3420989Slibs 	elist = YES;
3520989Slibs 	lfname = curunit->ufnm;
3620989Slibs 	if(!curunit->ufmt) err(errflag,F_ERNOFIO,str)
3720989Slibs 	if(!curunit->useek || !curunit->url) err(errflag,F_ERNODIO,str)
3820989Slibs 	recnum = a->cirec - 1;
3920989Slibs 	fseek(cf, (long)curunit->url * recnum, 0);
4020989Slibs 	cblank = curunit->ublnk;
4120989Slibs 	cplus = NO;
4220989Slibs 	return(OK);
4320989Slibs }
4420989Slibs 
4520989Slibs y_tab()
4620989Slibs {	int n;
4720989Slibs 	if(curunit->url==1)
4820989Slibs 	{
4920989Slibs 		if(cursor < 0 && -cursor > ftell(cf)) rewind(cf);
5020989Slibs 		else	fseek(cf,(long)cursor,1);
5120989Slibs 		return(cursor=0);
5220989Slibs 	}
5320989Slibs 	else
5420989Slibs 	{	if(reclen < recpos) reclen = recpos;
5520989Slibs 		if((recpos + cursor) < 0) cursor = -recpos;	/* BOR */
5620989Slibs 		n = reclen - recpos;		/* n >= 0 */
5720989Slibs 		if(!reading && (cursor-n) > 0)
5820989Slibs 		{	recpos = reclen;
5920989Slibs 			cursor -= n;
6020989Slibs 			fseek(cf,(long)n,1);
6120989Slibs 			while(cursor--) if(n=(*putn)(' ')) return(n);
6220989Slibs 			return(cursor=0);
6320989Slibs 		}
6420989Slibs 		recpos += cursor;
6520989Slibs 		if(recpos >= curunit->url) err(errflag,F_EREREC,"dfe")
6620989Slibs 	}
6720989Slibs 	fseek(cf,(long)cursor,1);
6820989Slibs 	return(cursor=0);
6920989Slibs }
70