|
|
1.1 root 1: /*
2: * sequential formatted external routines
3: */
4:
5: #include "fio.h"
6:
7: /*
8: * read sequential formatted external
9: */
10:
11: extern int rd_ed(),rd_ned();
12: int x_rnew(),x_getc(),x_tab();
13:
14: s_rsfe(a) cilist *a; /* start */
15: { int n;
16: reading = YES;
17: if(n=c_sfe(a,READ)) return(n);
18: if(curunit->uwrt) nowreading(curunit);
19: getn= x_getc;
20: doed= rd_ed;
21: doned= rd_ned;
22: donewrec = dorevert = doend = x_rnew;
23: dotab = x_tab;
24: if(pars_f(fmtbuf)) err(errflag,100,"read sfe")
25: fmt_bg();
26: return(OK);
27: }
28:
29: x_rnew() /* find next record */
30: { int ch;
31: if(!curunit->uend)
32: while((ch=getc(cf))!='\n' && ch!=EOF);
33: cursor=recpos=reclen=0;
34: return(OK);
35: }
36:
37: x_getc()
38: { int ch;
39: if(curunit->uend) return(EOF);
40: if((ch=getc(cf))!=EOF && ch!='\n')
41: { recpos++;
42: return(ch);
43: }
44: if(ch=='\n')
45: { ungetc(ch,cf);
46: return(ch);
47: }
48: if(feof(cf)) curunit->uend = YES;
49: return(EOF);
50: }
51:
52: e_rsfe()
53: { int n;
54: n=en_fio();
55: fmtbuf=NULL;
56: return(n);
57: }
58:
59: c_sfe(a,flag) cilist *a; /* check */
60: { unit *p;
61: int n;
62: external=sequential=formatted=FORMATTED;
63: fmtbuf=a->cifmt;
64: lfname = NULL;
65: elist = NO;
66: errflag = a->cierr;
67: endflag = a->ciend;
68: lunit = a->ciunit;
69: if(not_legal(lunit)) err(errflag,101,"sfe");
70: curunit = p = &units[lunit];
71: if(!p->ufd && (n=fk_open(flag,SEQ,FMT,lunit)) ) err(errflag,n,"sfe")
72: cf = curunit->ufd;
73: elist = YES;
74: lfname = curunit->ufnm;
75: if(!p->ufmt) err(errflag,102,"sfe")
76: if(p->url) err(errflag,105,"sfe")
77: cursor=recpos=scale=reclen=0;
78: radix = 10;
79: signit = YES;
80: cblank = curunit->ublnk;
81: cplus = NO;
82: return(OK);
83: }
84:
85: /*
86: * write sequential formatted external
87: */
88:
89: extern int w_ed(),w_ned();
90: int x_putc(),pr_put(),x_wend(),x_wnew();
91: ioflag new;
92:
93: s_wsfe(a) cilist *a; /*start*/
94: { int n;
95: reading = NO;
96: if(n=c_sfe(a,WRITE)) return(n);
97: if(!curunit->uwrt) nowwriting(curunit);
98: curunit->uend = NO;
99: if (curunit->uprnt) putn = pr_put;
100: else putn = x_putc;
101: new = YES;
102: doed= w_ed;
103: doned= w_ned;
104: doend = x_wend;
105: dorevert = donewrec = x_wnew;
106: dotab = x_tab;
107: if(pars_f(fmtbuf)) err(errflag,100,"write sfe")
108: fmt_bg();
109: return(OK);
110: }
111:
112: x_putc(c)
113: {
114: if(c=='\n') recpos = reclen = cursor = 0;
115: else recpos++;
116: putc(c,cf);
117: return(OK);
118: }
119:
120: pr_put(c)
121: {
122: if(c=='\n')
123: { new = YES;
124: recpos = reclen = cursor = 0;
125: }
126: else if(new)
127: { new = NO;
128: if(c=='0') c = '\n';
129: else if(c=='1') c = '\f';
130: else return(OK);
131: }
132: else recpos++;
133: putc(c,cf);
134: return(OK);
135: }
136:
137: x_tab()
138: { int n;
139: if(reclen < recpos) reclen = recpos;
140: if(curunit->useek)
141: { if((recpos+cursor) < 0) return(107);
142: n = reclen - recpos; /* distance to eor, n>=0 */
143: if((cursor-n) > 0)
144: { fseek(cf,(long)n,1); /* find current eor */
145: recpos = reclen;
146: cursor -= n;
147: }
148: else
149: { fseek(cf,(long)cursor,1); /* do not pass go */
150: recpos += cursor;
151: return(cursor=0);
152: }
153: }
154: else
155: if(cursor < 0) return(120); /* cant go back */
156: while(cursor--)
157: { if(reading)
158: { n = (*getn)();
159: if(n=='\n')
160: { (*ungetn)(n,cf);
161: return(110);
162: }
163: if(n==EOF) return(EOF);
164: }
165: else (*putn)(' '); /* fill in the empty record */
166: }
167: return(cursor=0);
168: }
169:
170: x_wnew()
171: {
172: if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1);
173: return((*putn)('\n'));
174: }
175:
176: x_wend(last) char last;
177: {
178: if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1);
179: return((*putn)(last));
180: }
181:
182: /*
183: /*xw_rev()
184: /*{
185: /* if(workdone) x_wSL();
186: /* return(workdone=0);
187: /*}
188: /*
189: */
190: e_wsfe()
191: { return(e_rsfe()); }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.