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