1: #include "fio.h" 2: #include "fmt.h" 3: extern int cursor; 4: rd_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len; 5: { int ch; 6: for(;cursor>0;cursor--) if((ch=(*getn)())<0) return(ch); 7: if(cursor<0) 8: { if(recpos+cursor < 0) err(elist->cierr,110,"fmt") 9: if(curunit->useek) fseek(cf,(long) cursor,1); 10: else err(elist->cierr,106,"fmt"); 11: cursor=0; 12: } 13: switch(p->op) 14: { 15: default: fprintf(stderr,"rd_ed, unexpected code: %d\n%s\n", 16: p->op,fmtbuf); 17: abort(); 18: case I: ch = (rd_I(ptr,p->p1,len, 10)); 19: break; 20: case IM: ch = (rd_I(ptr,p->p1,len, 10)); 21: break; 22: case O: ch = (rd_I(ptr, p->p1, len, 8)); 23: break; 24: case L: ch = (rd_L(ptr,p->p1)); 25: break; 26: case A: ch = (rd_A(ptr,len)); 27: break; 28: case AW: 29: ch = (rd_AW(ptr,p->p1,len)); 30: break; 31: case E: case EE: 32: case D: 33: case G: 34: case GE: 35: case F: ch = (rd_F(ptr,p->p1,p->p2,len)); 36: break; 37: } 38: if(ch == 0) return(ch); 39: else if(feof(cf)) return(EOF); 40: clearerr(cf); 41: return(errno); 42: } 43: rd_ned(p,ptr) char *ptr; struct syl *p; 44: { 45: switch(p->op) 46: { 47: default: fprintf(stderr,"rd_ned, unexpected code: %d\n%s\n", 48: p->op,fmtbuf); 49: abort(); 50: case APOS: 51: return(rd_POS(p->p1)); 52: case H: return(rd_H(p->p1,p->p2)); 53: case SLASH: return((*donewrec)()); 54: case TR: 55: case X: cursor += p->p1; 56: return(1); 57: case T: cursor=p->p1-recpos; 58: return(1); 59: case TL: cursor -= p->p1; 60: return(1); 61: } 62: } 63: rd_I(n,w,len, base) ftnlen len; uint *n; register int base; 64: { long x=0; 65: int i,sign=0,ch; 66: for(i=0;i<w;i++) 67: { 68: if((ch=(*getn)())<0) return(ch); 69: switch(ch) 70: { 71: default: 72: return(errno=115); 73: case ',': goto done; 74: case '+': break; 75: case '-': 76: sign=1; 77: break; 78: case '\n': 79: case ' ': 80: if(cblank) x *= base; 81: break; 82: case '0': case '1': case '2': case '3': case '4': 83: case '5': case '6': case '7': case '8': case '9': 84: x=base*x+ch-'0'; 85: break; 86: } 87: } 88: done: 89: if(sign) x = -x; 90: if(len==sizeof(short)) n->is=x; 91: else if(len == sizeof(char)) n->ic = x; 92: else n->il=x; 93: return(0); 94: } 95: rd_L(n,w) ftnint *n; 96: { int ch,i,v = -1; 97: for(i=0;i<w;i++) 98: { if((ch=(*getn)())<0) return(ch); 99: if(ch=='t' && v==-1) v=1; 100: else if(ch=='f' && v==-1) v=0; 101: else if(ch==',') return(0); 102: } 103: if(v==-1) 104: { errno=116; 105: return(1); 106: } 107: *n=v; 108: return(0); 109: } 110: rd_F(p,w,d,len) ftnlen len; ufloat *p; 111: { double x,y; 112: int i,sx,sz,ch,dot,ny,z,sawz; 113: x=y=0; 114: sawz=z=ny=dot=sx=sz=0; 115: for(i=0;i<w;) 116: { i++; 117: if((ch=(*getn)())<0) return(ch); 118: else if(ch == ' ' && !cblank || ch == '+' && x == 0 119: || ch == '\n' && !cblank) continue; 120: else if(ch=='-' && x==0) sx=1; 121: else if(ch == '+' || ch == '-') goto expon; 122: else if(ch<='9' && ch>='0') 123: x=10*x+ch-'0'; 124: else if(ch=='e' || ch=='d' || ch=='.') 125: break; 126: else if(cblank && (ch==' ' || ch== '\n')) x*=10; 127: else if(ch==',') 128: { i=w; 129: break; 130: } 131: else return(errno = 115); 132: } 133: if(ch=='.') dot=1; 134: while(i<w && ch!='e' && ch!='d' && ch!='+' && ch!='-') 135: { i++; 136: if((ch=(*getn)())<0) return(ch); 137: else if(ch<='9' && ch>='0') 138: y=10*y+ch-'0'; 139: else if(cblank && (ch==' ' || ch == '\n')) 140: y *= 10; 141: else if(ch==',') {i=w; break;} 142: else if(ch==' ') continue; 143: else continue; 144: ny++; 145: } 146: expon: 147: if(ch=='-') sz=1; 148: while(i<w) 149: { i++; 150: sawz=1; 151: if((ch=(*getn)())<0) return(ch); 152: else if(ch=='-') sz=1; 153: else if(ch<='9' && ch>='0') 154: z=10*z+ch-'0'; 155: else if(cblank && (ch==' ' || ch == '\n')) 156: z *= 10; 157: else if(ch==',') break; 158: else if(ch==' ') continue; 159: else if(ch=='+') continue; 160: else if(ch!='\n') return(errno=115); 161: } 162: if(!dot) 163: for(i=0;i<d;i++) x /= 10; 164: for(i=0;i<ny;i++) y /= 10; 165: x=x+y; 166: if(sz) 167: for(i=0;i<z;i++) x /=10; 168: else for(i=0;i<z;i++) x *= 10; 169: if(sx) x = -x; 170: if(!sawz) 171: { 172: for(i=scale;i>0;i--) x /= 10; 173: for(i=scale;i<0;i++) x *= 10; 174: } 175: if(len==sizeof(float)) p->pf=x; 176: else p->pd=x; 177: return(0); 178: } 179: rd_A(p,len) char *p; ftnlen len; 180: { int i,ch; 181: for(i=0;i<len;i++) 182: { GET(ch); 183: *p++=VAL(ch); 184: } 185: return(0); 186: } 187: rd_AW(p,w,len) char *p; ftnlen len; 188: { int i,ch; 189: if(w>=len) 190: { for(i=0;i<w-len;i++) 191: GET(ch); 192: for(i=0;i<len;i++) 193: { GET(ch); 194: *p++=VAL(ch); 195: } 196: return(0); 197: } 198: for(i=0;i<w;i++) 199: { GET(ch); 200: *p++=VAL(ch); 201: } 202: for(i=0;i<len-w;i++) *p++=' '; 203: return(0); 204: } 205: rd_H(n,s) char *s; 206: { int i,ch; 207: for(i=0;i<n;i++) 208: if((ch=(*getn)())<0) return(ch); 209: else *s++ = ch=='\n'?' ':ch; 210: return(1); 211: } 212: rd_POS(s) char *s; 213: { char quote; 214: int ch; 215: quote= *s++; 216: for(;*s;s++) 217: if(*s==quote && *(s+1)!=quote) break; 218: else if((ch=(*getn)())<0) return(ch); 219: else *s = ch=='\n'?' ':ch; 220: return(1); 221: }