|
|
1.1 ! root 1: #include "f2c.h" ! 2: #include "fio.h" ! 3: #include "fmt.h" ! 4: #include "fp.h" ! 5: ! 6: extern int f__cursor; ! 7: #ifdef KR_headers ! 8: extern double atof(); ! 9: #else ! 10: #undef abs ! 11: #undef min ! 12: #undef max ! 13: #include "stdlib.h" ! 14: #endif ! 15: ! 16: static int ! 17: #ifdef KR_headers ! 18: rd_Z(n,w,len) Uint *n; ftnlen len; ! 19: #else ! 20: rd_Z(Uint *n, int w, ftnlen len) ! 21: #endif ! 22: { ! 23: long x[9]; ! 24: char *s, *s0, *s1, *se, *t; ! 25: int ch, i, w1, w2; ! 26: static char hex[256]; ! 27: static int one = 1; ! 28: int bad = 0; ! 29: ! 30: if (!hex['0']) { ! 31: s = "0123456789"; ! 32: while(ch = *s++) ! 33: hex[ch] = ch - '0' + 1; ! 34: s = "ABCDEF"; ! 35: while(ch = *s++) ! 36: hex[ch] = hex[ch + 'a' - 'A'] = ch - 'A' + 11; ! 37: } ! 38: s = s0 = (char *)x; ! 39: s1 = (char *)&x[4]; ! 40: se = (char *)&x[8]; ! 41: if (len > 4*sizeof(long)) ! 42: return errno = 117; ! 43: while (w) { ! 44: GET(ch); ! 45: if (ch==',' || ch=='\n') ! 46: break; ! 47: w--; ! 48: if (ch > ' ') { ! 49: if (!hex[ch & 0xff]) ! 50: bad++; ! 51: *s++ = ch; ! 52: if (s == se) { ! 53: /* discard excess characters */ ! 54: for(t = s0, s = s1; t < s1;) ! 55: *t++ = *s++; ! 56: s = s1; ! 57: } ! 58: } ! 59: } ! 60: if (bad) ! 61: return errno = 115; ! 62: w = (int)len; ! 63: w1 = s - s0; ! 64: w2 = w1+1 >> 1; ! 65: t = (char *)n; ! 66: if (*(char *)&one) { ! 67: /* little endian */ ! 68: t += w - 1; ! 69: i = -1; ! 70: } ! 71: else ! 72: i = 1; ! 73: for(; w > w2; t += i, --w) ! 74: *t = 0; ! 75: if (!w) ! 76: return 0; ! 77: if (w < w2) ! 78: s0 = s - (w << 1); ! 79: else if (w1 & 1) { ! 80: *t = hex[*s0++ & 0xff] - 1; ! 81: if (!--w) ! 82: return 0; ! 83: t += i; ! 84: } ! 85: do { ! 86: *t = hex[*s0 & 0xff]-1 << 4 | hex[s0[1] & 0xff]-1; ! 87: t += i; ! 88: s0 += 2; ! 89: } ! 90: while(--w); ! 91: return 0; ! 92: } ! 93: ! 94: static int ! 95: #ifdef KR_headers ! 96: rd_I(n,w,len, base) Uint *n; int w; ftnlen len; register int base; ! 97: #else ! 98: rd_I(Uint *n, int w, ftnlen len, register int base) ! 99: #endif ! 100: { long x; ! 101: int sign,ch; ! 102: char s[84], *ps; ! 103: ps=s; x=0; ! 104: while (w) ! 105: { ! 106: GET(ch); ! 107: if (ch==',' || ch=='\n') break; ! 108: *ps=ch; ps++; w--; ! 109: } ! 110: *ps='\0'; ! 111: ps=s; ! 112: while (*ps==' ') ps++; ! 113: if (*ps=='-') { sign=1; ps++; } ! 114: else { sign=0; if (*ps=='+') ps++; } ! 115: loop: while (*ps>='0' && *ps<='9') { x=x*base+(*ps-'0'); ps++; } ! 116: if (*ps==' ') {if (f__cblank) x *= base; ps++; goto loop;} ! 117: if(sign) x = -x; ! 118: if(len==sizeof(integer)) n->il=x; ! 119: else if(len == sizeof(char)) n->ic = (char)x; ! 120: #ifdef Allow_TYQUAD ! 121: else if (len == sizeof(longint)) n->ili = x; ! 122: #endif ! 123: else n->is = (short)x; ! 124: if (*ps) return(errno=115); else return(0); ! 125: } ! 126: static int ! 127: #ifdef KR_headers ! 128: rd_L(n,w,len) ftnint *n; ftnlen len; ! 129: #else ! 130: rd_L(ftnint *n, int w, ftnlen len) ! 131: #endif ! 132: { int ch, lv; ! 133: char s[84], *ps; ! 134: ps=s; ! 135: while (w) { ! 136: GET(ch); ! 137: if (ch==','||ch=='\n') break; ! 138: *ps=ch; ! 139: ps++; w--; ! 140: } ! 141: *ps='\0'; ! 142: ps=s; while (*ps==' ') ps++; ! 143: if (*ps=='.') ps++; ! 144: if (*ps=='t' || *ps == 'T') ! 145: lv = 1; ! 146: else if (*ps == 'f' || *ps == 'F') ! 147: lv = 0; ! 148: else return(errno=116); ! 149: switch(len) { ! 150: case sizeof(char): *(char *)n = (char)lv; break; ! 151: case sizeof(short): *(short *)n = (short)lv; break; ! 152: default: *n = lv; ! 153: } ! 154: return 0; ! 155: } ! 156: ! 157: #include "ctype.h" ! 158: ! 159: static int ! 160: #ifdef KR_headers ! 161: rd_F(p, w, d, len) ufloat *p; ftnlen len; ! 162: #else ! 163: rd_F(ufloat *p, int w, int d, ftnlen len) ! 164: #endif ! 165: { ! 166: char s[FMAX+EXPMAXDIGS+4]; ! 167: register int ch; ! 168: register char *sp, *spe, *sp1; ! 169: double x; ! 170: int scale1, se; ! 171: long e, exp; ! 172: ! 173: sp1 = sp = s; ! 174: spe = sp + FMAX; ! 175: exp = -d; ! 176: x = 0.; ! 177: ! 178: do { ! 179: GET(ch); ! 180: w--; ! 181: } while (ch == ' ' && w); ! 182: switch(ch) { ! 183: case '-': *sp++ = ch; sp1++; spe++; ! 184: case '+': ! 185: if (!w) goto zero; ! 186: --w; ! 187: GET(ch); ! 188: } ! 189: while(ch == ' ') { ! 190: blankdrop: ! 191: if (!w--) goto zero; GET(ch); } ! 192: while(ch == '0') ! 193: { if (!w--) goto zero; GET(ch); } ! 194: if (ch == ' ' && f__cblank) ! 195: goto blankdrop; ! 196: scale1 = f__scale; ! 197: while(isdigit(ch)) { ! 198: digloop1: ! 199: if (sp < spe) *sp++ = ch; ! 200: else ++exp; ! 201: digloop1e: ! 202: if (!w--) goto done; ! 203: GET(ch); ! 204: } ! 205: if (ch == ' ') { ! 206: if (f__cblank) ! 207: { ch = '0'; goto digloop1; } ! 208: goto digloop1e; ! 209: } ! 210: if (ch == '.') { ! 211: exp += d; ! 212: if (!w--) goto done; ! 213: GET(ch); ! 214: if (sp == sp1) { /* no digits yet */ ! 215: while(ch == '0') { ! 216: skip01: ! 217: --exp; ! 218: skip0: ! 219: if (!w--) goto done; ! 220: GET(ch); ! 221: } ! 222: if (ch == ' ') { ! 223: if (f__cblank) goto skip01; ! 224: goto skip0; ! 225: } ! 226: } ! 227: while(isdigit(ch)) { ! 228: digloop2: ! 229: if (sp < spe) ! 230: { *sp++ = ch; --exp; } ! 231: digloop2e: ! 232: if (!w--) goto done; ! 233: GET(ch); ! 234: } ! 235: if (ch == ' ') { ! 236: if (f__cblank) ! 237: { ch = '0'; goto digloop2; } ! 238: goto digloop2e; ! 239: } ! 240: } ! 241: switch(ch) { ! 242: default: ! 243: break; ! 244: case '-': se = 1; goto signonly; ! 245: case '+': se = 0; goto signonly; ! 246: case 'e': ! 247: case 'E': ! 248: case 'd': ! 249: case 'D': ! 250: if (!w--) ! 251: goto bad; ! 252: GET(ch); ! 253: while(ch == ' ') { ! 254: if (!w--) ! 255: goto bad; ! 256: GET(ch); ! 257: } ! 258: se = 0; ! 259: switch(ch) { ! 260: case '-': se = 1; ! 261: case '+': ! 262: signonly: ! 263: if (!w--) ! 264: goto bad; ! 265: GET(ch); ! 266: } ! 267: while(ch == ' ') { ! 268: if (!w--) ! 269: goto bad; ! 270: GET(ch); ! 271: } ! 272: if (!isdigit(ch)) ! 273: goto bad; ! 274: ! 275: e = ch - '0'; ! 276: for(;;) { ! 277: if (!w--) ! 278: { ch = '\n'; break; } ! 279: GET(ch); ! 280: if (!isdigit(ch)) { ! 281: if (ch == ' ') { ! 282: if (f__cblank) ! 283: ch = '0'; ! 284: else continue; ! 285: } ! 286: else ! 287: break; ! 288: } ! 289: e = 10*e + ch - '0'; ! 290: if (e > EXPMAX && sp > sp1) ! 291: goto bad; ! 292: } ! 293: if (se) ! 294: exp -= e; ! 295: else ! 296: exp += e; ! 297: scale1 = 0; ! 298: } ! 299: switch(ch) { ! 300: case '\n': ! 301: case ',': ! 302: break; ! 303: default: ! 304: bad: ! 305: return (errno = 115); ! 306: } ! 307: done: ! 308: if (sp > sp1) { ! 309: while(*--sp == '0') ! 310: ++exp; ! 311: if (exp -= scale1) ! 312: sprintf(sp+1, "e%ld", exp); ! 313: else ! 314: sp[1] = 0; ! 315: x = atof(s); ! 316: } ! 317: zero: ! 318: if (len == sizeof(real)) ! 319: p->pf = x; ! 320: else ! 321: p->pd = x; ! 322: return(0); ! 323: } ! 324: ! 325: ! 326: static int ! 327: #ifdef KR_headers ! 328: rd_A(p,len) char *p; ftnlen len; ! 329: #else ! 330: rd_A(char *p, ftnlen len) ! 331: #endif ! 332: { int i,ch; ! 333: for(i=0;i<len;i++) ! 334: { GET(ch); ! 335: *p++=VAL(ch); ! 336: } ! 337: return(0); ! 338: } ! 339: static int ! 340: #ifdef KR_headers ! 341: rd_AW(p,w,len) char *p; ftnlen len; ! 342: #else ! 343: rd_AW(char *p, int w, ftnlen len) ! 344: #endif ! 345: { int i,ch; ! 346: if(w>=len) ! 347: { for(i=0;i<w-len;i++) ! 348: GET(ch); ! 349: for(i=0;i<len;i++) ! 350: { GET(ch); ! 351: *p++=VAL(ch); ! 352: } ! 353: return(0); ! 354: } ! 355: for(i=0;i<w;i++) ! 356: { GET(ch); ! 357: *p++=VAL(ch); ! 358: } ! 359: for(i=0;i<len-w;i++) *p++=' '; ! 360: return(0); ! 361: } ! 362: static int ! 363: #ifdef KR_headers ! 364: rd_H(n,s) char *s; ! 365: #else ! 366: rd_H(int n, char *s) ! 367: #endif ! 368: { int i,ch; ! 369: for(i=0;i<n;i++) ! 370: if((ch=(*f__getn)())<0) return(ch); ! 371: else *s++ = ch=='\n'?' ':ch; ! 372: return(1); ! 373: } ! 374: static int ! 375: #ifdef KR_headers ! 376: rd_POS(s) char *s; ! 377: #else ! 378: rd_POS(char *s) ! 379: #endif ! 380: { char quote; ! 381: int ch; ! 382: quote= *s++; ! 383: for(;*s;s++) ! 384: if(*s==quote && *(s+1)!=quote) break; ! 385: else if((ch=(*f__getn)())<0) return(ch); ! 386: else *s = ch=='\n'?' ':ch; ! 387: return(1); ! 388: } ! 389: #ifdef KR_headers ! 390: rd_ed(p,ptr,len) struct f__syl *p; char *ptr; ftnlen len; ! 391: #else ! 392: rd_ed(struct f__syl *p, char *ptr, ftnlen len) ! 393: #endif ! 394: { int ch; ! 395: for(;f__cursor>0;f__cursor--) if((ch=(*f__getn)())<0) return(ch); ! 396: if(f__cursor<0) ! 397: { if(f__recpos+f__cursor < 0) /*err(elist->cierr,110,"fmt")*/ ! 398: f__cursor = -f__recpos; /* is this in the standard? */ ! 399: if(f__external == 0) { ! 400: extern char *f__icptr; ! 401: f__icptr += f__cursor; ! 402: } ! 403: else if(f__curunit && f__curunit->useek) ! 404: (void) fseek(f__cf,(long) f__cursor,SEEK_CUR); ! 405: else ! 406: err(f__elist->cierr,106,"fmt"); ! 407: f__recpos += f__cursor; ! 408: f__cursor=0; ! 409: } ! 410: switch(p->op) ! 411: { ! 412: default: fprintf(stderr,"rd_ed, unexpected code: %d\n", p->op); ! 413: sig_die(f__fmtbuf, 1); ! 414: case IM: ! 415: case I: ch = rd_I((Uint *)ptr,p->p1,len, 10); ! 416: break; ! 417: ! 418: /* O and OM don't work right for character, double, complex, */ ! 419: /* or doublecomplex, and they differ from Fortran 90 in */ ! 420: /* showing a minus sign for negative values. */ ! 421: ! 422: case OM: ! 423: case O: ch = rd_I((Uint *)ptr, p->p1, len, 8); ! 424: break; ! 425: case L: ch = rd_L((ftnint *)ptr,p->p1,len); ! 426: break; ! 427: case A: ch = rd_A(ptr,len); ! 428: break; ! 429: case AW: ! 430: ch = rd_AW(ptr,p->p1,len); ! 431: break; ! 432: case E: case EE: ! 433: case D: ! 434: case G: ! 435: case GE: ! 436: case F: ch = rd_F((ufloat *)ptr,p->p1,p->p2,len); ! 437: break; ! 438: ! 439: /* Z and ZM assume 8-bit bytes. */ ! 440: ! 441: case ZM: ! 442: case Z: ! 443: ch = rd_Z((Uint *)ptr, p->p1, len); ! 444: break; ! 445: } ! 446: if(ch == 0) return(ch); ! 447: else if(ch == EOF) return(EOF); ! 448: if (f__cf) ! 449: clearerr(f__cf); ! 450: return(errno); ! 451: } ! 452: #ifdef KR_headers ! 453: rd_ned(p) struct f__syl *p; ! 454: #else ! 455: rd_ned(struct f__syl *p) ! 456: #endif ! 457: { ! 458: switch(p->op) ! 459: { ! 460: default: fprintf(stderr,"rd_ned, unexpected code: %d\n", p->op); ! 461: sig_die(f__fmtbuf, 1); ! 462: case APOS: ! 463: return(rd_POS(*(char **)&p->p2)); ! 464: case H: return(rd_H(p->p1,*(char **)&p->p2)); ! 465: case SLASH: return((*f__donewrec)()); ! 466: case TR: ! 467: case X: f__cursor += p->p1; ! 468: return(1); ! 469: case T: f__cursor=p->p1-f__recpos - 1; ! 470: return(1); ! 471: case TL: f__cursor -= p->p1; ! 472: if(f__cursor < -f__recpos) /* TL1000, 1X */ ! 473: f__cursor = -f__recpos; ! 474: return(1); ! 475: } ! 476: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.