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