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