12499Sdlw /* 2*12465Sdlw char id_rdfmt[] = "@(#)rdfmt.c 1.5"; 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; 66*12465Sdlw /* tab = (p->op==TR); This voids '..,tl6,1x,..' sequences */ 67*12465Sdlw tab = YES; 682499Sdlw return(OK); 692499Sdlw case T: 702499Sdlw if(p->p1) cursor = p->p1 - recpos - 1; 712499Sdlw #ifndef KOSHER 722499Sdlw else cursor = 8*p->p2 - recpos%8; /* NOT STANDARD FORT */ 732499Sdlw #endif 742499Sdlw tab = YES; 752499Sdlw return(OK); 762499Sdlw case TL: 772499Sdlw cursor -= p->p1; 7812370Sdlw if ((recpos + cursor) < 0) cursor = -recpos; /* ANSI req'd */ 792499Sdlw tab = YES; 802499Sdlw return(OK); 812499Sdlw default: 822598Sdlw return(errno=F_ERFMT); 832499Sdlw } 842499Sdlw } 852499Sdlw 862499Sdlw rd_mvcur() 872499Sdlw { int n; 882499Sdlw if(tab) return((*dotab)()); 89*12465Sdlw if (cursor < 0) return(errno=F_ERSEEK); 902499Sdlw while(cursor--) if((n=(*getn)()) < 0) return(n); 912499Sdlw return(cursor=0); 922499Sdlw } 932499Sdlw 942499Sdlw rd_I(n,w,len) ftnlen len; uint *n; 952499Sdlw { long x=0; 962499Sdlw int i,sign=0,ch,c; 972499Sdlw for(i=0;i<w;i++) 982499Sdlw { 992499Sdlw if((ch=(*getn)())<0) return(ch); 1002499Sdlw switch(ch=lcase(ch)) 1012499Sdlw { 1022499Sdlw case ',': goto done; 1032499Sdlw case '+': break; 1042499Sdlw case '-': 1052499Sdlw sign=1; 1062499Sdlw break; 1072499Sdlw case ' ': 1082499Sdlw if(cblank) x *= radix; 1092499Sdlw break; 1102499Sdlw case '\n': goto done; 1112499Sdlw default: 1122499Sdlw if(isdigit(ch)) 1132499Sdlw { if ((c=(ch-'0')) < radix) 1142499Sdlw { x = (x * radix) + c; 1152499Sdlw break; 1162499Sdlw } 1172499Sdlw } 1182499Sdlw else if(isalpha(ch)) 1192499Sdlw { if ((c=(ch-'a'+10)) < radix) 1202499Sdlw { x = (x * radix) + c; 1212499Sdlw break; 1222499Sdlw } 1232499Sdlw } 1242598Sdlw return(errno=F_ERRDCHR); 1252499Sdlw } 1262499Sdlw } 1272499Sdlw done: 1282499Sdlw if(sign) x = -x; 1292499Sdlw if(len==sizeof(short)) n->is=x; 1302499Sdlw else n->il=x; 1312499Sdlw return(OK); 1322499Sdlw } 1332499Sdlw 1342499Sdlw rd_L(n,w) ftnint *n; 1352499Sdlw { int ch,i,v = -1; 1362499Sdlw for(i=0;i<w;i++) 1372499Sdlw { if((ch=(*getn)()) < 0) return(ch); 1382499Sdlw if((ch=lcase(ch))=='t' && v==-1) v=1; 1392499Sdlw else if(ch=='f' && v==-1) v=0; 1402499Sdlw else if(ch==',') break; 1412499Sdlw } 1422598Sdlw if(v==-1) return(errno=F_ERLOGIF); 1432499Sdlw *n=v; 1442499Sdlw return(OK); 1452499Sdlw } 1462499Sdlw 1472499Sdlw rd_F(p,w,d,len) ftnlen len; ufloat *p; 1482499Sdlw { double x,y; 1492499Sdlw int i,sx,sz,ch,dot,ny,z,sawz; 1502499Sdlw x=y=0; 1512499Sdlw sawz=z=ny=dot=sx=sz=0; 1522499Sdlw for(i=0;i<w;) 1532499Sdlw { i++; 1542499Sdlw if((ch=(*getn)())<0) return(ch); 1552499Sdlw ch=lcase(ch); 1562499Sdlw if(ch==' ' && !cblank || ch=='+') continue; 1572499Sdlw else if(ch=='-') sx=1; 1582499Sdlw else if(ch<='9' && ch>='0') 1592499Sdlw x=10*x+ch-'0'; 1602499Sdlw else if(ch=='e' || ch=='d' || ch=='.') 1612499Sdlw break; 1622499Sdlw else if(cblank && ch==' ') x*=10; 1632499Sdlw else if(ch==',') 1642499Sdlw { i=w; 1652499Sdlw break; 1662499Sdlw } 1672598Sdlw else if(ch!='\n') return(errno=F_ERRDCHR); 1682499Sdlw } 1692499Sdlw if(ch=='.') dot=1; 1702499Sdlw while(i<w && ch!='e' && ch!='d' && ch!='+' && ch!='-') 1712499Sdlw { i++; 1722499Sdlw if((ch=(*getn)())<0) return(ch); 1732499Sdlw ch = lcase(ch); 1742499Sdlw if(ch<='9' && ch>='0') 1752499Sdlw y=10*y+ch-'0'; 1762499Sdlw else if(cblank && ch==' ') 1772499Sdlw y *= 10; 1782499Sdlw else if(ch==',') {i=w; break;} 1792499Sdlw else if(ch==' ') continue; 1802499Sdlw else continue; 1812499Sdlw ny++; 1822499Sdlw } 1832499Sdlw if(ch=='-') sz=1; 1842499Sdlw while(i<w) 1852499Sdlw { i++; 1862499Sdlw sawz=1; 1872499Sdlw if((ch=(*getn)())<0) return(ch); 1882499Sdlw ch = lcase(ch); 1892499Sdlw if(ch=='-') sz=1; 1902499Sdlw else if(ch<='9' && ch>='0') 1912499Sdlw z=10*z+ch-'0'; 1922499Sdlw else if(cblank && ch==' ') 1932499Sdlw z *= 10; 1942499Sdlw else if(ch==',') break; 1952499Sdlw else if(ch==' ') continue; 1962499Sdlw else if(ch=='+') continue; 1972598Sdlw else if(ch!='\n') return(errno=F_ERRDCHR); 1982499Sdlw } 1992499Sdlw if(!dot) 2002499Sdlw for(i=0;i<d;i++) x /= 10; 2012499Sdlw for(i=0;i<ny;i++) y /= 10; 2022499Sdlw x=x+y; 2032499Sdlw if(sz) 2042499Sdlw for(i=0;i<z;i++) x /=10; 2052499Sdlw else for(i=0;i<z;i++) x *= 10; 2062499Sdlw if(sx) x = -x; 2072499Sdlw if(!sawz) 2082499Sdlw { 2092499Sdlw for(i=scale;i>0;i--) x /= 10; 2102499Sdlw for(i=scale;i<0;i++) x *= 10; 2112499Sdlw } 2122499Sdlw if(len==sizeof(float)) p->pf=x; 2132499Sdlw else p->pd=x; 2142499Sdlw return(OK); 2152499Sdlw } 2162499Sdlw 2172499Sdlw rd_AW(p,w,len) char *p; ftnlen len; 2182499Sdlw { int i,ch; 2192499Sdlw if(w >= len) 2202499Sdlw { 2212499Sdlw for(i=0;i<w-len;i++) GET(ch); 2222499Sdlw for(i=0;i<len;i++) 2232499Sdlw { GET(ch); 2242499Sdlw *p++=VAL(ch); 2252499Sdlw } 2262499Sdlw } 2272499Sdlw else 2282499Sdlw { 2292499Sdlw for(i=0;i<w;i++) 2302499Sdlw { GET(ch); 2312499Sdlw *p++=VAL(ch); 2322499Sdlw } 2332499Sdlw for(i=0;i<len-w;i++) *p++=' '; 2342499Sdlw } 2352499Sdlw return(OK); 2362499Sdlw } 2372499Sdlw 2382499Sdlw /* THIS IS NOT ALLOWED IN THE NEW STANDARD 'CAUSE IT'S WEIRD */ 2393632Sdlw rd_H(n,s) char *s; 2403632Sdlw { int i,ch = 0; 2413632Sdlw for(i=0;i<n;i++) 2423632Sdlw { if (ch != '\n') 2433632Sdlw GET(ch); 2443632Sdlw if (ch == '\n') 2453632Sdlw *s++ = ' '; 2463632Sdlw else 2473632Sdlw *s++ = ch; 2483632Sdlw } 2493632Sdlw return(OK); 2503632Sdlw } 2513632Sdlw 2523632Sdlw rd_POS(s) char *s; 2533632Sdlw { char quote; 2543632Sdlw int ch = 0; 2553632Sdlw quote = *s++; 2563632Sdlw while(*s) 2573632Sdlw { if(*s==quote && *(s+1)!=quote) 2583632Sdlw break; 2593632Sdlw if (ch != '\n') 2603632Sdlw GET(ch); 2613632Sdlw if (ch == '\n') 2623632Sdlw *s++ = ' '; 2633632Sdlw else 2643632Sdlw *s++ = ch; 2653632Sdlw } 2663632Sdlw return(OK); 2673632Sdlw } 268