12499Sdlw /* 2*22026Slibs char id_rdfmt[] = "@(#)rdfmt.c 1.12"; 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 8820984Slibs 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 9720984Slibs 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 14020984Slibs LOCAL 14119984Slibs rd_L(n,w,len) uint *n; ftnlen len; 142*22026Slibs { int ch,i,v = -1, period=0; 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; 147*22026Slibs else if(ch=='.' && !period) period++; 148*22026Slibs else if(ch==' ' || ch=='\t') ; 1492499Sdlw else if(ch==',') break; 150*22026Slibs else if(v==-1) return(errno=F_ERLOGIF); 1512499Sdlw } 1522598Sdlw if(v==-1) return(errno=F_ERLOGIF); 15319984Slibs if(len==sizeof(short)) n->is=v; 15419984Slibs else n->il=v; 1552499Sdlw return(OK); 1562499Sdlw } 1572499Sdlw 15820984Slibs LOCAL 1592499Sdlw rd_F(p,w,d,len) ftnlen len; ufloat *p; 1602499Sdlw { double x,y; 16118016Slibs int i,sx,sz,ch,dot,ny,z,sawz,mode, sign_ok=YES; 1622499Sdlw x=y=0; 1632499Sdlw sawz=z=ny=dot=sx=sz=0; 16418016Slibs /* modes: 0 in initial blanks, 16518016Slibs 2 blanks plus sign 16618016Slibs 3 found a digit 16718016Slibs */ 16818016Slibs mode = 0; 16918016Slibs 1702499Sdlw for(i=0;i<w;) 1712499Sdlw { i++; 1722499Sdlw if((ch=(*getn)())<0) return(ch); 17318016Slibs 17418016Slibs if(ch==' ') { /* blank */ 17518016Slibs if(cblank && (mode==2)) x *= 10; 17618016Slibs } else if(ch<='9' && ch>='0') { /* digit */ 17718016Slibs mode = 2; 1782499Sdlw x=10*x+ch-'0'; 17918016Slibs } else if(ch=='.') { 1802499Sdlw break; 18118016Slibs } else if(ch=='e' || ch=='d' || ch=='E' || ch=='D') { 18218016Slibs goto exponent; 18318016Slibs } else if(ch=='+' || ch=='-') { 18418016Slibs if(mode==0) { /* sign before digits */ 18518016Slibs if(ch=='-') sx=1; 18618016Slibs mode = 1; 18718016Slibs } else if(mode==1) { /* two signs before digits */ 18818016Slibs return(errno=F_ERRFCHR); 18918016Slibs } else { /* sign after digits, weird but standard! 19018016Slibs means exponent without 'e' or 'd' */ 19118016Slibs goto exponent; 19218016Slibs } 19318016Slibs } else if(ch==',') { 19418016Slibs goto done; 19518016Slibs } else if(ch=='\n') { 19618016Slibs if(cblank && (mode==2)) x *= 10; 19718016Slibs } else { 19818016Slibs return(errno=F_ERRFCHR); 1992499Sdlw } 2002499Sdlw } 20118016Slibs /* get here if out of characters to scan or found a period */ 2022499Sdlw if(ch=='.') dot=1; 20318016Slibs while(i<w) 2042499Sdlw { i++; 2052499Sdlw if((ch=(*getn)())<0) return(ch); 20618016Slibs 20718016Slibs if(ch<='9' && ch>='0') { 2082499Sdlw y=10*y+ch-'0'; 20918016Slibs ny++; 21018016Slibs } else if(ch==' ' || ch=='\n') { 21118016Slibs if(cblank) { 21218016Slibs y*= 10; 21318016Slibs ny++; 21418016Slibs } 21518016Slibs } else if(ch==',') { 21618016Slibs goto done; 21718016Slibs } else if(ch=='d' || ch=='e' || ch=='+' || ch=='-' || ch=='D' || ch=='E') { 21818016Slibs break; 21918016Slibs } else { 22018016Slibs return(errno=F_ERRFCHR); 22118016Slibs } 2222499Sdlw } 22318016Slibs /* now for the exponent. 22418016Slibs * mode=3 means seen digit or sign of exponent. 22518016Slibs * either out of characters to scan or 22618016Slibs * ch is '+', '-', 'd', or 'e'. 22718016Slibs */ 22818016Slibs exponent: 22918016Slibs if(ch=='-' || ch=='+') { 23018016Slibs if(ch=='-') sz=1; 23118016Slibs mode = 3; 23218016Slibs } else { 23318016Slibs mode = 2; 23418016Slibs } 23518016Slibs 2362499Sdlw while(i<w) 2372499Sdlw { i++; 2382499Sdlw sawz=1; 2392499Sdlw if((ch=(*getn)())<0) return(ch); 24018016Slibs 24118016Slibs if(ch<='9' && ch>='0') { 24218016Slibs mode = 3; 2432499Sdlw z=10*z+ch-'0'; 24418016Slibs } else if(ch=='+' || ch=='-') { 24518016Slibs if(mode==3 ) return(errno=F_ERRFCHR); 24618016Slibs mode = 3; 24718016Slibs if(ch=='-') sz=1; 24818016Slibs } else if(ch == ' ' || ch=='\n') { 24918016Slibs if(cblank) z *=10; 25018016Slibs } else if(ch==',') { 25118016Slibs break; 25218016Slibs } else { 25318016Slibs return(errno=F_ERRFCHR); 25418016Slibs } 2552499Sdlw } 25618016Slibs done: 2572499Sdlw if(!dot) 2582499Sdlw for(i=0;i<d;i++) x /= 10; 2592499Sdlw for(i=0;i<ny;i++) y /= 10; 2602499Sdlw x=x+y; 2612499Sdlw if(sz) 2622499Sdlw for(i=0;i<z;i++) x /=10; 2632499Sdlw else for(i=0;i<z;i++) x *= 10; 2642499Sdlw if(sx) x = -x; 2652499Sdlw if(!sawz) 2662499Sdlw { 2672499Sdlw for(i=scale;i>0;i--) x /= 10; 2682499Sdlw for(i=scale;i<0;i++) x *= 10; 2692499Sdlw } 2702499Sdlw if(len==sizeof(float)) p->pf=x; 2712499Sdlw else p->pd=x; 2722499Sdlw return(OK); 2732499Sdlw } 2742499Sdlw 27520984Slibs LOCAL 2762499Sdlw rd_AW(p,w,len) char *p; ftnlen len; 2772499Sdlw { int i,ch; 2782499Sdlw if(w >= len) 2792499Sdlw { 2802499Sdlw for(i=0;i<w-len;i++) GET(ch); 2812499Sdlw for(i=0;i<len;i++) 2822499Sdlw { GET(ch); 2832499Sdlw *p++=VAL(ch); 2842499Sdlw } 2852499Sdlw } 2862499Sdlw else 2872499Sdlw { 2882499Sdlw for(i=0;i<w;i++) 2892499Sdlw { GET(ch); 2902499Sdlw *p++=VAL(ch); 2912499Sdlw } 2922499Sdlw for(i=0;i<len-w;i++) *p++=' '; 2932499Sdlw } 2942499Sdlw return(OK); 2952499Sdlw } 2962499Sdlw 2972499Sdlw /* THIS IS NOT ALLOWED IN THE NEW STANDARD 'CAUSE IT'S WEIRD */ 29820984Slibs LOCAL 2993632Sdlw rd_H(n,s) char *s; 3003632Sdlw { int i,ch = 0; 30118014Slibs 30218014Slibs used_data = YES; 3033632Sdlw for(i=0;i<n;i++) 3043632Sdlw { if (ch != '\n') 3053632Sdlw GET(ch); 3063632Sdlw if (ch == '\n') 3073632Sdlw *s++ = ' '; 3083632Sdlw else 3093632Sdlw *s++ = ch; 3103632Sdlw } 3113632Sdlw return(OK); 3123632Sdlw } 3133632Sdlw 31420984Slibs LOCAL 3153632Sdlw rd_POS(s) char *s; 3163632Sdlw { char quote; 3173632Sdlw int ch = 0; 31818014Slibs 31918014Slibs used_data = YES; 3203632Sdlw quote = *s++; 3213632Sdlw while(*s) 3223632Sdlw { if(*s==quote && *(s+1)!=quote) 3233632Sdlw break; 3243632Sdlw if (ch != '\n') 3253632Sdlw GET(ch); 3263632Sdlw if (ch == '\n') 3273632Sdlw *s++ = ' '; 3283632Sdlw else 3293632Sdlw *s++ = ch; 3303632Sdlw } 3313632Sdlw return(OK); 3323632Sdlw } 333