xref: /csrg-svn/usr.bin/f77/libI77/rdfmt.c (revision 17968)
12499Sdlw /*
2*17968Slibs char id_rdfmt[] = "@(#)rdfmt.c	1.6";
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 
13*17968Slibs extern char *s_init;
14*17968Slibs 
152499Sdlw rd_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len;
162499Sdlw {	int n;
172499Sdlw 	if(cursor && (n=rd_mvcur())) return(n);
182499Sdlw 	switch(p->op)
192499Sdlw 	{
202499Sdlw 	case I:
212499Sdlw 	case IM:
222499Sdlw 		n = (rd_I(ptr,p->p1,len));
232499Sdlw 		break;
242499Sdlw 	case L:
252499Sdlw 		n = (rd_L(ptr,p->p1));
262499Sdlw 		break;
272499Sdlw 	case A:
28*17968Slibs 		n = (rd_AW(ptr,len,len));
29*17968Slibs 		break;
302499Sdlw 	case AW:
312499Sdlw 		n = (rd_AW(ptr,p->p1,len));
322499Sdlw 		break;
332499Sdlw 	case E:
342499Sdlw 	case EE:
352499Sdlw 	case D:
362499Sdlw 	case DE:
372499Sdlw 	case G:
382499Sdlw 	case GE:
392499Sdlw 	case F:
402499Sdlw 		n = (rd_F(ptr,p->p1,p->p2,len));
412499Sdlw 		break;
422499Sdlw 	default:
432598Sdlw 		return(errno=F_ERFMT);
442499Sdlw 	}
452499Sdlw 	if (n < 0)
462499Sdlw 	{
472499Sdlw 		if(feof(cf)) return(EOF);
482499Sdlw 		n = errno;
492499Sdlw 		clearerr(cf);
502499Sdlw 	}
512499Sdlw 	return(n);
522499Sdlw }
532499Sdlw 
542499Sdlw rd_ned(p,ptr) char *ptr; struct syl *p;
552499Sdlw {
562499Sdlw 	switch(p->op)
572499Sdlw 	{
583632Sdlw #ifndef	KOSHER
593632Sdlw 	case APOS:					/* NOT STANDARD F77 */
60*17968Slibs 		return(rd_POS(&s_init[p->p1]));
613632Sdlw 	case H:						/* NOT STANDARD F77 */
62*17968Slibs 		return(rd_H(p->p1,&s_init[p->p2]));
633632Sdlw #endif
642499Sdlw 	case SLASH:
652499Sdlw 		return((*donewrec)());
662499Sdlw 	case TR:
672499Sdlw 	case X:
682499Sdlw 		cursor += p->p1;
6912465Sdlw 		/* tab = (p->op==TR); This voids '..,tl6,1x,..' sequences */
7012465Sdlw 		tab = YES;
712499Sdlw 		return(OK);
722499Sdlw 	case T:
732499Sdlw 		if(p->p1) cursor = p->p1 - recpos - 1;
742499Sdlw #ifndef KOSHER
752499Sdlw 		else cursor = 8*p->p2 - recpos%8;	/* NOT STANDARD FORT */
762499Sdlw #endif
772499Sdlw 		tab = YES;
782499Sdlw 		return(OK);
792499Sdlw 	case TL:
802499Sdlw 		cursor -= p->p1;
8112370Sdlw 		if ((recpos + cursor) < 0) cursor = -recpos;	/* ANSI req'd */
822499Sdlw 		tab = YES;
832499Sdlw 		return(OK);
842499Sdlw 	default:
852598Sdlw 		return(errno=F_ERFMT);
862499Sdlw 	}
872499Sdlw }
882499Sdlw 
892499Sdlw rd_mvcur()
902499Sdlw {	int n;
912499Sdlw 	if(tab) return((*dotab)());
9212465Sdlw 	if (cursor < 0) return(errno=F_ERSEEK);
932499Sdlw 	while(cursor--) if((n=(*getn)()) < 0) return(n);
942499Sdlw 	return(cursor=0);
952499Sdlw }
962499Sdlw 
972499Sdlw rd_I(n,w,len) ftnlen len; uint *n;
982499Sdlw {	long x=0;
992499Sdlw 	int i,sign=0,ch,c;
1002499Sdlw 	for(i=0;i<w;i++)
1012499Sdlw 	{
1022499Sdlw 		if((ch=(*getn)())<0) return(ch);
1032499Sdlw 		switch(ch=lcase(ch))
1042499Sdlw 		{
1052499Sdlw 		case ',': goto done;
1062499Sdlw 		case '+': break;
1072499Sdlw 		case '-':
1082499Sdlw 			sign=1;
1092499Sdlw 			break;
1102499Sdlw 		case ' ':
1112499Sdlw 			if(cblank) x *= radix;
1122499Sdlw 			break;
1132499Sdlw 		case '\n':  goto done;
1142499Sdlw 		default:
1152499Sdlw 			if(isdigit(ch))
1162499Sdlw 			{	if ((c=(ch-'0')) < radix)
1172499Sdlw 				{	x = (x * radix) + c;
1182499Sdlw 					break;
1192499Sdlw 				}
1202499Sdlw 			}
1212499Sdlw 			else if(isalpha(ch))
1222499Sdlw 			{	if ((c=(ch-'a'+10)) < radix)
1232499Sdlw 				{	x = (x * radix) + c;
1242499Sdlw 					break;
1252499Sdlw 				}
1262499Sdlw 			}
1272598Sdlw 			return(errno=F_ERRDCHR);
1282499Sdlw 		}
1292499Sdlw 	}
1302499Sdlw done:
1312499Sdlw 	if(sign) x = -x;
1322499Sdlw 	if(len==sizeof(short)) n->is=x;
1332499Sdlw 	else n->il=x;
1342499Sdlw 	return(OK);
1352499Sdlw }
1362499Sdlw 
1372499Sdlw rd_L(n,w) ftnint *n;
1382499Sdlw {	int ch,i,v = -1;
1392499Sdlw 	for(i=0;i<w;i++)
1402499Sdlw 	{	if((ch=(*getn)()) < 0) return(ch);
1412499Sdlw 		if((ch=lcase(ch))=='t' && v==-1) v=1;
1422499Sdlw 		else if(ch=='f' && v==-1) v=0;
1432499Sdlw 		else if(ch==',') break;
1442499Sdlw 	}
1452598Sdlw 	if(v==-1) return(errno=F_ERLOGIF);
1462499Sdlw 	*n=v;
1472499Sdlw 	return(OK);
1482499Sdlw }
1492499Sdlw 
1502499Sdlw rd_F(p,w,d,len) ftnlen len; ufloat *p;
1512499Sdlw {	double x,y;
1522499Sdlw 	int i,sx,sz,ch,dot,ny,z,sawz;
1532499Sdlw 	x=y=0;
1542499Sdlw 	sawz=z=ny=dot=sx=sz=0;
1552499Sdlw 	for(i=0;i<w;)
1562499Sdlw 	{	i++;
1572499Sdlw 		if((ch=(*getn)())<0) return(ch);
1582499Sdlw 		ch=lcase(ch);
1592499Sdlw 		if(ch==' ' && !cblank || ch=='+') continue;
1602499Sdlw 		else if(ch=='-') sx=1;
1612499Sdlw 		else if(ch<='9' && ch>='0')
1622499Sdlw 			x=10*x+ch-'0';
1632499Sdlw 		else if(ch=='e' || ch=='d' || ch=='.')
1642499Sdlw 			break;
1652499Sdlw 		else if(cblank && ch==' ') x*=10;
1662499Sdlw 		else if(ch==',')
1672499Sdlw 		{	i=w;
1682499Sdlw 			break;
1692499Sdlw 		}
1702598Sdlw 		else if(ch!='\n') return(errno=F_ERRDCHR);
1712499Sdlw 	}
1722499Sdlw 	if(ch=='.') dot=1;
1732499Sdlw 	while(i<w && ch!='e' && ch!='d' && ch!='+' && ch!='-')
1742499Sdlw 	{	i++;
1752499Sdlw 		if((ch=(*getn)())<0) return(ch);
1762499Sdlw 		ch = lcase(ch);
1772499Sdlw 		if(ch<='9' && ch>='0')
1782499Sdlw 			y=10*y+ch-'0';
1792499Sdlw 		else if(cblank && ch==' ')
1802499Sdlw 			y *= 10;
1812499Sdlw 		else if(ch==',') {i=w; break;}
1822499Sdlw 		else if(ch==' ') continue;
1832499Sdlw 		else continue;
1842499Sdlw 		ny++;
1852499Sdlw 	}
1862499Sdlw 	if(ch=='-') sz=1;
1872499Sdlw 	while(i<w)
1882499Sdlw 	{	i++;
1892499Sdlw 		sawz=1;
1902499Sdlw 		if((ch=(*getn)())<0) return(ch);
1912499Sdlw 		ch = lcase(ch);
1922499Sdlw 		if(ch=='-') sz=1;
1932499Sdlw 		else if(ch<='9' && ch>='0')
1942499Sdlw 			z=10*z+ch-'0';
1952499Sdlw 		else if(cblank && ch==' ')
1962499Sdlw 			z *= 10;
1972499Sdlw 		else if(ch==',') break;
1982499Sdlw 		else if(ch==' ') continue;
1992499Sdlw 		else if(ch=='+') continue;
2002598Sdlw 		else if(ch!='\n') return(errno=F_ERRDCHR);
2012499Sdlw 	}
2022499Sdlw 	if(!dot)
2032499Sdlw 		for(i=0;i<d;i++) x /= 10;
2042499Sdlw 	for(i=0;i<ny;i++) y /= 10;
2052499Sdlw 	x=x+y;
2062499Sdlw 	if(sz)
2072499Sdlw 		for(i=0;i<z;i++) x /=10;
2082499Sdlw 	else	for(i=0;i<z;i++) x *= 10;
2092499Sdlw 	if(sx) x = -x;
2102499Sdlw 	if(!sawz)
2112499Sdlw 	{
2122499Sdlw 		for(i=scale;i>0;i--) x /= 10;
2132499Sdlw 		for(i=scale;i<0;i++) x *= 10;
2142499Sdlw 	}
2152499Sdlw 	if(len==sizeof(float)) p->pf=x;
2162499Sdlw 	else p->pd=x;
2172499Sdlw 	return(OK);
2182499Sdlw }
2192499Sdlw 
2202499Sdlw rd_AW(p,w,len) char *p; ftnlen len;
2212499Sdlw {	int i,ch;
2222499Sdlw 	if(w >= len)
2232499Sdlw 	{
2242499Sdlw 		for(i=0;i<w-len;i++) GET(ch);
2252499Sdlw 		for(i=0;i<len;i++)
2262499Sdlw 		{	GET(ch);
2272499Sdlw 			*p++=VAL(ch);
2282499Sdlw 		}
2292499Sdlw 	}
2302499Sdlw 	else
2312499Sdlw 	{
2322499Sdlw 		for(i=0;i<w;i++)
2332499Sdlw 		{	GET(ch);
2342499Sdlw 			*p++=VAL(ch);
2352499Sdlw 		}
2362499Sdlw 		for(i=0;i<len-w;i++) *p++=' ';
2372499Sdlw 	}
2382499Sdlw 	return(OK);
2392499Sdlw }
2402499Sdlw 
2412499Sdlw /* THIS IS NOT ALLOWED IN THE NEW STANDARD 'CAUSE IT'S WEIRD */
2423632Sdlw rd_H(n,s) char *s;
2433632Sdlw {	int i,ch = 0;
2443632Sdlw 	for(i=0;i<n;i++)
2453632Sdlw 	{	if (ch != '\n')
2463632Sdlw 			GET(ch);
2473632Sdlw 		if (ch == '\n')
2483632Sdlw 			*s++ = ' ';
2493632Sdlw 		else
2503632Sdlw 			*s++ = ch;
2513632Sdlw 	}
2523632Sdlw 	return(OK);
2533632Sdlw }
2543632Sdlw 
2553632Sdlw rd_POS(s) char *s;
2563632Sdlw {	char quote;
2573632Sdlw 	int ch = 0;
2583632Sdlw 	quote = *s++;
2593632Sdlw 	while(*s)
2603632Sdlw 	{	if(*s==quote && *(s+1)!=quote)
2613632Sdlw 			break;
2623632Sdlw 		if (ch != '\n')
2633632Sdlw 			GET(ch);
2643632Sdlw 		if (ch == '\n')
2653632Sdlw 			*s++ = ' ';
2663632Sdlw 		else
2673632Sdlw 			*s++ = ch;
2683632Sdlw 	}
2693632Sdlw 	return(OK);
2703632Sdlw }
271