date and time created 83/02/24 12:56:06 by mckusick
[unix-history] / usr / src / usr.bin / f77 / libI77 / dfe.c
CommitLineData
1d55a1e7 1/*
1f3f92e0 2char id_dfe[] = "@(#)dfe.c 1.3";
1d55a1e7
DW
3 *
4 * direct formatted external i/o
5 */
6
7#include "fio.h"
8
9extern int rd_ed(),rd_ned(),w_ed(),w_ned();
10int y_getc(),y_putc(),y_rnew(),y_wnew(),y_tab();
11
1f3f92e0
DW
12char rdfe[] = "read dfe";
13char wdfe[] = "write dfe";
1d55a1e7
DW
14
15s_rdfe(a) cilist *a;
16{
17 int n;
18 reading = YES;
19 if(n=c_dfe(a,READ)) return(n);
1f3f92e0 20 if(curunit->uwrt && ! nowreading(curunit)) err(errflag, errno, rdfe)
1d55a1e7
DW
21 getn = y_getc;
22 doed = rd_ed;
23 doned = rd_ned;
24 dotab = y_tab;
25 dorevert = doend = donewrec = y_rnew;
14c902c5 26 if(pars_f(fmtbuf)) err(errflag,F_ERFMT,rdfe)
1d55a1e7
DW
27 fmt_bg();
28 return(OK);
29}
30
31s_wdfe(a) cilist *a;
32{
33 int n;
34 reading = NO;
35 if(n=c_dfe(a,WRITE)) return(n);
36 curunit->uend = NO;
1f3f92e0 37 if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, wdfe)
1d55a1e7
DW
38 putn = y_putc;
39 doed = w_ed;
40 doned = w_ned;
41 dotab = y_tab;
42 dorevert = doend = donewrec = y_wnew;
14c902c5 43 if(pars_f(fmtbuf)) err(errflag,F_ERFMT,wdfe)
1d55a1e7
DW
44 fmt_bg();
45 return(OK);
46}
47
48e_rdfe()
49{
50 en_fio();
51 return(OK);
52}
53
54e_wdfe()
55{
56 en_fio();
57 return(OK);
58}
59
60c_dfe(a,flag) cilist *a;
61{ int n;
62 sequential = NO;
63 external = formatted = FORMATTED;
64 lfname = NULL;
65 elist = NO;
66 cursor=scale=recpos=reclen=0;
67 radix = 10;
68 signit = YES;
69 fmtbuf = a->cifmt;
70 errflag = a->cierr;
71 endflag = a->ciend;
72 lunit = a->ciunit;
1f3f92e0 73 if(not_legal(lunit)) err(errflag,F_ERUNIT,rdfe+5);
1d55a1e7
DW
74 curunit = &units[lunit];
75 if(!curunit->ufd && (n=fk_open(flag,DIR,FMT,(ftnint)lunit)))
1f3f92e0 76 err(errflag,n,rdfe+5)
1d55a1e7
DW
77 cf = curunit->ufd;
78 elist = YES;
79 lfname = curunit->ufnm;
1f3f92e0
DW
80 if(!curunit->ufmt) err(errflag,F_ERNOFIO,rdfe+5)
81 if(!curunit->useek || !curunit->url) err(errflag,F_ERNODIO,rdfe+5)
1d55a1e7
DW
82 recnum = a->cirec - 1;
83 fseek(cf, (long)curunit->url * recnum, 0);
84 cblank = curunit->ublnk;
85 cplus = NO;
86 return(OK);
87}
88
89y_getc()
90{
91 int ch;
92 if(curunit->uend) return(EOF);
93 if(curunit->url==1 || recpos++ < curunit->url)
94 {
95 if((ch=getc(cf))!=EOF)
96 {
97 return(ch);
98 }
99 if(feof(cf))
100 {
101 curunit->uend = YES;
102 return(EOF);
103 }
104 err(errflag,errno,rdfe);
105 }
106 else return(' ');
107}
108
109y_putc(c)
110{
14c902c5 111 if(curunit->url!=1 && recpos++ >= curunit->url) err(errflag,F_EREREC,wdfe)
1d55a1e7
DW
112 putc(c,cf);
113 return(OK);
114}
115
116y_tab()
117{ int n;
118 if(curunit->url==1)
119 {
14c902c5 120 if(cursor < 0 && -cursor > ftell(cf)) return(F_ERBREC);
1d55a1e7
DW
121 }
122 else
123 { if(reclen < recpos) reclen = recpos;
14c902c5 124 if((recpos + cursor) < 0) return(F_ERBREC);
1d55a1e7
DW
125 n = reclen - recpos; /* n >= 0 */
126 if(!reading && (cursor-n) > 0)
127 { recpos = reclen;
128 cursor -= n;
129 fseek(cf,(long)n,1);
130 while(cursor--) if(n=(*putn)(' ')) return(n);
131 return(cursor=0);
132 }
133 recpos += cursor;
1f3f92e0 134 if(recpos >= curunit->url) err(errflag,F_EREREC,rdfe+5)
1d55a1e7
DW
135 }
136 fseek(cf,(long)cursor,1);
137 return(cursor=0);
138}
139
140/*
141/*y_rev()
142/*{ /*what about work done?*/
143/* if(curunit->url==1) return(0);
144/* while(recpos<curunit->url) (*putn)(' ');
145/* recpos=0;
146/* return(0);
147/*}
148/*
149/*y_err()
150/*{
1f3f92e0 151/* err(errflag, F_EREREC, rdfe+5);
1d55a1e7
DW
152/*}
153*/
154
155y_rnew()
156{ if(curunit->url != 1)
157 { fseek(cf,(long)curunit->url*(++recnum),0);
158 recpos = reclen = cursor = 0;
159 }
160 return(OK);
161}
162
163y_wnew()
164{ if(curunit->url != 1)
165 { if(reclen > recpos)
166 { fseek(cf,(long)(reclen-recpos),1);
167 recpos = reclen;
168 }
169 while(recpos < curunit->url) (*putn)(' ');
170 recnum++;
171 recpos = reclen = cursor = 0;
172 }
173 return(OK);
174}
175
176y_rend()
177{
178 return(OK);
179}
180
181y_wend()
182{
183 return(y_wnew());
184}