|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)rdfmt.c 5.1 6/7/85 ! 7: */ ! 8: ! 9: /* ! 10: * formatted read routines ! 11: */ ! 12: ! 13: #include "fio.h" ! 14: #include "format.h" ! 15: ! 16: extern char *s_init; ! 17: extern int low_case[256]; ! 18: extern int used_data; ! 19: ! 20: rd_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len; ! 21: { int n; ! 22: if(cursor && (n=rd_mvcur())) return(n); ! 23: switch(p->op) ! 24: { ! 25: case I: ! 26: case IM: ! 27: n = (rd_I(ptr,p->p1,len)); ! 28: break; ! 29: case L: ! 30: n = (rd_L(ptr,p->p1,len)); ! 31: break; ! 32: case A: ! 33: n = (rd_AW(ptr,len,len)); ! 34: break; ! 35: case AW: ! 36: n = (rd_AW(ptr,p->p1,len)); ! 37: break; ! 38: case E: ! 39: case EE: ! 40: case D: ! 41: case DE: ! 42: case G: ! 43: case GE: ! 44: case F: ! 45: n = (rd_F(ptr,p->p1,p->p2,len)); ! 46: break; ! 47: default: ! 48: return(errno=F_ERFMT); ! 49: } ! 50: if (n < 0) ! 51: { ! 52: if(feof(cf)) return(EOF); ! 53: n = errno; ! 54: clearerr(cf); ! 55: } ! 56: return(n); ! 57: } ! 58: ! 59: rd_ned(p,ptr) char *ptr; struct syl *p; ! 60: { ! 61: switch(p->op) ! 62: { ! 63: #ifndef KOSHER ! 64: case APOS: /* NOT STANDARD F77 */ ! 65: return(rd_POS(&s_init[p->p1])); ! 66: case H: /* NOT STANDARD F77 */ ! 67: return(rd_H(p->p1,&s_init[p->p2])); ! 68: #endif ! 69: case SLASH: ! 70: return((*donewrec)()); ! 71: case TR: ! 72: case X: ! 73: cursor += p->p1; ! 74: /* tab = (p->op==TR); This voids '..,tl6,1x,..' sequences */ ! 75: tab = YES; ! 76: return(OK); ! 77: case T: ! 78: if(p->p1) cursor = p->p1 - recpos - 1; ! 79: #ifndef KOSHER ! 80: else cursor = 8*p->p2 - recpos%8; /* NOT STANDARD FORT */ ! 81: #endif ! 82: tab = YES; ! 83: return(OK); ! 84: case TL: ! 85: cursor -= p->p1; ! 86: if ((recpos + cursor) < 0) cursor = -recpos; /* ANSI req'd */ ! 87: tab = YES; ! 88: return(OK); ! 89: default: ! 90: return(errno=F_ERFMT); ! 91: } ! 92: } ! 93: ! 94: LOCAL ! 95: rd_mvcur() ! 96: { int n; ! 97: if(tab) return((*dotab)()); ! 98: if (cursor < 0) return(errno=F_ERSEEK); ! 99: while(cursor--) if((n=(*getn)()) < 0) return(n); ! 100: return(cursor=0); ! 101: } ! 102: ! 103: LOCAL ! 104: rd_I(n,w,len) ftnlen len; uint *n; ! 105: { long x=0; ! 106: int i,sign=0,ch,c,sign_ok=YES; ! 107: for(i=0;i<w;i++) ! 108: { ! 109: if((ch=(*getn)())<0) return(ch); ! 110: switch(ch) ! 111: { ! 112: case ',': goto done; ! 113: case '-': sign=1; /* and fall thru */ ! 114: case '+': if(sign_ok == NO) return(errno=F_ERRICHR); ! 115: sign_ok = NO; ! 116: break; ! 117: case ' ': ! 118: if(cblank) x *= radix; ! 119: break; ! 120: case '\n': if(cblank) { ! 121: x *= radix; ! 122: break; ! 123: } else { ! 124: goto done; ! 125: } ! 126: default: ! 127: sign_ok = NO; ! 128: if( (c = ch-'0')>=0 && c<radix ) ! 129: { x = (x * radix) + c; ! 130: break; ! 131: } ! 132: else if( (c = low_case[ch]-'a'+10)>=0 && c<radix ) ! 133: { x = (x * radix) + c; ! 134: break; ! 135: } ! 136: return(errno=F_ERRICHR); ! 137: } ! 138: } ! 139: done: ! 140: if(sign) x = -x; ! 141: if(len==sizeof(short)) n->is=x; ! 142: else n->il=x; ! 143: return(OK); ! 144: } ! 145: ! 146: LOCAL ! 147: rd_L(n,w,len) uint *n; ftnlen len; ! 148: { int ch,i,v = -1, period=0; ! 149: for(i=0;i<w;i++) ! 150: { if((ch=(*getn)()) < 0) return(ch); ! 151: if((ch=low_case[ch])=='t' && v==-1) v=1; ! 152: else if(ch=='f' && v==-1) v=0; ! 153: else if(ch=='.' && !period) period++; ! 154: else if(ch==' ' || ch=='\t') ; ! 155: else if(ch==',') break; ! 156: else if(v==-1) return(errno=F_ERLOGIF); ! 157: } ! 158: if(v==-1) return(errno=F_ERLOGIF); ! 159: if(len==sizeof(short)) n->is=v; ! 160: else n->il=v; ! 161: return(OK); ! 162: } ! 163: ! 164: LOCAL ! 165: rd_F(p,w,d,len) ftnlen len; ufloat *p; ! 166: { double x,y; ! 167: int i,sx,sz,ch,dot,ny,z,sawz,mode, sign_ok=YES; ! 168: x=y=0; ! 169: sawz=z=ny=dot=sx=sz=0; ! 170: /* modes: 0 in initial blanks, ! 171: 2 blanks plus sign ! 172: 3 found a digit ! 173: */ ! 174: mode = 0; ! 175: ! 176: for(i=0;i<w;) ! 177: { i++; ! 178: if((ch=(*getn)())<0) return(ch); ! 179: ! 180: if(ch==' ') { /* blank */ ! 181: if(cblank && (mode==2)) x *= 10; ! 182: } else if(ch<='9' && ch>='0') { /* digit */ ! 183: mode = 2; ! 184: x=10*x+ch-'0'; ! 185: } else if(ch=='.') { ! 186: break; ! 187: } else if(ch=='e' || ch=='d' || ch=='E' || ch=='D') { ! 188: goto exponent; ! 189: } else if(ch=='+' || ch=='-') { ! 190: if(mode==0) { /* sign before digits */ ! 191: if(ch=='-') sx=1; ! 192: mode = 1; ! 193: } else if(mode==1) { /* two signs before digits */ ! 194: return(errno=F_ERRFCHR); ! 195: } else { /* sign after digits, weird but standard! ! 196: means exponent without 'e' or 'd' */ ! 197: goto exponent; ! 198: } ! 199: } else if(ch==',') { ! 200: goto done; ! 201: } else if(ch=='\n') { ! 202: if(cblank && (mode==2)) x *= 10; ! 203: } else { ! 204: return(errno=F_ERRFCHR); ! 205: } ! 206: } ! 207: /* get here if out of characters to scan or found a period */ ! 208: if(ch=='.') dot=1; ! 209: while(i<w) ! 210: { i++; ! 211: if((ch=(*getn)())<0) return(ch); ! 212: ! 213: if(ch<='9' && ch>='0') { ! 214: y=10*y+ch-'0'; ! 215: ny++; ! 216: } else if(ch==' ' || ch=='\n') { ! 217: if(cblank) { ! 218: y*= 10; ! 219: ny++; ! 220: } ! 221: } else if(ch==',') { ! 222: goto done; ! 223: } else if(ch=='d' || ch=='e' || ch=='+' || ch=='-' || ch=='D' || ch=='E') { ! 224: break; ! 225: } else { ! 226: return(errno=F_ERRFCHR); ! 227: } ! 228: } ! 229: /* now for the exponent. ! 230: * mode=3 means seen digit or sign of exponent. ! 231: * either out of characters to scan or ! 232: * ch is '+', '-', 'd', or 'e'. ! 233: */ ! 234: exponent: ! 235: if(ch=='-' || ch=='+') { ! 236: if(ch=='-') sz=1; ! 237: mode = 3; ! 238: } else { ! 239: mode = 2; ! 240: } ! 241: ! 242: while(i<w) ! 243: { i++; ! 244: sawz=1; ! 245: if((ch=(*getn)())<0) return(ch); ! 246: ! 247: if(ch<='9' && ch>='0') { ! 248: mode = 3; ! 249: z=10*z+ch-'0'; ! 250: } else if(ch=='+' || ch=='-') { ! 251: if(mode==3 ) return(errno=F_ERRFCHR); ! 252: mode = 3; ! 253: if(ch=='-') sz=1; ! 254: } else if(ch == ' ' || ch=='\n') { ! 255: if(cblank) z *=10; ! 256: } else if(ch==',') { ! 257: break; ! 258: } else { ! 259: return(errno=F_ERRFCHR); ! 260: } ! 261: } ! 262: done: ! 263: if(!dot) ! 264: for(i=0;i<d;i++) x /= 10; ! 265: for(i=0;i<ny;i++) y /= 10; ! 266: x=x+y; ! 267: if(sz) ! 268: for(i=0;i<z;i++) x /=10; ! 269: else for(i=0;i<z;i++) x *= 10; ! 270: if(sx) x = -x; ! 271: if(!sawz) ! 272: { ! 273: for(i=scale;i>0;i--) x /= 10; ! 274: for(i=scale;i<0;i++) x *= 10; ! 275: } ! 276: if(len==sizeof(float)) p->pf=x; ! 277: else p->pd=x; ! 278: return(OK); ! 279: } ! 280: ! 281: LOCAL ! 282: rd_AW(p,w,len) char *p; ftnlen len; ! 283: { int i,ch; ! 284: if(w >= len) ! 285: { ! 286: for(i=0;i<w-len;i++) GET(ch); ! 287: for(i=0;i<len;i++) ! 288: { GET(ch); ! 289: *p++=VAL(ch); ! 290: } ! 291: } ! 292: else ! 293: { ! 294: for(i=0;i<w;i++) ! 295: { GET(ch); ! 296: *p++=VAL(ch); ! 297: } ! 298: for(i=0;i<len-w;i++) *p++=' '; ! 299: } ! 300: return(OK); ! 301: } ! 302: ! 303: /* THIS IS NOT ALLOWED IN THE NEW STANDARD 'CAUSE IT'S WEIRD */ ! 304: LOCAL ! 305: rd_H(n,s) char *s; ! 306: { int i,ch = 0; ! 307: ! 308: used_data = YES; ! 309: for(i=0;i<n;i++) ! 310: { if (ch != '\n') ! 311: GET(ch); ! 312: if (ch == '\n') ! 313: *s++ = ' '; ! 314: else ! 315: *s++ = ch; ! 316: } ! 317: return(OK); ! 318: } ! 319: ! 320: LOCAL ! 321: rd_POS(s) char *s; ! 322: { char quote; ! 323: int ch = 0; ! 324: ! 325: used_data = YES; ! 326: quote = *s++; ! 327: while(*s) ! 328: { if(*s==quote && *(s+1)!=quote) ! 329: break; ! 330: if (ch != '\n') ! 331: GET(ch); ! 332: if (ch == '\n') ! 333: *s++ = ' '; ! 334: else ! 335: *s++ = ch; ! 336: } ! 337: return(OK); ! 338: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.