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