xref: /csrg-svn/usr.bin/f77/libI77/c_dfe.c (revision 20989)
1*20989Slibs /*
2*20989Slibs char id_c_dfe[] = "@(#)c_dfe.c	1.1";
3*20989Slibs  *
4*20989Slibs  * direct formatted external i/o - common read/write routines
5*20989Slibs  */
6*20989Slibs 
7*20989Slibs #include "fio.h"
8*20989Slibs 
9*20989Slibs c_dfe(a,flag,str) cilist *a; char *str;
10*20989Slibs {	int n;
11*20989Slibs 	sequential = NO;
12*20989Slibs 	external = formatted = FORMATTED;
13*20989Slibs 	lfname = NULL;
14*20989Slibs 	elist = NO;
15*20989Slibs 	cursor=scale=recpos=reclen=0;
16*20989Slibs 	radix = 10;
17*20989Slibs 	signit = YES;
18*20989Slibs 	fmtbuf = a->cifmt;
19*20989Slibs 	errflag = a->cierr;
20*20989Slibs 	endflag = a->ciend;
21*20989Slibs 	lunit = a->ciunit;
22*20989Slibs 	if(not_legal(lunit)) err(errflag,F_ERUNIT,str);
23*20989Slibs 	curunit = &units[lunit];
24*20989Slibs 	if(!curunit->ufd && (n=fk_open(flag,DIR,FMT,(ftnint)lunit)))
25*20989Slibs 		err(errflag,n,str)
26*20989Slibs 	cf = curunit->ufd;
27*20989Slibs 	elist = YES;
28*20989Slibs 	lfname = curunit->ufnm;
29*20989Slibs 	if(!curunit->ufmt) err(errflag,F_ERNOFIO,str)
30*20989Slibs 	if(!curunit->useek || !curunit->url) err(errflag,F_ERNODIO,str)
31*20989Slibs 	recnum = a->cirec - 1;
32*20989Slibs 	fseek(cf, (long)curunit->url * recnum, 0);
33*20989Slibs 	cblank = curunit->ublnk;
34*20989Slibs 	cplus = NO;
35*20989Slibs 	return(OK);
36*20989Slibs }
37*20989Slibs 
38*20989Slibs y_tab()
39*20989Slibs {	int n;
40*20989Slibs 	if(curunit->url==1)
41*20989Slibs 	{
42*20989Slibs 		if(cursor < 0 && -cursor > ftell(cf)) rewind(cf);
43*20989Slibs 		else	fseek(cf,(long)cursor,1);
44*20989Slibs 		return(cursor=0);
45*20989Slibs 	}
46*20989Slibs 	else
47*20989Slibs 	{	if(reclen < recpos) reclen = recpos;
48*20989Slibs 		if((recpos + cursor) < 0) cursor = -recpos;	/* BOR */
49*20989Slibs 		n = reclen - recpos;		/* n >= 0 */
50*20989Slibs 		if(!reading && (cursor-n) > 0)
51*20989Slibs 		{	recpos = reclen;
52*20989Slibs 			cursor -= n;
53*20989Slibs 			fseek(cf,(long)n,1);
54*20989Slibs 			while(cursor--) if(n=(*putn)(' ')) return(n);
55*20989Slibs 			return(cursor=0);
56*20989Slibs 		}
57*20989Slibs 		recpos += cursor;
58*20989Slibs 		if(recpos >= curunit->url) err(errflag,F_EREREC,"dfe")
59*20989Slibs 	}
60*20989Slibs 	fseek(cf,(long)cursor,1);
61*20989Slibs 	return(cursor=0);
62*20989Slibs }
63