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