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