12499Sdlw /* 2*19984Slibs char id_rdfmt[] = "@(#)rdfmt.c 1.10"; 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: 24*19984Slibs 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 882499Sdlw rd_mvcur() 892499Sdlw { int n; 902499Sdlw if(tab) return((*dotab)()); 9112465Sdlw if (cursor < 0) return(errno=F_ERSEEK); 922499Sdlw while(cursor--) if((n=(*getn)()) < 0) return(n); 932499Sdlw return(cursor=0); 942499Sdlw } 952499Sdlw 962499Sdlw rd_I(n,w,len) ftnlen len; uint *n; 972499Sdlw { long x=0; 9818016Slibs int i,sign=0,ch,c,sign_ok=YES; 992499Sdlw for(i=0;i<w;i++) 1002499Sdlw { 1012499Sdlw if((ch=(*getn)())<0) return(ch); 10218016Slibs switch(ch) 1032499Sdlw { 1042499Sdlw case ',': goto done; 10518016Slibs case '-': sign=1; /* and fall thru */ 10618016Slibs case '+': if(sign_ok == NO) return(errno=F_ERRICHR); 10718016Slibs sign_ok = NO; 10818016Slibs break; 1092499Sdlw case ' ': 1102499Sdlw if(cblank) x *= radix; 1112499Sdlw break; 11218016Slibs case '\n': if(cblank) { 11318016Slibs x *= radix; 11418016Slibs break; 11518016Slibs } else { 11618016Slibs goto done; 11718016Slibs } 1182499Sdlw default: 11918016Slibs sign_ok = NO; 12018016Slibs if( (c = ch-'0')>=0 && c<radix ) 12118016Slibs { x = (x * radix) + c; 12218016Slibs break; 1232499Sdlw } 12418016Slibs else if( (c = low_case[ch]-'a'+10)>=0 && c<radix ) 12518016Slibs { x = (x * radix) + c; 12618016Slibs break; 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 138*19984Slibs rd_L(n,w,len) uint *n; ftnlen len; 1392499Sdlw { int ch,i,v = -1; 1402499Sdlw for(i=0;i<w;i++) 1412499Sdlw { if((ch=(*getn)()) < 0) return(ch); 14218016Slibs if((ch=low_case[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); 147*19984Slibs if(len==sizeof(short)) n->is=v; 148*19984Slibs else n->il=v; 1492499Sdlw return(OK); 1502499Sdlw } 1512499Sdlw 1522499Sdlw rd_F(p,w,d,len) ftnlen len; ufloat *p; 1532499Sdlw { double x,y; 15418016Slibs int i,sx,sz,ch,dot,ny,z,sawz,mode, sign_ok=YES; 1552499Sdlw x=y=0; 1562499Sdlw sawz=z=ny=dot=sx=sz=0; 15718016Slibs /* modes: 0 in initial blanks, 15818016Slibs 2 blanks plus sign 15918016Slibs 3 found a digit 16018016Slibs */ 16118016Slibs mode = 0; 16218016Slibs 1632499Sdlw for(i=0;i<w;) 1642499Sdlw { i++; 1652499Sdlw if((ch=(*getn)())<0) return(ch); 16618016Slibs 16718016Slibs if(ch==' ') { /* blank */ 16818016Slibs if(cblank && (mode==2)) x *= 10; 16918016Slibs } else if(ch<='9' && ch>='0') { /* digit */ 17018016Slibs mode = 2; 1712499Sdlw x=10*x+ch-'0'; 17218016Slibs } else if(ch=='.') { 1732499Sdlw break; 17418016Slibs } else if(ch=='e' || ch=='d' || ch=='E' || ch=='D') { 17518016Slibs goto exponent; 17618016Slibs } else if(ch=='+' || ch=='-') { 17718016Slibs if(mode==0) { /* sign before digits */ 17818016Slibs if(ch=='-') sx=1; 17918016Slibs mode = 1; 18018016Slibs } else if(mode==1) { /* two signs before digits */ 18118016Slibs return(errno=F_ERRFCHR); 18218016Slibs } else { /* sign after digits, weird but standard! 18318016Slibs means exponent without 'e' or 'd' */ 18418016Slibs goto exponent; 18518016Slibs } 18618016Slibs } else if(ch==',') { 18718016Slibs goto done; 18818016Slibs } else if(ch=='\n') { 18918016Slibs if(cblank && (mode==2)) x *= 10; 19018016Slibs } else { 19118016Slibs return(errno=F_ERRFCHR); 1922499Sdlw } 1932499Sdlw } 19418016Slibs /* get here if out of characters to scan or found a period */ 1952499Sdlw if(ch=='.') dot=1; 19618016Slibs while(i<w) 1972499Sdlw { i++; 1982499Sdlw if((ch=(*getn)())<0) return(ch); 19918016Slibs 20018016Slibs if(ch<='9' && ch>='0') { 2012499Sdlw y=10*y+ch-'0'; 20218016Slibs ny++; 20318016Slibs } else if(ch==' ' || ch=='\n') { 20418016Slibs if(cblank) { 20518016Slibs y*= 10; 20618016Slibs ny++; 20718016Slibs } 20818016Slibs } else if(ch==',') { 20918016Slibs goto done; 21018016Slibs } else if(ch=='d' || ch=='e' || ch=='+' || ch=='-' || ch=='D' || ch=='E') { 21118016Slibs break; 21218016Slibs } else { 21318016Slibs return(errno=F_ERRFCHR); 21418016Slibs } 2152499Sdlw } 21618016Slibs /* now for the exponent. 21718016Slibs * mode=3 means seen digit or sign of exponent. 21818016Slibs * either out of characters to scan or 21918016Slibs * ch is '+', '-', 'd', or 'e'. 22018016Slibs */ 22118016Slibs exponent: 22218016Slibs if(ch=='-' || ch=='+') { 22318016Slibs if(ch=='-') sz=1; 22418016Slibs mode = 3; 22518016Slibs } else { 22618016Slibs mode = 2; 22718016Slibs } 22818016Slibs 2292499Sdlw while(i<w) 2302499Sdlw { i++; 2312499Sdlw sawz=1; 2322499Sdlw if((ch=(*getn)())<0) return(ch); 23318016Slibs 23418016Slibs if(ch<='9' && ch>='0') { 23518016Slibs mode = 3; 2362499Sdlw z=10*z+ch-'0'; 23718016Slibs } else if(ch=='+' || ch=='-') { 23818016Slibs if(mode==3 ) return(errno=F_ERRFCHR); 23918016Slibs mode = 3; 24018016Slibs if(ch=='-') sz=1; 24118016Slibs } else if(ch == ' ' || ch=='\n') { 24218016Slibs if(cblank) z *=10; 24318016Slibs } else if(ch==',') { 24418016Slibs break; 24518016Slibs } else { 24618016Slibs return(errno=F_ERRFCHR); 24718016Slibs } 2482499Sdlw } 24918016Slibs done: 2502499Sdlw if(!dot) 2512499Sdlw for(i=0;i<d;i++) x /= 10; 2522499Sdlw for(i=0;i<ny;i++) y /= 10; 2532499Sdlw x=x+y; 2542499Sdlw if(sz) 2552499Sdlw for(i=0;i<z;i++) x /=10; 2562499Sdlw else for(i=0;i<z;i++) x *= 10; 2572499Sdlw if(sx) x = -x; 2582499Sdlw if(!sawz) 2592499Sdlw { 2602499Sdlw for(i=scale;i>0;i--) x /= 10; 2612499Sdlw for(i=scale;i<0;i++) x *= 10; 2622499Sdlw } 2632499Sdlw if(len==sizeof(float)) p->pf=x; 2642499Sdlw else p->pd=x; 2652499Sdlw return(OK); 2662499Sdlw } 2672499Sdlw 2682499Sdlw rd_AW(p,w,len) char *p; ftnlen len; 2692499Sdlw { int i,ch; 2702499Sdlw if(w >= len) 2712499Sdlw { 2722499Sdlw for(i=0;i<w-len;i++) GET(ch); 2732499Sdlw for(i=0;i<len;i++) 2742499Sdlw { GET(ch); 2752499Sdlw *p++=VAL(ch); 2762499Sdlw } 2772499Sdlw } 2782499Sdlw else 2792499Sdlw { 2802499Sdlw for(i=0;i<w;i++) 2812499Sdlw { GET(ch); 2822499Sdlw *p++=VAL(ch); 2832499Sdlw } 2842499Sdlw for(i=0;i<len-w;i++) *p++=' '; 2852499Sdlw } 2862499Sdlw return(OK); 2872499Sdlw } 2882499Sdlw 2892499Sdlw /* THIS IS NOT ALLOWED IN THE NEW STANDARD 'CAUSE IT'S WEIRD */ 2903632Sdlw rd_H(n,s) char *s; 2913632Sdlw { int i,ch = 0; 29218014Slibs 29318014Slibs used_data = YES; 2943632Sdlw for(i=0;i<n;i++) 2953632Sdlw { if (ch != '\n') 2963632Sdlw GET(ch); 2973632Sdlw if (ch == '\n') 2983632Sdlw *s++ = ' '; 2993632Sdlw else 3003632Sdlw *s++ = ch; 3013632Sdlw } 3023632Sdlw return(OK); 3033632Sdlw } 3043632Sdlw 3053632Sdlw rd_POS(s) char *s; 3063632Sdlw { char quote; 3073632Sdlw int ch = 0; 30818014Slibs 30918014Slibs used_data = YES; 3103632Sdlw quote = *s++; 3113632Sdlw while(*s) 3123632Sdlw { if(*s==quote && *(s+1)!=quote) 3133632Sdlw break; 3143632Sdlw if (ch != '\n') 3153632Sdlw GET(ch); 3163632Sdlw if (ch == '\n') 3173632Sdlw *s++ = ' '; 3183632Sdlw else 3193632Sdlw *s++ = ch; 3203632Sdlw } 3213632Sdlw return(OK); 3223632Sdlw } 323