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