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