12499Sdlw /* 2*20984Slibs char id_rdfmt[] = "@(#)rdfmt.c 1.11"; 32499Sdlw * 42499Sdlw * formatted read routines 52499Sdlw */ 62499Sdlw 72499Sdlw #include "fio.h" 82598Sdlw #include "format.h" 92499Sdlw 1017968Slibs extern char *s_init; 1118016Slibs extern int low_case[256]; 1218014Slibs extern int used_data; 1317968Slibs 142499Sdlw rd_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len; 152499Sdlw { int n; 162499Sdlw if(cursor && (n=rd_mvcur())) return(n); 172499Sdlw switch(p->op) 182499Sdlw { 192499Sdlw case I: 202499Sdlw case IM: 212499Sdlw n = (rd_I(ptr,p->p1,len)); 222499Sdlw break; 232499Sdlw case L: 2419984Slibs n = (rd_L(ptr,p->p1,len)); 252499Sdlw break; 262499Sdlw case A: 2717968Slibs n = (rd_AW(ptr,len,len)); 2817968Slibs break; 292499Sdlw case AW: 302499Sdlw n = (rd_AW(ptr,p->p1,len)); 312499Sdlw break; 322499Sdlw case E: 332499Sdlw case EE: 342499Sdlw case D: 352499Sdlw case DE: 362499Sdlw case G: 372499Sdlw case GE: 382499Sdlw case F: 392499Sdlw n = (rd_F(ptr,p->p1,p->p2,len)); 402499Sdlw break; 412499Sdlw default: 422598Sdlw return(errno=F_ERFMT); 432499Sdlw } 442499Sdlw if (n < 0) 452499Sdlw { 462499Sdlw if(feof(cf)) return(EOF); 472499Sdlw n = errno; 482499Sdlw clearerr(cf); 492499Sdlw } 502499Sdlw return(n); 512499Sdlw } 522499Sdlw 532499Sdlw rd_ned(p,ptr) char *ptr; struct syl *p; 542499Sdlw { 552499Sdlw switch(p->op) 562499Sdlw { 573632Sdlw #ifndef KOSHER 583632Sdlw case APOS: /* NOT STANDARD F77 */ 5917968Slibs return(rd_POS(&s_init[p->p1])); 603632Sdlw case H: /* NOT STANDARD F77 */ 6117968Slibs return(rd_H(p->p1,&s_init[p->p2])); 623632Sdlw #endif 632499Sdlw case SLASH: 642499Sdlw return((*donewrec)()); 652499Sdlw case TR: 662499Sdlw case X: 672499Sdlw cursor += p->p1; 6812465Sdlw /* tab = (p->op==TR); This voids '..,tl6,1x,..' sequences */ 6912465Sdlw tab = YES; 702499Sdlw return(OK); 712499Sdlw case T: 722499Sdlw if(p->p1) cursor = p->p1 - recpos - 1; 732499Sdlw #ifndef KOSHER 742499Sdlw else cursor = 8*p->p2 - recpos%8; /* NOT STANDARD FORT */ 752499Sdlw #endif 762499Sdlw tab = YES; 772499Sdlw return(OK); 782499Sdlw case TL: 792499Sdlw cursor -= p->p1; 8012370Sdlw if ((recpos + cursor) < 0) cursor = -recpos; /* ANSI req'd */ 812499Sdlw tab = YES; 822499Sdlw return(OK); 832499Sdlw default: 842598Sdlw return(errno=F_ERFMT); 852499Sdlw } 862499Sdlw } 872499Sdlw 88*20984Slibs LOCAL 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 97*20984Slibs LOCAL 982499Sdlw rd_I(n,w,len) ftnlen len; uint *n; 992499Sdlw { long x=0; 10018016Slibs int i,sign=0,ch,c,sign_ok=YES; 1012499Sdlw for(i=0;i<w;i++) 1022499Sdlw { 1032499Sdlw if((ch=(*getn)())<0) return(ch); 10418016Slibs switch(ch) 1052499Sdlw { 1062499Sdlw case ',': goto done; 10718016Slibs case '-': sign=1; /* and fall thru */ 10818016Slibs case '+': if(sign_ok == NO) return(errno=F_ERRICHR); 10918016Slibs sign_ok = NO; 11018016Slibs break; 1112499Sdlw case ' ': 1122499Sdlw if(cblank) x *= radix; 1132499Sdlw break; 11418016Slibs case '\n': if(cblank) { 11518016Slibs x *= radix; 11618016Slibs break; 11718016Slibs } else { 11818016Slibs goto done; 11918016Slibs } 1202499Sdlw default: 12118016Slibs sign_ok = NO; 12218016Slibs if( (c = ch-'0')>=0 && c<radix ) 12318016Slibs { x = (x * radix) + c; 12418016Slibs break; 1252499Sdlw } 12618016Slibs else if( (c = low_case[ch]-'a'+10)>=0 && c<radix ) 12718016Slibs { x = (x * radix) + c; 12818016Slibs break; 1292499Sdlw } 13017973Slibs return(errno=F_ERRICHR); 1312499Sdlw } 1322499Sdlw } 1332499Sdlw done: 1342499Sdlw if(sign) x = -x; 1352499Sdlw if(len==sizeof(short)) n->is=x; 1362499Sdlw else n->il=x; 1372499Sdlw return(OK); 1382499Sdlw } 1392499Sdlw 140*20984Slibs LOCAL 14119984Slibs rd_L(n,w,len) uint *n; ftnlen len; 1422499Sdlw { int ch,i,v = -1; 1432499Sdlw for(i=0;i<w;i++) 1442499Sdlw { if((ch=(*getn)()) < 0) return(ch); 14518016Slibs if((ch=low_case[ch])=='t' && v==-1) v=1; 1462499Sdlw else if(ch=='f' && v==-1) v=0; 1472499Sdlw else if(ch==',') break; 1482499Sdlw } 1492598Sdlw if(v==-1) return(errno=F_ERLOGIF); 15019984Slibs if(len==sizeof(short)) n->is=v; 15119984Slibs else n->il=v; 1522499Sdlw return(OK); 1532499Sdlw } 1542499Sdlw 155*20984Slibs LOCAL 1562499Sdlw rd_F(p,w,d,len) ftnlen len; ufloat *p; 1572499Sdlw { double x,y; 15818016Slibs int i,sx,sz,ch,dot,ny,z,sawz,mode, sign_ok=YES; 1592499Sdlw x=y=0; 1602499Sdlw sawz=z=ny=dot=sx=sz=0; 16118016Slibs /* modes: 0 in initial blanks, 16218016Slibs 2 blanks plus sign 16318016Slibs 3 found a digit 16418016Slibs */ 16518016Slibs mode = 0; 16618016Slibs 1672499Sdlw for(i=0;i<w;) 1682499Sdlw { i++; 1692499Sdlw if((ch=(*getn)())<0) return(ch); 17018016Slibs 17118016Slibs if(ch==' ') { /* blank */ 17218016Slibs if(cblank && (mode==2)) x *= 10; 17318016Slibs } else if(ch<='9' && ch>='0') { /* digit */ 17418016Slibs mode = 2; 1752499Sdlw x=10*x+ch-'0'; 17618016Slibs } else if(ch=='.') { 1772499Sdlw break; 17818016Slibs } else if(ch=='e' || ch=='d' || ch=='E' || ch=='D') { 17918016Slibs goto exponent; 18018016Slibs } else if(ch=='+' || ch=='-') { 18118016Slibs if(mode==0) { /* sign before digits */ 18218016Slibs if(ch=='-') sx=1; 18318016Slibs mode = 1; 18418016Slibs } else if(mode==1) { /* two signs before digits */ 18518016Slibs return(errno=F_ERRFCHR); 18618016Slibs } else { /* sign after digits, weird but standard! 18718016Slibs means exponent without 'e' or 'd' */ 18818016Slibs goto exponent; 18918016Slibs } 19018016Slibs } else if(ch==',') { 19118016Slibs goto done; 19218016Slibs } else if(ch=='\n') { 19318016Slibs if(cblank && (mode==2)) x *= 10; 19418016Slibs } else { 19518016Slibs return(errno=F_ERRFCHR); 1962499Sdlw } 1972499Sdlw } 19818016Slibs /* get here if out of characters to scan or found a period */ 1992499Sdlw if(ch=='.') dot=1; 20018016Slibs while(i<w) 2012499Sdlw { i++; 2022499Sdlw if((ch=(*getn)())<0) return(ch); 20318016Slibs 20418016Slibs if(ch<='9' && ch>='0') { 2052499Sdlw y=10*y+ch-'0'; 20618016Slibs ny++; 20718016Slibs } else if(ch==' ' || ch=='\n') { 20818016Slibs if(cblank) { 20918016Slibs y*= 10; 21018016Slibs ny++; 21118016Slibs } 21218016Slibs } else if(ch==',') { 21318016Slibs goto done; 21418016Slibs } else if(ch=='d' || ch=='e' || ch=='+' || ch=='-' || ch=='D' || ch=='E') { 21518016Slibs break; 21618016Slibs } else { 21718016Slibs return(errno=F_ERRFCHR); 21818016Slibs } 2192499Sdlw } 22018016Slibs /* now for the exponent. 22118016Slibs * mode=3 means seen digit or sign of exponent. 22218016Slibs * either out of characters to scan or 22318016Slibs * ch is '+', '-', 'd', or 'e'. 22418016Slibs */ 22518016Slibs exponent: 22618016Slibs if(ch=='-' || ch=='+') { 22718016Slibs if(ch=='-') sz=1; 22818016Slibs mode = 3; 22918016Slibs } else { 23018016Slibs mode = 2; 23118016Slibs } 23218016Slibs 2332499Sdlw while(i<w) 2342499Sdlw { i++; 2352499Sdlw sawz=1; 2362499Sdlw if((ch=(*getn)())<0) return(ch); 23718016Slibs 23818016Slibs if(ch<='9' && ch>='0') { 23918016Slibs mode = 3; 2402499Sdlw z=10*z+ch-'0'; 24118016Slibs } else if(ch=='+' || ch=='-') { 24218016Slibs if(mode==3 ) return(errno=F_ERRFCHR); 24318016Slibs mode = 3; 24418016Slibs if(ch=='-') sz=1; 24518016Slibs } else if(ch == ' ' || ch=='\n') { 24618016Slibs if(cblank) z *=10; 24718016Slibs } else if(ch==',') { 24818016Slibs break; 24918016Slibs } else { 25018016Slibs return(errno=F_ERRFCHR); 25118016Slibs } 2522499Sdlw } 25318016Slibs done: 2542499Sdlw if(!dot) 2552499Sdlw for(i=0;i<d;i++) x /= 10; 2562499Sdlw for(i=0;i<ny;i++) y /= 10; 2572499Sdlw x=x+y; 2582499Sdlw if(sz) 2592499Sdlw for(i=0;i<z;i++) x /=10; 2602499Sdlw else for(i=0;i<z;i++) x *= 10; 2612499Sdlw if(sx) x = -x; 2622499Sdlw if(!sawz) 2632499Sdlw { 2642499Sdlw for(i=scale;i>0;i--) x /= 10; 2652499Sdlw for(i=scale;i<0;i++) x *= 10; 2662499Sdlw } 2672499Sdlw if(len==sizeof(float)) p->pf=x; 2682499Sdlw else p->pd=x; 2692499Sdlw return(OK); 2702499Sdlw } 2712499Sdlw 272*20984Slibs LOCAL 2732499Sdlw rd_AW(p,w,len) char *p; ftnlen len; 2742499Sdlw { int i,ch; 2752499Sdlw if(w >= len) 2762499Sdlw { 2772499Sdlw for(i=0;i<w-len;i++) GET(ch); 2782499Sdlw for(i=0;i<len;i++) 2792499Sdlw { GET(ch); 2802499Sdlw *p++=VAL(ch); 2812499Sdlw } 2822499Sdlw } 2832499Sdlw else 2842499Sdlw { 2852499Sdlw for(i=0;i<w;i++) 2862499Sdlw { GET(ch); 2872499Sdlw *p++=VAL(ch); 2882499Sdlw } 2892499Sdlw for(i=0;i<len-w;i++) *p++=' '; 2902499Sdlw } 2912499Sdlw return(OK); 2922499Sdlw } 2932499Sdlw 2942499Sdlw /* THIS IS NOT ALLOWED IN THE NEW STANDARD 'CAUSE IT'S WEIRD */ 295*20984Slibs LOCAL 2963632Sdlw rd_H(n,s) char *s; 2973632Sdlw { int i,ch = 0; 29818014Slibs 29918014Slibs used_data = YES; 3003632Sdlw for(i=0;i<n;i++) 3013632Sdlw { if (ch != '\n') 3023632Sdlw GET(ch); 3033632Sdlw if (ch == '\n') 3043632Sdlw *s++ = ' '; 3053632Sdlw else 3063632Sdlw *s++ = ch; 3073632Sdlw } 3083632Sdlw return(OK); 3093632Sdlw } 3103632Sdlw 311*20984Slibs LOCAL 3123632Sdlw rd_POS(s) char *s; 3133632Sdlw { char quote; 3143632Sdlw int ch = 0; 31518014Slibs 31618014Slibs used_data = YES; 3173632Sdlw quote = *s++; 3183632Sdlw while(*s) 3193632Sdlw { if(*s==quote && *(s+1)!=quote) 3203632Sdlw break; 3213632Sdlw if (ch != '\n') 3223632Sdlw GET(ch); 3233632Sdlw if (ch == '\n') 3243632Sdlw *s++ = ' '; 3253632Sdlw else 3263632Sdlw *s++ = ch; 3273632Sdlw } 3283632Sdlw return(OK); 3293632Sdlw } 330