1*2499Sdlw /* 2*2499Sdlw char id_rdfmt[] = "@(#)rdfmt.c 1.1"; 3*2499Sdlw * 4*2499Sdlw * formatted read routines 5*2499Sdlw */ 6*2499Sdlw 7*2499Sdlw #include "fio.h" 8*2499Sdlw #include "fmt.h" 9*2499Sdlw 10*2499Sdlw #define isdigit(c) (c>='0' && c<='9') 11*2499Sdlw #define isalpha(c) (c>='a' && c<='z') 12*2499Sdlw 13*2499Sdlw rd_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len; 14*2499Sdlw { int n; 15*2499Sdlw if(cursor && (n=rd_mvcur())) return(n); 16*2499Sdlw switch(p->op) 17*2499Sdlw { 18*2499Sdlw case I: 19*2499Sdlw case IM: 20*2499Sdlw n = (rd_I(ptr,p->p1,len)); 21*2499Sdlw break; 22*2499Sdlw case L: 23*2499Sdlw n = (rd_L(ptr,p->p1)); 24*2499Sdlw break; 25*2499Sdlw case A: 26*2499Sdlw p->p1 = len; /* cheap trick */ 27*2499Sdlw case AW: 28*2499Sdlw n = (rd_AW(ptr,p->p1,len)); 29*2499Sdlw break; 30*2499Sdlw case E: 31*2499Sdlw case EE: 32*2499Sdlw case D: 33*2499Sdlw case DE: 34*2499Sdlw case G: 35*2499Sdlw case GE: 36*2499Sdlw case F: 37*2499Sdlw n = (rd_F(ptr,p->p1,p->p2,len)); 38*2499Sdlw break; 39*2499Sdlw default: 40*2499Sdlw return(errno=100); 41*2499Sdlw } 42*2499Sdlw if (n < 0) 43*2499Sdlw { 44*2499Sdlw if(feof(cf)) return(EOF); 45*2499Sdlw n = errno; 46*2499Sdlw clearerr(cf); 47*2499Sdlw } 48*2499Sdlw return(n); 49*2499Sdlw } 50*2499Sdlw 51*2499Sdlw rd_ned(p,ptr) char *ptr; struct syl *p; 52*2499Sdlw { 53*2499Sdlw switch(p->op) 54*2499Sdlw { 55*2499Sdlw /* case APOS: 56*2499Sdlw /* return(rd_POS(p->p1)); 57*2499Sdlw /* case H: 58*2499Sdlw /* return(rd_H(p->p1,p->p2)); */ 59*2499Sdlw case SLASH: 60*2499Sdlw return((*donewrec)()); 61*2499Sdlw case TR: 62*2499Sdlw case X: 63*2499Sdlw cursor += p->p1; 64*2499Sdlw tab = (p->op==TR); 65*2499Sdlw return(OK); 66*2499Sdlw case T: 67*2499Sdlw if(p->p1) cursor = p->p1 - recpos - 1; 68*2499Sdlw #ifndef KOSHER 69*2499Sdlw else cursor = 8*p->p2 - recpos%8; /* NOT STANDARD FORT */ 70*2499Sdlw #endif 71*2499Sdlw tab = YES; 72*2499Sdlw return(OK); 73*2499Sdlw case TL: 74*2499Sdlw cursor -= p->p1; 75*2499Sdlw tab = YES; 76*2499Sdlw return(OK); 77*2499Sdlw default: 78*2499Sdlw return(errno=100); 79*2499Sdlw } 80*2499Sdlw } 81*2499Sdlw 82*2499Sdlw rd_mvcur() 83*2499Sdlw { int n; 84*2499Sdlw if(tab) return((*dotab)()); 85*2499Sdlw while(cursor--) if((n=(*getn)()) < 0) return(n); 86*2499Sdlw return(cursor=0); 87*2499Sdlw } 88*2499Sdlw 89*2499Sdlw rd_I(n,w,len) ftnlen len; uint *n; 90*2499Sdlw { long x=0; 91*2499Sdlw int i,sign=0,ch,c; 92*2499Sdlw for(i=0;i<w;i++) 93*2499Sdlw { 94*2499Sdlw if((ch=(*getn)())<0) return(ch); 95*2499Sdlw switch(ch=lcase(ch)) 96*2499Sdlw { 97*2499Sdlw case ',': goto done; 98*2499Sdlw case '+': break; 99*2499Sdlw case '-': 100*2499Sdlw sign=1; 101*2499Sdlw break; 102*2499Sdlw case ' ': 103*2499Sdlw if(cblank) x *= radix; 104*2499Sdlw break; 105*2499Sdlw case '\n': goto done; 106*2499Sdlw default: 107*2499Sdlw if(isdigit(ch)) 108*2499Sdlw { if ((c=(ch-'0')) < radix) 109*2499Sdlw { x = (x * radix) + c; 110*2499Sdlw break; 111*2499Sdlw } 112*2499Sdlw } 113*2499Sdlw else if(isalpha(ch)) 114*2499Sdlw { if ((c=(ch-'a'+10)) < radix) 115*2499Sdlw { x = (x * radix) + c; 116*2499Sdlw break; 117*2499Sdlw } 118*2499Sdlw } 119*2499Sdlw return(errno=115); 120*2499Sdlw } 121*2499Sdlw } 122*2499Sdlw done: 123*2499Sdlw if(sign) x = -x; 124*2499Sdlw if(len==sizeof(short)) n->is=x; 125*2499Sdlw else n->il=x; 126*2499Sdlw return(OK); 127*2499Sdlw } 128*2499Sdlw 129*2499Sdlw rd_L(n,w) ftnint *n; 130*2499Sdlw { int ch,i,v = -1; 131*2499Sdlw for(i=0;i<w;i++) 132*2499Sdlw { if((ch=(*getn)()) < 0) return(ch); 133*2499Sdlw if((ch=lcase(ch))=='t' && v==-1) v=1; 134*2499Sdlw else if(ch=='f' && v==-1) v=0; 135*2499Sdlw else if(ch==',') break; 136*2499Sdlw } 137*2499Sdlw if(v==-1) return(errno=116); 138*2499Sdlw *n=v; 139*2499Sdlw return(OK); 140*2499Sdlw } 141*2499Sdlw 142*2499Sdlw rd_F(p,w,d,len) ftnlen len; ufloat *p; 143*2499Sdlw { double x,y; 144*2499Sdlw int i,sx,sz,ch,dot,ny,z,sawz; 145*2499Sdlw x=y=0; 146*2499Sdlw sawz=z=ny=dot=sx=sz=0; 147*2499Sdlw for(i=0;i<w;) 148*2499Sdlw { i++; 149*2499Sdlw if((ch=(*getn)())<0) return(ch); 150*2499Sdlw ch=lcase(ch); 151*2499Sdlw if(ch==' ' && !cblank || ch=='+') continue; 152*2499Sdlw else if(ch=='-') sx=1; 153*2499Sdlw else if(ch<='9' && ch>='0') 154*2499Sdlw x=10*x+ch-'0'; 155*2499Sdlw else if(ch=='e' || ch=='d' || ch=='.') 156*2499Sdlw break; 157*2499Sdlw else if(cblank && ch==' ') x*=10; 158*2499Sdlw else if(ch==',') 159*2499Sdlw { i=w; 160*2499Sdlw break; 161*2499Sdlw } 162*2499Sdlw else if(ch!='\n') return(errno=115); 163*2499Sdlw } 164*2499Sdlw if(ch=='.') dot=1; 165*2499Sdlw while(i<w && ch!='e' && ch!='d' && ch!='+' && ch!='-') 166*2499Sdlw { i++; 167*2499Sdlw if((ch=(*getn)())<0) return(ch); 168*2499Sdlw ch = lcase(ch); 169*2499Sdlw if(ch<='9' && ch>='0') 170*2499Sdlw y=10*y+ch-'0'; 171*2499Sdlw else if(cblank && ch==' ') 172*2499Sdlw y *= 10; 173*2499Sdlw else if(ch==',') {i=w; break;} 174*2499Sdlw else if(ch==' ') continue; 175*2499Sdlw else continue; 176*2499Sdlw ny++; 177*2499Sdlw } 178*2499Sdlw if(ch=='-') sz=1; 179*2499Sdlw while(i<w) 180*2499Sdlw { i++; 181*2499Sdlw sawz=1; 182*2499Sdlw if((ch=(*getn)())<0) return(ch); 183*2499Sdlw ch = lcase(ch); 184*2499Sdlw if(ch=='-') sz=1; 185*2499Sdlw else if(ch<='9' && ch>='0') 186*2499Sdlw z=10*z+ch-'0'; 187*2499Sdlw else if(cblank && ch==' ') 188*2499Sdlw z *= 10; 189*2499Sdlw else if(ch==',') break; 190*2499Sdlw else if(ch==' ') continue; 191*2499Sdlw else if(ch=='+') continue; 192*2499Sdlw else if(ch!='\n') return(errno=115); 193*2499Sdlw } 194*2499Sdlw if(!dot) 195*2499Sdlw for(i=0;i<d;i++) x /= 10; 196*2499Sdlw for(i=0;i<ny;i++) y /= 10; 197*2499Sdlw x=x+y; 198*2499Sdlw if(sz) 199*2499Sdlw for(i=0;i<z;i++) x /=10; 200*2499Sdlw else for(i=0;i<z;i++) x *= 10; 201*2499Sdlw if(sx) x = -x; 202*2499Sdlw if(!sawz) 203*2499Sdlw { 204*2499Sdlw for(i=scale;i>0;i--) x /= 10; 205*2499Sdlw for(i=scale;i<0;i++) x *= 10; 206*2499Sdlw } 207*2499Sdlw if(len==sizeof(float)) p->pf=x; 208*2499Sdlw else p->pd=x; 209*2499Sdlw return(OK); 210*2499Sdlw } 211*2499Sdlw 212*2499Sdlw rd_AW(p,w,len) char *p; ftnlen len; 213*2499Sdlw { int i,ch; 214*2499Sdlw if(w >= len) 215*2499Sdlw { 216*2499Sdlw for(i=0;i<w-len;i++) GET(ch); 217*2499Sdlw for(i=0;i<len;i++) 218*2499Sdlw { GET(ch); 219*2499Sdlw *p++=VAL(ch); 220*2499Sdlw } 221*2499Sdlw } 222*2499Sdlw else 223*2499Sdlw { 224*2499Sdlw for(i=0;i<w;i++) 225*2499Sdlw { GET(ch); 226*2499Sdlw *p++=VAL(ch); 227*2499Sdlw } 228*2499Sdlw for(i=0;i<len-w;i++) *p++=' '; 229*2499Sdlw } 230*2499Sdlw return(OK); 231*2499Sdlw } 232*2499Sdlw 233*2499Sdlw /* THIS IS NOT ALLOWED IN THE NEW STANDARD 'CAUSE IT'S WEIRD */ 234*2499Sdlw /*rd_H(n,s) char *s; 235*2499Sdlw /*{ int i,ch; 236*2499Sdlw /* for(i=0;i<n;i++) 237*2499Sdlw /* if((ch=(*getn)())<0) return(ch); 238*2499Sdlw /* else if(ch=='\n') for(;i<n;i++) *s++ = ' '; 239*2499Sdlw /* else *s++ = ch; 240*2499Sdlw /* return(OK); 241*2499Sdlw /*} 242*2499Sdlw */ 243*2499Sdlw /*rd_POS(s) char *s; 244*2499Sdlw /*{ char quote; 245*2499Sdlw /* int ch; 246*2499Sdlw /* quote= *s++; 247*2499Sdlw /* for(;*s;s++) 248*2499Sdlw /* if(*s==quote && *(s+1)!=quote) break; 249*2499Sdlw /* else if((ch=(*getn)())<0) return(ch); 250*2499Sdlw /* else *s = ch=='\n'?' ':ch; 251*2499Sdlw /* return(OK); 252*2499Sdlw /*} 253*2499Sdlw */ 254