xref: /csrg-svn/usr.bin/f77/libI77/rdfmt.c (revision 12370)
12499Sdlw /*
2*12370Sdlw char id_rdfmt[] = "@(#)rdfmt.c	1.4";
32499Sdlw  *
42499Sdlw  * formatted read routines
52499Sdlw  */
62499Sdlw 
72499Sdlw #include "fio.h"
82598Sdlw #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:
402598Sdlw 		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 	{
553632Sdlw #ifndef	KOSHER
563632Sdlw 	case APOS:					/* NOT STANDARD F77 */
573632Sdlw 		return(rd_POS((char *)p->p1));
583632Sdlw 	case H:						/* NOT STANDARD F77 */
593632Sdlw 		return(rd_H(p->p1,(char *)p->p2));
603632Sdlw #endif
612499Sdlw 	case SLASH:
622499Sdlw 		return((*donewrec)());
632499Sdlw 	case TR:
642499Sdlw 	case X:
652499Sdlw 		cursor += p->p1;
662499Sdlw 		tab = (p->op==TR);
672499Sdlw 		return(OK);
682499Sdlw 	case T:
692499Sdlw 		if(p->p1) cursor = p->p1 - recpos - 1;
702499Sdlw #ifndef KOSHER
712499Sdlw 		else cursor = 8*p->p2 - recpos%8;	/* NOT STANDARD FORT */
722499Sdlw #endif
732499Sdlw 		tab = YES;
742499Sdlw 		return(OK);
752499Sdlw 	case TL:
762499Sdlw 		cursor -= p->p1;
77*12370Sdlw 		if ((recpos + cursor) < 0) cursor = -recpos;	/* ANSI req'd */
782499Sdlw 		tab = YES;
792499Sdlw 		return(OK);
802499Sdlw 	default:
812598Sdlw 		return(errno=F_ERFMT);
822499Sdlw 	}
832499Sdlw }
842499Sdlw 
852499Sdlw rd_mvcur()
862499Sdlw {	int n;
872499Sdlw 	if(tab) return((*dotab)());
882499Sdlw 	while(cursor--) if((n=(*getn)()) < 0) return(n);
892499Sdlw 	return(cursor=0);
902499Sdlw }
912499Sdlw 
922499Sdlw rd_I(n,w,len) ftnlen len; uint *n;
932499Sdlw {	long x=0;
942499Sdlw 	int i,sign=0,ch,c;
952499Sdlw 	for(i=0;i<w;i++)
962499Sdlw 	{
972499Sdlw 		if((ch=(*getn)())<0) return(ch);
982499Sdlw 		switch(ch=lcase(ch))
992499Sdlw 		{
1002499Sdlw 		case ',': goto done;
1012499Sdlw 		case '+': break;
1022499Sdlw 		case '-':
1032499Sdlw 			sign=1;
1042499Sdlw 			break;
1052499Sdlw 		case ' ':
1062499Sdlw 			if(cblank) x *= radix;
1072499Sdlw 			break;
1082499Sdlw 		case '\n':  goto done;
1092499Sdlw 		default:
1102499Sdlw 			if(isdigit(ch))
1112499Sdlw 			{	if ((c=(ch-'0')) < radix)
1122499Sdlw 				{	x = (x * radix) + c;
1132499Sdlw 					break;
1142499Sdlw 				}
1152499Sdlw 			}
1162499Sdlw 			else if(isalpha(ch))
1172499Sdlw 			{	if ((c=(ch-'a'+10)) < radix)
1182499Sdlw 				{	x = (x * radix) + c;
1192499Sdlw 					break;
1202499Sdlw 				}
1212499Sdlw 			}
1222598Sdlw 			return(errno=F_ERRDCHR);
1232499Sdlw 		}
1242499Sdlw 	}
1252499Sdlw done:
1262499Sdlw 	if(sign) x = -x;
1272499Sdlw 	if(len==sizeof(short)) n->is=x;
1282499Sdlw 	else n->il=x;
1292499Sdlw 	return(OK);
1302499Sdlw }
1312499Sdlw 
1322499Sdlw rd_L(n,w) ftnint *n;
1332499Sdlw {	int ch,i,v = -1;
1342499Sdlw 	for(i=0;i<w;i++)
1352499Sdlw 	{	if((ch=(*getn)()) < 0) return(ch);
1362499Sdlw 		if((ch=lcase(ch))=='t' && v==-1) v=1;
1372499Sdlw 		else if(ch=='f' && v==-1) v=0;
1382499Sdlw 		else if(ch==',') break;
1392499Sdlw 	}
1402598Sdlw 	if(v==-1) return(errno=F_ERLOGIF);
1412499Sdlw 	*n=v;
1422499Sdlw 	return(OK);
1432499Sdlw }
1442499Sdlw 
1452499Sdlw rd_F(p,w,d,len) ftnlen len; ufloat *p;
1462499Sdlw {	double x,y;
1472499Sdlw 	int i,sx,sz,ch,dot,ny,z,sawz;
1482499Sdlw 	x=y=0;
1492499Sdlw 	sawz=z=ny=dot=sx=sz=0;
1502499Sdlw 	for(i=0;i<w;)
1512499Sdlw 	{	i++;
1522499Sdlw 		if((ch=(*getn)())<0) return(ch);
1532499Sdlw 		ch=lcase(ch);
1542499Sdlw 		if(ch==' ' && !cblank || ch=='+') continue;
1552499Sdlw 		else if(ch=='-') sx=1;
1562499Sdlw 		else if(ch<='9' && ch>='0')
1572499Sdlw 			x=10*x+ch-'0';
1582499Sdlw 		else if(ch=='e' || ch=='d' || ch=='.')
1592499Sdlw 			break;
1602499Sdlw 		else if(cblank && ch==' ') x*=10;
1612499Sdlw 		else if(ch==',')
1622499Sdlw 		{	i=w;
1632499Sdlw 			break;
1642499Sdlw 		}
1652598Sdlw 		else if(ch!='\n') return(errno=F_ERRDCHR);
1662499Sdlw 	}
1672499Sdlw 	if(ch=='.') dot=1;
1682499Sdlw 	while(i<w && ch!='e' && ch!='d' && ch!='+' && ch!='-')
1692499Sdlw 	{	i++;
1702499Sdlw 		if((ch=(*getn)())<0) return(ch);
1712499Sdlw 		ch = lcase(ch);
1722499Sdlw 		if(ch<='9' && ch>='0')
1732499Sdlw 			y=10*y+ch-'0';
1742499Sdlw 		else if(cblank && ch==' ')
1752499Sdlw 			y *= 10;
1762499Sdlw 		else if(ch==',') {i=w; break;}
1772499Sdlw 		else if(ch==' ') continue;
1782499Sdlw 		else continue;
1792499Sdlw 		ny++;
1802499Sdlw 	}
1812499Sdlw 	if(ch=='-') sz=1;
1822499Sdlw 	while(i<w)
1832499Sdlw 	{	i++;
1842499Sdlw 		sawz=1;
1852499Sdlw 		if((ch=(*getn)())<0) return(ch);
1862499Sdlw 		ch = lcase(ch);
1872499Sdlw 		if(ch=='-') sz=1;
1882499Sdlw 		else if(ch<='9' && ch>='0')
1892499Sdlw 			z=10*z+ch-'0';
1902499Sdlw 		else if(cblank && ch==' ')
1912499Sdlw 			z *= 10;
1922499Sdlw 		else if(ch==',') break;
1932499Sdlw 		else if(ch==' ') continue;
1942499Sdlw 		else if(ch=='+') continue;
1952598Sdlw 		else if(ch!='\n') return(errno=F_ERRDCHR);
1962499Sdlw 	}
1972499Sdlw 	if(!dot)
1982499Sdlw 		for(i=0;i<d;i++) x /= 10;
1992499Sdlw 	for(i=0;i<ny;i++) y /= 10;
2002499Sdlw 	x=x+y;
2012499Sdlw 	if(sz)
2022499Sdlw 		for(i=0;i<z;i++) x /=10;
2032499Sdlw 	else	for(i=0;i<z;i++) x *= 10;
2042499Sdlw 	if(sx) x = -x;
2052499Sdlw 	if(!sawz)
2062499Sdlw 	{
2072499Sdlw 		for(i=scale;i>0;i--) x /= 10;
2082499Sdlw 		for(i=scale;i<0;i++) x *= 10;
2092499Sdlw 	}
2102499Sdlw 	if(len==sizeof(float)) p->pf=x;
2112499Sdlw 	else p->pd=x;
2122499Sdlw 	return(OK);
2132499Sdlw }
2142499Sdlw 
2152499Sdlw rd_AW(p,w,len) char *p; ftnlen len;
2162499Sdlw {	int i,ch;
2172499Sdlw 	if(w >= len)
2182499Sdlw 	{
2192499Sdlw 		for(i=0;i<w-len;i++) GET(ch);
2202499Sdlw 		for(i=0;i<len;i++)
2212499Sdlw 		{	GET(ch);
2222499Sdlw 			*p++=VAL(ch);
2232499Sdlw 		}
2242499Sdlw 	}
2252499Sdlw 	else
2262499Sdlw 	{
2272499Sdlw 		for(i=0;i<w;i++)
2282499Sdlw 		{	GET(ch);
2292499Sdlw 			*p++=VAL(ch);
2302499Sdlw 		}
2312499Sdlw 		for(i=0;i<len-w;i++) *p++=' ';
2322499Sdlw 	}
2332499Sdlw 	return(OK);
2342499Sdlw }
2352499Sdlw 
2362499Sdlw /* THIS IS NOT ALLOWED IN THE NEW STANDARD 'CAUSE IT'S WEIRD */
2373632Sdlw rd_H(n,s) char *s;
2383632Sdlw {	int i,ch = 0;
2393632Sdlw 	for(i=0;i<n;i++)
2403632Sdlw 	{	if (ch != '\n')
2413632Sdlw 			GET(ch);
2423632Sdlw 		if (ch == '\n')
2433632Sdlw 			*s++ = ' ';
2443632Sdlw 		else
2453632Sdlw 			*s++ = ch;
2463632Sdlw 	}
2473632Sdlw 	return(OK);
2483632Sdlw }
2493632Sdlw 
2503632Sdlw rd_POS(s) char *s;
2513632Sdlw {	char quote;
2523632Sdlw 	int ch = 0;
2533632Sdlw 	quote = *s++;
2543632Sdlw 	while(*s)
2553632Sdlw 	{	if(*s==quote && *(s+1)!=quote)
2563632Sdlw 			break;
2573632Sdlw 		if (ch != '\n')
2583632Sdlw 			GET(ch);
2593632Sdlw 		if (ch == '\n')
2603632Sdlw 			*s++ = ' ';
2613632Sdlw 		else
2623632Sdlw 			*s++ = ch;
2633632Sdlw 	}
2643632Sdlw 	return(OK);
2653632Sdlw }
266