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