1*47943Sbostic /*-
2*47943Sbostic * Copyright (c) 1980 The Regents of the University of California.
3*47943Sbostic * All rights reserved.
420989Slibs *
5*47943Sbostic * %sccs.include.proprietary.c%
623064Skre */
723064Skre
8*47943Sbostic #ifndef lint
9*47943Sbostic static char sccsid[] = "@(#)c_dfe.c 5.4 (Berkeley) 04/12/91";
10*47943Sbostic #endif /* not lint */
11*47943Sbostic
1223064Skre /*
1320989Slibs * direct formatted external i/o - common read/write routines
1420989Slibs */
1520989Slibs
1620989Slibs #include "fio.h"
1720989Slibs
c_dfe(a,flg,str)1840228Sdonn c_dfe(a,flg,str) cilist *a; char *str;
1920989Slibs { int n;
2020989Slibs sequential = NO;
2124097Sjerry external = YES;
2224097Sjerry formatted = FORMATTED;
2320989Slibs lfname = NULL;
2420989Slibs elist = NO;
2520989Slibs cursor=scale=recpos=reclen=0;
2620989Slibs radix = 10;
2720989Slibs signit = YES;
2820989Slibs fmtbuf = a->cifmt;
2920989Slibs errflag = a->cierr;
3020989Slibs endflag = a->ciend;
3120989Slibs lunit = a->ciunit;
3220989Slibs if(not_legal(lunit)) err(errflag,F_ERUNIT,str);
3320989Slibs curunit = &units[lunit];
3440228Sdonn if(!curunit->ufd && (n=fk_open(flg,DIR,FMT,(ftnint)lunit)))
3520989Slibs err(errflag,n,str)
3620989Slibs cf = curunit->ufd;
3720989Slibs elist = YES;
3820989Slibs lfname = curunit->ufnm;
3920989Slibs if(!curunit->ufmt) err(errflag,F_ERNOFIO,str)
4020989Slibs if(!curunit->useek || !curunit->url) err(errflag,F_ERNODIO,str)
4120989Slibs recnum = a->cirec - 1;
4220989Slibs fseek(cf, (long)curunit->url * recnum, 0);
4320989Slibs cblank = curunit->ublnk;
4420989Slibs cplus = NO;
4520989Slibs return(OK);
4620989Slibs }
4720989Slibs
y_tab()4820989Slibs y_tab()
4920989Slibs { int n;
5020989Slibs if(curunit->url==1)
5120989Slibs {
5220989Slibs if(cursor < 0 && -cursor > ftell(cf)) rewind(cf);
5320989Slibs else fseek(cf,(long)cursor,1);
5420989Slibs return(cursor=0);
5520989Slibs }
5620989Slibs else
5720989Slibs { if(reclen < recpos) reclen = recpos;
5820989Slibs if((recpos + cursor) < 0) cursor = -recpos; /* BOR */
5920989Slibs n = reclen - recpos; /* n >= 0 */
6020989Slibs if(!reading && (cursor-n) > 0)
6120989Slibs { recpos = reclen;
6220989Slibs cursor -= n;
6320989Slibs fseek(cf,(long)n,1);
6420989Slibs while(cursor--) if(n=(*putn)(' ')) return(n);
6520989Slibs return(cursor=0);
6620989Slibs }
6720989Slibs recpos += cursor;
6820989Slibs if(recpos >= curunit->url) err(errflag,F_EREREC,"dfe")
6920989Slibs }
7020989Slibs fseek(cf,(long)cursor,1);
7120989Slibs return(cursor=0);
7220989Slibs }
73