xref: /csrg-svn/usr.bin/f77/libI77/rdfmt.c (revision 2598)
12499Sdlw /*
2*2598Sdlw char id_rdfmt[] = "@(#)rdfmt.c	1.2";
32499Sdlw  *
42499Sdlw  * formatted read routines
52499Sdlw  */
62499Sdlw 
72499Sdlw #include "fio.h"
8*2598Sdlw #include "format.h"
92499Sdlw 
102499Sdlw #define isdigit(c)	(c>='0' && c<='9')
112499Sdlw #define isalpha(c)	(c>='a' && c<='z')
122499Sdlw 
132499Sdlw rd_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len;
142499Sdlw {	int n;
152499Sdlw 	if(cursor && (n=rd_mvcur())) return(n);
162499Sdlw 	switch(p->op)
172499Sdlw 	{
182499Sdlw 	case I:
192499Sdlw 	case IM:
202499Sdlw 		n = (rd_I(ptr,p->p1,len));
212499Sdlw 		break;
222499Sdlw 	case L:
232499Sdlw 		n = (rd_L(ptr,p->p1));
242499Sdlw 		break;
252499Sdlw 	case A:
262499Sdlw 		p->p1 = len;	/* cheap trick */
272499Sdlw 	case AW:
282499Sdlw 		n = (rd_AW(ptr,p->p1,len));
292499Sdlw 		break;
302499Sdlw 	case E:
312499Sdlw 	case EE:
322499Sdlw 	case D:
332499Sdlw 	case DE:
342499Sdlw 	case G:
352499Sdlw 	case GE:
362499Sdlw 	case F:
372499Sdlw 		n = (rd_F(ptr,p->p1,p->p2,len));
382499Sdlw 		break;
392499Sdlw 	default:
40*2598Sdlw 		return(errno=F_ERFMT);
412499Sdlw 	}
422499Sdlw 	if (n < 0)
432499Sdlw 	{
442499Sdlw 		if(feof(cf)) return(EOF);
452499Sdlw 		n = errno;
462499Sdlw 		clearerr(cf);
472499Sdlw 	}
482499Sdlw 	return(n);
492499Sdlw }
502499Sdlw 
512499Sdlw rd_ned(p,ptr) char *ptr; struct syl *p;
522499Sdlw {
532499Sdlw 	switch(p->op)
542499Sdlw 	{
552499Sdlw /*	case APOS:
562499Sdlw /*		return(rd_POS(p->p1));
572499Sdlw /*	case H:
582499Sdlw /*		return(rd_H(p->p1,p->p2));	*/
592499Sdlw 	case SLASH:
602499Sdlw 		return((*donewrec)());
612499Sdlw 	case TR:
622499Sdlw 	case X:
632499Sdlw 		cursor += p->p1;
642499Sdlw 		tab = (p->op==TR);
652499Sdlw 		return(OK);
662499Sdlw 	case T:
672499Sdlw 		if(p->p1) cursor = p->p1 - recpos - 1;
682499Sdlw #ifndef KOSHER
692499Sdlw 		else cursor = 8*p->p2 - recpos%8;	/* NOT STANDARD FORT */
702499Sdlw #endif
712499Sdlw 		tab = YES;
722499Sdlw 		return(OK);
732499Sdlw 	case TL:
742499Sdlw 		cursor -= p->p1;
752499Sdlw 		tab = YES;
762499Sdlw 		return(OK);
772499Sdlw 	default:
78*2598Sdlw 		return(errno=F_ERFMT);
792499Sdlw 	}
802499Sdlw }
812499Sdlw 
822499Sdlw rd_mvcur()
832499Sdlw {	int n;
842499Sdlw 	if(tab) return((*dotab)());
852499Sdlw 	while(cursor--) if((n=(*getn)()) < 0) return(n);
862499Sdlw 	return(cursor=0);
872499Sdlw }
882499Sdlw 
892499Sdlw rd_I(n,w,len) ftnlen len; uint *n;
902499Sdlw {	long x=0;
912499Sdlw 	int i,sign=0,ch,c;
922499Sdlw 	for(i=0;i<w;i++)
932499Sdlw 	{
942499Sdlw 		if((ch=(*getn)())<0) return(ch);
952499Sdlw 		switch(ch=lcase(ch))
962499Sdlw 		{
972499Sdlw 		case ',': goto done;
982499Sdlw 		case '+': break;
992499Sdlw 		case '-':
1002499Sdlw 			sign=1;
1012499Sdlw 			break;
1022499Sdlw 		case ' ':
1032499Sdlw 			if(cblank) x *= radix;
1042499Sdlw 			break;
1052499Sdlw 		case '\n':  goto done;
1062499Sdlw 		default:
1072499Sdlw 			if(isdigit(ch))
1082499Sdlw 			{	if ((c=(ch-'0')) < radix)
1092499Sdlw 				{	x = (x * radix) + c;
1102499Sdlw 					break;
1112499Sdlw 				}
1122499Sdlw 			}
1132499Sdlw 			else if(isalpha(ch))
1142499Sdlw 			{	if ((c=(ch-'a'+10)) < radix)
1152499Sdlw 				{	x = (x * radix) + c;
1162499Sdlw 					break;
1172499Sdlw 				}
1182499Sdlw 			}
119*2598Sdlw 			return(errno=F_ERRDCHR);
1202499Sdlw 		}
1212499Sdlw 	}
1222499Sdlw done:
1232499Sdlw 	if(sign) x = -x;
1242499Sdlw 	if(len==sizeof(short)) n->is=x;
1252499Sdlw 	else n->il=x;
1262499Sdlw 	return(OK);
1272499Sdlw }
1282499Sdlw 
1292499Sdlw rd_L(n,w) ftnint *n;
1302499Sdlw {	int ch,i,v = -1;
1312499Sdlw 	for(i=0;i<w;i++)
1322499Sdlw 	{	if((ch=(*getn)()) < 0) return(ch);
1332499Sdlw 		if((ch=lcase(ch))=='t' && v==-1) v=1;
1342499Sdlw 		else if(ch=='f' && v==-1) v=0;
1352499Sdlw 		else if(ch==',') break;
1362499Sdlw 	}
137*2598Sdlw 	if(v==-1) return(errno=F_ERLOGIF);
1382499Sdlw 	*n=v;
1392499Sdlw 	return(OK);
1402499Sdlw }
1412499Sdlw 
1422499Sdlw rd_F(p,w,d,len) ftnlen len; ufloat *p;
1432499Sdlw {	double x,y;
1442499Sdlw 	int i,sx,sz,ch,dot,ny,z,sawz;
1452499Sdlw 	x=y=0;
1462499Sdlw 	sawz=z=ny=dot=sx=sz=0;
1472499Sdlw 	for(i=0;i<w;)
1482499Sdlw 	{	i++;
1492499Sdlw 		if((ch=(*getn)())<0) return(ch);
1502499Sdlw 		ch=lcase(ch);
1512499Sdlw 		if(ch==' ' && !cblank || ch=='+') continue;
1522499Sdlw 		else if(ch=='-') sx=1;
1532499Sdlw 		else if(ch<='9' && ch>='0')
1542499Sdlw 			x=10*x+ch-'0';
1552499Sdlw 		else if(ch=='e' || ch=='d' || ch=='.')
1562499Sdlw 			break;
1572499Sdlw 		else if(cblank && ch==' ') x*=10;
1582499Sdlw 		else if(ch==',')
1592499Sdlw 		{	i=w;
1602499Sdlw 			break;
1612499Sdlw 		}
162*2598Sdlw 		else if(ch!='\n') return(errno=F_ERRDCHR);
1632499Sdlw 	}
1642499Sdlw 	if(ch=='.') dot=1;
1652499Sdlw 	while(i<w && ch!='e' && ch!='d' && ch!='+' && ch!='-')
1662499Sdlw 	{	i++;
1672499Sdlw 		if((ch=(*getn)())<0) return(ch);
1682499Sdlw 		ch = lcase(ch);
1692499Sdlw 		if(ch<='9' && ch>='0')
1702499Sdlw 			y=10*y+ch-'0';
1712499Sdlw 		else if(cblank && ch==' ')
1722499Sdlw 			y *= 10;
1732499Sdlw 		else if(ch==',') {i=w; break;}
1742499Sdlw 		else if(ch==' ') continue;
1752499Sdlw 		else continue;
1762499Sdlw 		ny++;
1772499Sdlw 	}
1782499Sdlw 	if(ch=='-') sz=1;
1792499Sdlw 	while(i<w)
1802499Sdlw 	{	i++;
1812499Sdlw 		sawz=1;
1822499Sdlw 		if((ch=(*getn)())<0) return(ch);
1832499Sdlw 		ch = lcase(ch);
1842499Sdlw 		if(ch=='-') sz=1;
1852499Sdlw 		else if(ch<='9' && ch>='0')
1862499Sdlw 			z=10*z+ch-'0';
1872499Sdlw 		else if(cblank && ch==' ')
1882499Sdlw 			z *= 10;
1892499Sdlw 		else if(ch==',') break;
1902499Sdlw 		else if(ch==' ') continue;
1912499Sdlw 		else if(ch=='+') continue;
192*2598Sdlw 		else if(ch!='\n') return(errno=F_ERRDCHR);
1932499Sdlw 	}
1942499Sdlw 	if(!dot)
1952499Sdlw 		for(i=0;i<d;i++) x /= 10;
1962499Sdlw 	for(i=0;i<ny;i++) y /= 10;
1972499Sdlw 	x=x+y;
1982499Sdlw 	if(sz)
1992499Sdlw 		for(i=0;i<z;i++) x /=10;
2002499Sdlw 	else	for(i=0;i<z;i++) x *= 10;
2012499Sdlw 	if(sx) x = -x;
2022499Sdlw 	if(!sawz)
2032499Sdlw 	{
2042499Sdlw 		for(i=scale;i>0;i--) x /= 10;
2052499Sdlw 		for(i=scale;i<0;i++) x *= 10;
2062499Sdlw 	}
2072499Sdlw 	if(len==sizeof(float)) p->pf=x;
2082499Sdlw 	else p->pd=x;
2092499Sdlw 	return(OK);
2102499Sdlw }
2112499Sdlw 
2122499Sdlw rd_AW(p,w,len) char *p; ftnlen len;
2132499Sdlw {	int i,ch;
2142499Sdlw 	if(w >= len)
2152499Sdlw 	{
2162499Sdlw 		for(i=0;i<w-len;i++) GET(ch);
2172499Sdlw 		for(i=0;i<len;i++)
2182499Sdlw 		{	GET(ch);
2192499Sdlw 			*p++=VAL(ch);
2202499Sdlw 		}
2212499Sdlw 	}
2222499Sdlw 	else
2232499Sdlw 	{
2242499Sdlw 		for(i=0;i<w;i++)
2252499Sdlw 		{	GET(ch);
2262499Sdlw 			*p++=VAL(ch);
2272499Sdlw 		}
2282499Sdlw 		for(i=0;i<len-w;i++) *p++=' ';
2292499Sdlw 	}
2302499Sdlw 	return(OK);
2312499Sdlw }
2322499Sdlw 
2332499Sdlw /* THIS IS NOT ALLOWED IN THE NEW STANDARD 'CAUSE IT'S WEIRD */
2342499Sdlw /*rd_H(n,s) char *s;
2352499Sdlw /*{	int i,ch;
2362499Sdlw /*	for(i=0;i<n;i++)
2372499Sdlw /*		if((ch=(*getn)())<0) return(ch);
2382499Sdlw /*		else if(ch=='\n') for(;i<n;i++) *s++ = ' ';
2392499Sdlw /*		else *s++ = ch;
2402499Sdlw /*	return(OK);
2412499Sdlw /*}
2422499Sdlw */
2432499Sdlw /*rd_POS(s) char *s;
2442499Sdlw /*{	char quote;
2452499Sdlw /*	int ch;
2462499Sdlw /*	quote= *s++;
2472499Sdlw /*	for(;*s;s++)
2482499Sdlw /*		if(*s==quote && *(s+1)!=quote) break;
2492499Sdlw /*		else if((ch=(*getn)())<0) return(ch);
2502499Sdlw /*		else *s = ch=='\n'?' ':ch;
2512499Sdlw /*	return(OK);
2522499Sdlw /*}
2532499Sdlw */
254