xref: /csrg-svn/usr.bin/f77/libI77/rdfmt.c (revision 2499)
1*2499Sdlw /*
2*2499Sdlw char id_rdfmt[] = "@(#)rdfmt.c	1.1";
3*2499Sdlw  *
4*2499Sdlw  * formatted read routines
5*2499Sdlw  */
6*2499Sdlw 
7*2499Sdlw #include "fio.h"
8*2499Sdlw #include "fmt.h"
9*2499Sdlw 
10*2499Sdlw #define isdigit(c)	(c>='0' && c<='9')
11*2499Sdlw #define isalpha(c)	(c>='a' && c<='z')
12*2499Sdlw 
13*2499Sdlw rd_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len;
14*2499Sdlw {	int n;
15*2499Sdlw 	if(cursor && (n=rd_mvcur())) return(n);
16*2499Sdlw 	switch(p->op)
17*2499Sdlw 	{
18*2499Sdlw 	case I:
19*2499Sdlw 	case IM:
20*2499Sdlw 		n = (rd_I(ptr,p->p1,len));
21*2499Sdlw 		break;
22*2499Sdlw 	case L:
23*2499Sdlw 		n = (rd_L(ptr,p->p1));
24*2499Sdlw 		break;
25*2499Sdlw 	case A:
26*2499Sdlw 		p->p1 = len;	/* cheap trick */
27*2499Sdlw 	case AW:
28*2499Sdlw 		n = (rd_AW(ptr,p->p1,len));
29*2499Sdlw 		break;
30*2499Sdlw 	case E:
31*2499Sdlw 	case EE:
32*2499Sdlw 	case D:
33*2499Sdlw 	case DE:
34*2499Sdlw 	case G:
35*2499Sdlw 	case GE:
36*2499Sdlw 	case F:
37*2499Sdlw 		n = (rd_F(ptr,p->p1,p->p2,len));
38*2499Sdlw 		break;
39*2499Sdlw 	default:
40*2499Sdlw 		return(errno=100);
41*2499Sdlw 	}
42*2499Sdlw 	if (n < 0)
43*2499Sdlw 	{
44*2499Sdlw 		if(feof(cf)) return(EOF);
45*2499Sdlw 		n = errno;
46*2499Sdlw 		clearerr(cf);
47*2499Sdlw 	}
48*2499Sdlw 	return(n);
49*2499Sdlw }
50*2499Sdlw 
51*2499Sdlw rd_ned(p,ptr) char *ptr; struct syl *p;
52*2499Sdlw {
53*2499Sdlw 	switch(p->op)
54*2499Sdlw 	{
55*2499Sdlw /*	case APOS:
56*2499Sdlw /*		return(rd_POS(p->p1));
57*2499Sdlw /*	case H:
58*2499Sdlw /*		return(rd_H(p->p1,p->p2));	*/
59*2499Sdlw 	case SLASH:
60*2499Sdlw 		return((*donewrec)());
61*2499Sdlw 	case TR:
62*2499Sdlw 	case X:
63*2499Sdlw 		cursor += p->p1;
64*2499Sdlw 		tab = (p->op==TR);
65*2499Sdlw 		return(OK);
66*2499Sdlw 	case T:
67*2499Sdlw 		if(p->p1) cursor = p->p1 - recpos - 1;
68*2499Sdlw #ifndef KOSHER
69*2499Sdlw 		else cursor = 8*p->p2 - recpos%8;	/* NOT STANDARD FORT */
70*2499Sdlw #endif
71*2499Sdlw 		tab = YES;
72*2499Sdlw 		return(OK);
73*2499Sdlw 	case TL:
74*2499Sdlw 		cursor -= p->p1;
75*2499Sdlw 		tab = YES;
76*2499Sdlw 		return(OK);
77*2499Sdlw 	default:
78*2499Sdlw 		return(errno=100);
79*2499Sdlw 	}
80*2499Sdlw }
81*2499Sdlw 
82*2499Sdlw rd_mvcur()
83*2499Sdlw {	int n;
84*2499Sdlw 	if(tab) return((*dotab)());
85*2499Sdlw 	while(cursor--) if((n=(*getn)()) < 0) return(n);
86*2499Sdlw 	return(cursor=0);
87*2499Sdlw }
88*2499Sdlw 
89*2499Sdlw rd_I(n,w,len) ftnlen len; uint *n;
90*2499Sdlw {	long x=0;
91*2499Sdlw 	int i,sign=0,ch,c;
92*2499Sdlw 	for(i=0;i<w;i++)
93*2499Sdlw 	{
94*2499Sdlw 		if((ch=(*getn)())<0) return(ch);
95*2499Sdlw 		switch(ch=lcase(ch))
96*2499Sdlw 		{
97*2499Sdlw 		case ',': goto done;
98*2499Sdlw 		case '+': break;
99*2499Sdlw 		case '-':
100*2499Sdlw 			sign=1;
101*2499Sdlw 			break;
102*2499Sdlw 		case ' ':
103*2499Sdlw 			if(cblank) x *= radix;
104*2499Sdlw 			break;
105*2499Sdlw 		case '\n':  goto done;
106*2499Sdlw 		default:
107*2499Sdlw 			if(isdigit(ch))
108*2499Sdlw 			{	if ((c=(ch-'0')) < radix)
109*2499Sdlw 				{	x = (x * radix) + c;
110*2499Sdlw 					break;
111*2499Sdlw 				}
112*2499Sdlw 			}
113*2499Sdlw 			else if(isalpha(ch))
114*2499Sdlw 			{	if ((c=(ch-'a'+10)) < radix)
115*2499Sdlw 				{	x = (x * radix) + c;
116*2499Sdlw 					break;
117*2499Sdlw 				}
118*2499Sdlw 			}
119*2499Sdlw 			return(errno=115);
120*2499Sdlw 		}
121*2499Sdlw 	}
122*2499Sdlw done:
123*2499Sdlw 	if(sign) x = -x;
124*2499Sdlw 	if(len==sizeof(short)) n->is=x;
125*2499Sdlw 	else n->il=x;
126*2499Sdlw 	return(OK);
127*2499Sdlw }
128*2499Sdlw 
129*2499Sdlw rd_L(n,w) ftnint *n;
130*2499Sdlw {	int ch,i,v = -1;
131*2499Sdlw 	for(i=0;i<w;i++)
132*2499Sdlw 	{	if((ch=(*getn)()) < 0) return(ch);
133*2499Sdlw 		if((ch=lcase(ch))=='t' && v==-1) v=1;
134*2499Sdlw 		else if(ch=='f' && v==-1) v=0;
135*2499Sdlw 		else if(ch==',') break;
136*2499Sdlw 	}
137*2499Sdlw 	if(v==-1) return(errno=116);
138*2499Sdlw 	*n=v;
139*2499Sdlw 	return(OK);
140*2499Sdlw }
141*2499Sdlw 
142*2499Sdlw rd_F(p,w,d,len) ftnlen len; ufloat *p;
143*2499Sdlw {	double x,y;
144*2499Sdlw 	int i,sx,sz,ch,dot,ny,z,sawz;
145*2499Sdlw 	x=y=0;
146*2499Sdlw 	sawz=z=ny=dot=sx=sz=0;
147*2499Sdlw 	for(i=0;i<w;)
148*2499Sdlw 	{	i++;
149*2499Sdlw 		if((ch=(*getn)())<0) return(ch);
150*2499Sdlw 		ch=lcase(ch);
151*2499Sdlw 		if(ch==' ' && !cblank || ch=='+') continue;
152*2499Sdlw 		else if(ch=='-') sx=1;
153*2499Sdlw 		else if(ch<='9' && ch>='0')
154*2499Sdlw 			x=10*x+ch-'0';
155*2499Sdlw 		else if(ch=='e' || ch=='d' || ch=='.')
156*2499Sdlw 			break;
157*2499Sdlw 		else if(cblank && ch==' ') x*=10;
158*2499Sdlw 		else if(ch==',')
159*2499Sdlw 		{	i=w;
160*2499Sdlw 			break;
161*2499Sdlw 		}
162*2499Sdlw 		else if(ch!='\n') return(errno=115);
163*2499Sdlw 	}
164*2499Sdlw 	if(ch=='.') dot=1;
165*2499Sdlw 	while(i<w && ch!='e' && ch!='d' && ch!='+' && ch!='-')
166*2499Sdlw 	{	i++;
167*2499Sdlw 		if((ch=(*getn)())<0) return(ch);
168*2499Sdlw 		ch = lcase(ch);
169*2499Sdlw 		if(ch<='9' && ch>='0')
170*2499Sdlw 			y=10*y+ch-'0';
171*2499Sdlw 		else if(cblank && ch==' ')
172*2499Sdlw 			y *= 10;
173*2499Sdlw 		else if(ch==',') {i=w; break;}
174*2499Sdlw 		else if(ch==' ') continue;
175*2499Sdlw 		else continue;
176*2499Sdlw 		ny++;
177*2499Sdlw 	}
178*2499Sdlw 	if(ch=='-') sz=1;
179*2499Sdlw 	while(i<w)
180*2499Sdlw 	{	i++;
181*2499Sdlw 		sawz=1;
182*2499Sdlw 		if((ch=(*getn)())<0) return(ch);
183*2499Sdlw 		ch = lcase(ch);
184*2499Sdlw 		if(ch=='-') sz=1;
185*2499Sdlw 		else if(ch<='9' && ch>='0')
186*2499Sdlw 			z=10*z+ch-'0';
187*2499Sdlw 		else if(cblank && ch==' ')
188*2499Sdlw 			z *= 10;
189*2499Sdlw 		else if(ch==',') break;
190*2499Sdlw 		else if(ch==' ') continue;
191*2499Sdlw 		else if(ch=='+') continue;
192*2499Sdlw 		else if(ch!='\n') return(errno=115);
193*2499Sdlw 	}
194*2499Sdlw 	if(!dot)
195*2499Sdlw 		for(i=0;i<d;i++) x /= 10;
196*2499Sdlw 	for(i=0;i<ny;i++) y /= 10;
197*2499Sdlw 	x=x+y;
198*2499Sdlw 	if(sz)
199*2499Sdlw 		for(i=0;i<z;i++) x /=10;
200*2499Sdlw 	else	for(i=0;i<z;i++) x *= 10;
201*2499Sdlw 	if(sx) x = -x;
202*2499Sdlw 	if(!sawz)
203*2499Sdlw 	{
204*2499Sdlw 		for(i=scale;i>0;i--) x /= 10;
205*2499Sdlw 		for(i=scale;i<0;i++) x *= 10;
206*2499Sdlw 	}
207*2499Sdlw 	if(len==sizeof(float)) p->pf=x;
208*2499Sdlw 	else p->pd=x;
209*2499Sdlw 	return(OK);
210*2499Sdlw }
211*2499Sdlw 
212*2499Sdlw rd_AW(p,w,len) char *p; ftnlen len;
213*2499Sdlw {	int i,ch;
214*2499Sdlw 	if(w >= len)
215*2499Sdlw 	{
216*2499Sdlw 		for(i=0;i<w-len;i++) GET(ch);
217*2499Sdlw 		for(i=0;i<len;i++)
218*2499Sdlw 		{	GET(ch);
219*2499Sdlw 			*p++=VAL(ch);
220*2499Sdlw 		}
221*2499Sdlw 	}
222*2499Sdlw 	else
223*2499Sdlw 	{
224*2499Sdlw 		for(i=0;i<w;i++)
225*2499Sdlw 		{	GET(ch);
226*2499Sdlw 			*p++=VAL(ch);
227*2499Sdlw 		}
228*2499Sdlw 		for(i=0;i<len-w;i++) *p++=' ';
229*2499Sdlw 	}
230*2499Sdlw 	return(OK);
231*2499Sdlw }
232*2499Sdlw 
233*2499Sdlw /* THIS IS NOT ALLOWED IN THE NEW STANDARD 'CAUSE IT'S WEIRD */
234*2499Sdlw /*rd_H(n,s) char *s;
235*2499Sdlw /*{	int i,ch;
236*2499Sdlw /*	for(i=0;i<n;i++)
237*2499Sdlw /*		if((ch=(*getn)())<0) return(ch);
238*2499Sdlw /*		else if(ch=='\n') for(;i<n;i++) *s++ = ' ';
239*2499Sdlw /*		else *s++ = ch;
240*2499Sdlw /*	return(OK);
241*2499Sdlw /*}
242*2499Sdlw */
243*2499Sdlw /*rd_POS(s) char *s;
244*2499Sdlw /*{	char quote;
245*2499Sdlw /*	int ch;
246*2499Sdlw /*	quote= *s++;
247*2499Sdlw /*	for(;*s;s++)
248*2499Sdlw /*		if(*s==quote && *(s+1)!=quote) break;
249*2499Sdlw /*		else if((ch=(*getn)())<0) return(ch);
250*2499Sdlw /*		else *s = ch=='\n'?' ':ch;
251*2499Sdlw /*	return(OK);
252*2499Sdlw /*}
253*2499Sdlw */
254