Research V7 development
[unix-history] / usr / src / libI77 / dfe.c
CommitLineData
8662e665
PW
1#include "fio.h"
2#include "fmt.h"
3extern int rd_ed(),rd_ned(),y_getc(),y_putc(),y_err();
4extern int y_rev();
5extern int w_ed(),w_ned();
6s_rdfe(a) cilist *a;
7{
8 int n;
9 if(!init) f_init();
10 if(n=c_dfe(a,READ))return(n);
11 reading=1;
12 if(curunit->uwrt) nowreading(curunit);
13 getn = y_getc;
14 doed = rd_ed;
15 doned = rd_ned;
16 dorevert = donewrec = y_err;
17 doend = y_rev;
18 if(pars_f(fmtbuf)<0)
19 err(a->cierr,100,"startio");
20 fmt_bg();
21 return(0);
22}
23s_wdfe(a) cilist *a;
24{
25 int n;
26 if(!init) f_init();
27 if(n=c_dfe(a,WRITE)) return(n);
28 reading=0;
29 if(!curunit->uwrt) nowwriting(curunit);
30 putn = y_putc;
31 doed = w_ed;
32 doned= w_ned;
33 dorevert = donewrec = y_err;
34 doend = y_rev;
35 if(pars_f(fmtbuf)<0)
36 err(a->cierr,100,"startwrt");
37 fmt_bg();
38 return(0);
39}
40e_rdfe()
41{
42 en_fio();
43 return(0);
44}
45e_wdfe()
46{
47 en_fio();
48 return(0);
49}
50c_dfe(a,flag) cilist *a;
51{
52 sequential=0;
53 formatted=external=1;
54 elist=a;
55 cursor=scale=recpos=0;
56 if(a->ciunit>MXUNIT || a->ciunit<0)
57 err(a->cierr,101,"startchk");
58 curunit = &units[a->ciunit];
59 if(curunit->ufd==NULL && fk_open(flag,DIR,FMT,a->ciunit))
60 err(a->cierr,104,"dfe");
61 cf=curunit->ufd;
62 if(!curunit->ufmt) err(a->cierr,102,"dfe")
63 if(!curunit->useek) err(a->cierr,104,"dfe")
64 fmtbuf=a->cifmt;
65 fseek(cf,(long)curunit->url * (a->cirec-1),0);
66 curunit->uend = 0;
67 return(0);
68}
69y_getc()
70{
71 int ch;
72 if(curunit->uend) return(-1);
73 if((ch=getc(cf))!=EOF)
74 {
75 recpos++;
76 if(curunit->url>=recpos ||
77 curunit->url==1)
78 return(ch);
79 else return(' ');
80 }
81 if(feof(cf))
82 {
83 curunit->uend=1;
84 errno=0;
85 return(-1);
86 }
87 err(elist->cierr,errno,"readingd");
88}
89y_putc(c)
90{
91 recpos++;
92 if(recpos <= curunit->url || curunit->url==1)
93 putc(c,cf);
94 else
95 err(elist->cierr,110,"dout");
96 return(0);
97}
98y_rev()
99{ /*what about work done?*/
100 if(curunit->url==1 || recpos==curunit->url)
101 return(0);
102 while(recpos<curunit->url)
103 (*putn)(' ');
104 recpos=0;
105 return(0);
106}
107y_err()
108{
109 err(elist->cierr, 110, "dfe");
110}