|
|
1.1 root 1: /*
2: * internal (character array) i/o
3: */
4:
5: #include "fio.h"
6: #include "lio.h"
7:
8: extern int rd_ed(),rd_ned(),w_ed(),w_ned();
9: extern int l_read(),l_write();
10: int z_wnew(),z_rnew(),z_tab();
11:
12: z_getc()
13: {
14: if(icptr >= icend && !recpos) /* new rec beyond eof */
15: { leof = EOF;
16: return(EOF);
17: }
18: if(recpos++ < svic->icirlen) return(*icptr++);
19: return(' ');
20: }
21:
22: z_putc(c) char c;
23: {
24: if(icptr < icend)
25: { if(c=='\n') return(z_wnew());
26: if(recpos++ < svic->icirlen)
27: { *icptr++ = c;
28: return(OK);
29: }
30: else err(errflag,110,"iio")
31: }
32: leof = EOF;
33: #ifndef KOSHER
34: err(endflag,EOF,"iio") /* NOT STANDARD, end-of-file on writes */
35: #endif
36: #ifdef KOSHER
37: err(errflag,110,"iio")
38: #endif
39: }
40:
41: z_ungetc(ch,cf) char ch;
42: { if(ch==EOF || --recpos >= svic->icirlen) return(OK);
43: if(--icptr < svic->iciunit || recpos < 0) err(errflag,107,"ilio")
44: *icptr = ch;
45: return(OK);
46: }
47:
48: s_rsfi(a) icilist *a;
49: {
50: reading = YES;
51: doed=rd_ed;
52: doned=rd_ned;
53: getn=z_getc;
54: doend = donewrec = z_rnew;
55: dorevert = z_rnew;
56: dotab = z_tab;
57: return(c_si(a));
58: }
59:
60: s_wsfi(a) icilist *a;
61: {
62: reading = NO;
63: doed=w_ed;
64: doned=w_ned;
65: putn=z_putc;
66: doend = donewrec = z_wnew;
67: dorevert = z_wnew;
68: dotab = z_tab;
69: return(c_si(a));
70: }
71:
72: s_rdfi(a) icilist *a;
73: {
74: reading = YES;
75: doed = rd_ed;
76: doned = rd_ned;
77: getn = z_getc;
78: donewrec = z_rnew;
79: dorevert = doend = z_rnew;
80: dotab = z_tab;
81: return(c_di(a));
82: }
83:
84: s_wdfi(a) icilist *a;
85: {
86: reading = NO;
87: doed = w_ed;
88: doned = w_ned;
89: putn = z_putc;
90: donewrec = z_wnew;
91: dorevert = doend = z_wnew;
92: dotab = z_tab;
93: return(c_di(a));
94: }
95:
96: c_fi(a) icilist *a;
97: {
98: fmtbuf=a->icifmt;
99: formatted = FORMATTED;
100: external = NO;
101: cblank=cplus=NO;
102: scale=cursor=0;
103: radix = 10;
104: signit = YES;
105: elist = YES;
106: svic = a;
107: recpos=reclen=0;
108: icend = a->iciunit + a->icirnum*a->icirlen;
109: errflag = a->icierr;
110: endflag = a->iciend;
111: if(pars_f(fmtbuf)) err(errflag,100,"ifio")
112: fmt_bg();
113: return(OK);
114: }
115:
116: c_si(a) icilist *a;
117: {
118: sequential = YES;
119: recnum = 0;
120: icptr = a->iciunit;
121: return(c_fi(a));
122: }
123:
124: c_di(a) icilist *a;
125: {
126: sequential = NO;
127: recnum = a->icirec - 1;
128: icptr = a->iciunit + recnum*a->icirlen;
129: return(c_fi(a));
130: }
131:
132: z_rnew()
133: {
134: icptr = svic->iciunit + (++recnum)*svic->icirlen;
135: recpos = reclen = cursor = 0;
136: return(OK);
137: }
138:
139: z_wnew()
140: {
141: if(reclen > recpos)
142: { icptr += (reclen - recpos);
143: recpos = reclen;
144: }
145: while(recpos < svic->icirlen) (*putn)(' ');
146: recpos = reclen = cursor = 0;
147: recnum++;
148: return(OK);
149: }
150:
151: z_tab()
152: { int n;
153: if(reclen < recpos) reclen = recpos;
154: if((recpos + cursor) < 0) return(107);
155: n = reclen - recpos;
156: if(!reading && (cursor-n) > 0)
157: { icptr += n;
158: recpos = reclen;
159: cursor -= n;
160: while(cursor--) if(n=(*putn)(' ')) return(n);
161: }
162: else
163: { icptr += cursor;
164: recpos += cursor;
165: }
166: return(cursor=0);
167: }
168:
169: e_rsfi()
170: { int n;
171: n = en_fio();
172: fmtbuf = NULL;
173: return(n);
174: }
175:
176: e_wsfi()
177: {
178: return(e_rsfi());
179: }
180:
181: e_rdfi()
182: {
183: return(e_rsfi());
184: }
185:
186: e_wdfi()
187: {
188: return(e_wsfi());
189: }
190:
191: c_li(a) icilist *a;
192: {
193: fmtbuf="int list io";
194: sequential = formatted = LISTDIRECTED;
195: external = NO;
196: elist = YES;
197: svic = a;
198: recnum = recpos = 0;
199: cplus = cblank = NO;
200: icptr = a->iciunit;
201: icend = icptr + a->icirlen * a->icirnum;
202: errflag = a->icierr;
203: endflag = a->iciend;
204: leof = NO;
205: return(OK);
206: }
207:
208: s_rsli(a) icilist *a;
209: {
210: reading = YES;
211: lioproc = l_read;
212: getn = z_getc;
213: ungetn = z_ungetc;
214: l_first = YES;
215: lcount = 0;
216: lquit = NO;
217: return(c_li(a));
218: }
219:
220: s_wsli(a) icilist *a;
221: {
222: reading = NO;
223: putn = z_putc;
224: lioproc = l_write;
225: line_len = a->icirlen;
226: return(c_li(a));
227: }
228:
229: e_rsli()
230: { fmtbuf = NULL;
231: return(OK);
232: }
233:
234: e_wsli()
235: { fmtbuf = NULL;
236: reclen = recpos;
237: return(z_wnew());
238: }
239:
240: ftnint
241: iiorec_()
242: { return(recnum); }
243:
244: ftnint
245: iiopos_()
246: { return(recpos); }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.