|
|
1.1 ! root 1: #include "f2c.h" ! 2: #include "fio.h" ! 3: #include "fmt.h" ! 4: #include "lio.h" ! 5: #include "ctype.h" ! 6: #include "fp.h" ! 7: ! 8: extern char *f__fmtbuf; ! 9: #ifdef KR_headers ! 10: extern double atof(); ! 11: extern char *malloc(), *realloc(); ! 12: int (*f__lioproc)(), (*l_getc)(), (*l_ungetc)(); ! 13: #else ! 14: #undef abs ! 15: #undef min ! 16: #undef max ! 17: #include "stdlib.h" ! 18: int (*f__lioproc)(ftnint*, char*, ftnlen, ftnint), (*l_getc)(void), ! 19: (*l_ungetc)(int,FILE*); ! 20: #endif ! 21: int l_eof; ! 22: ! 23: #define isblnk(x) (f__ltab[x+1]&B) ! 24: #define issep(x) (f__ltab[x+1]&SX) ! 25: #define isapos(x) (f__ltab[x+1]&AX) ! 26: #define isexp(x) (f__ltab[x+1]&EX) ! 27: #define issign(x) (f__ltab[x+1]&SG) ! 28: #define iswhit(x) (f__ltab[x+1]&WH) ! 29: #define SX 1 ! 30: #define B 2 ! 31: #define AX 4 ! 32: #define EX 8 ! 33: #define SG 16 ! 34: #define WH 32 ! 35: char f__ltab[128+1] = { /* offset one for EOF */ ! 36: 0, ! 37: 0,0,AX,0,0,0,0,0,0,WH|B,SX|WH,0,0,0,0,0, ! 38: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ! 39: SX|B|WH,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX, ! 40: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ! 41: 0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0, ! 42: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ! 43: AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0, ! 44: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ! 45: }; ! 46: ! 47: #ifdef ungetc ! 48: static int ! 49: #ifdef KR_headers ! 50: un_getc(x,f__cf) int x; FILE *f__cf; ! 51: #else ! 52: un_getc(int x, FILE *f__cf) ! 53: #endif ! 54: { return ungetc(x,f__cf); } ! 55: #else ! 56: #define un_getc ungetc ! 57: #ifdef KR_headers ! 58: extern int ungetc(); ! 59: #endif ! 60: #endif ! 61: ! 62: t_getc(Void) ! 63: { int ch; ! 64: if(f__curunit->uend) return(EOF); ! 65: if((ch=getc(f__cf))!=EOF) return(ch); ! 66: if(feof(f__cf)) ! 67: l_eof = f__curunit->uend = 1; ! 68: return(EOF); ! 69: } ! 70: integer e_rsle(Void) ! 71: { ! 72: int ch; ! 73: if(f__curunit->uend) return(0); ! 74: while((ch=t_getc())!='\n' && ch!=EOF); ! 75: return(0); ! 76: } ! 77: ! 78: flag f__lquit; ! 79: int f__lcount,f__ltype,nml_read; ! 80: char *f__lchar; ! 81: double f__lx,f__ly; ! 82: #define ERR(x) if(n=(x)) return(n) ! 83: #define GETC(x) (x=(*l_getc)()) ! 84: #define Ungetc(x,y) (*l_ungetc)(x,y) ! 85: ! 86: #ifdef KR_headers ! 87: l_R(poststar) int poststar; ! 88: #else ! 89: l_R(int poststar) ! 90: #endif ! 91: { ! 92: char s[FMAX+EXPMAXDIGS+4]; ! 93: register int ch; ! 94: register char *sp, *spe, *sp1; ! 95: long e, exp; ! 96: int havenum, havestar, se; ! 97: ! 98: if (!poststar) { ! 99: if (f__lcount > 0) ! 100: return(0); ! 101: f__lcount = 1; ! 102: } ! 103: f__ltype = 0; ! 104: exp = 0; ! 105: havestar = 0; ! 106: retry: ! 107: sp1 = sp = s; ! 108: spe = sp + FMAX; ! 109: havenum = 0; ! 110: ! 111: switch(GETC(ch)) { ! 112: case '-': *sp++ = ch; sp1++; spe++; ! 113: case '+': ! 114: GETC(ch); ! 115: } ! 116: while(ch == '0') { ! 117: ++havenum; ! 118: GETC(ch); ! 119: } ! 120: while(isdigit(ch)) { ! 121: if (sp < spe) *sp++ = ch; ! 122: else ++exp; ! 123: GETC(ch); ! 124: } ! 125: if (ch == '*' && !poststar) { ! 126: if (sp == sp1 || exp || *s == '-') { ! 127: err(f__elist->cierr,112,"bad repetition count") ! 128: } ! 129: poststar = havestar = 1; ! 130: *sp = 0; ! 131: f__lcount = atoi(s); ! 132: goto retry; ! 133: } ! 134: if (ch == '.') { ! 135: GETC(ch); ! 136: if (sp == sp1) ! 137: while(ch == '0') { ! 138: ++havenum; ! 139: --exp; ! 140: GETC(ch); ! 141: } ! 142: while(isdigit(ch)) { ! 143: if (sp < spe) ! 144: { *sp++ = ch; --exp; } ! 145: GETC(ch); ! 146: } ! 147: } ! 148: se = 0; ! 149: if (issign(ch)) ! 150: goto signonly; ! 151: if (isexp(ch)) { ! 152: GETC(ch); ! 153: if (issign(ch)) { ! 154: signonly: ! 155: if (ch == '-') se = 1; ! 156: GETC(ch); ! 157: } ! 158: if (!isdigit(ch)) { ! 159: bad: ! 160: err(f__elist->cierr,112,"exponent field") ! 161: } ! 162: ! 163: e = ch - '0'; ! 164: while(isdigit(GETC(ch))) { ! 165: e = 10*e + ch - '0'; ! 166: if (e > EXPMAX) ! 167: goto bad; ! 168: } ! 169: if (se) ! 170: exp -= e; ! 171: else ! 172: exp += e; ! 173: } ! 174: (void) Ungetc(ch, f__cf); ! 175: if (sp > sp1) { ! 176: ++havenum; ! 177: while(*--sp == '0') ! 178: ++exp; ! 179: if (exp) ! 180: sprintf(sp+1, "e%ld", exp); ! 181: else ! 182: sp[1] = 0; ! 183: f__lx = atof(s); ! 184: } ! 185: else ! 186: f__lx = 0.; ! 187: if (havenum) ! 188: f__ltype = TYLONG; ! 189: else ! 190: switch(ch) { ! 191: case ',': ! 192: case '/': ! 193: break; ! 194: default: ! 195: if (havestar && ( ch == ' ' ! 196: ||ch == '\t' ! 197: ||ch == '\n')) ! 198: break; ! 199: if (nml_read > 1) { ! 200: f__lquit = 2; ! 201: return 0; ! 202: } ! 203: err(f__elist->cierr,112,"invalid number") ! 204: } ! 205: return 0; ! 206: } ! 207: ! 208: static int ! 209: #ifdef KR_headers ! 210: rd_count(ch) register int ch; ! 211: #else ! 212: rd_count(register int ch) ! 213: #endif ! 214: { ! 215: if (ch < '0' || ch > '9') ! 216: return 1; ! 217: f__lcount = ch - '0'; ! 218: while(GETC(ch) >= '0' && ch <= '9') ! 219: f__lcount = 10*f__lcount + ch - '0'; ! 220: Ungetc(ch,f__cf); ! 221: return f__lcount <= 0; ! 222: } ! 223: ! 224: l_C(Void) ! 225: { int ch, nml_save; ! 226: double lz; ! 227: if(f__lcount>0) return(0); ! 228: f__ltype=0; ! 229: GETC(ch); ! 230: if(ch!='(') ! 231: { ! 232: if (nml_read > 1 && (ch < '0' || ch > '9')) { ! 233: Ungetc(ch,f__cf); ! 234: f__lquit = 2; ! 235: return 0; ! 236: } ! 237: if (rd_count(ch)) ! 238: if(!f__cf || !feof(f__cf)) ! 239: err(f__elist->cierr,112,"complex format") ! 240: else ! 241: err(f__elist->cierr,(EOF),"lread"); ! 242: if(GETC(ch)!='*') ! 243: { ! 244: if(!f__cf || !feof(f__cf)) ! 245: err(f__elist->cierr,112,"no star") ! 246: else ! 247: err(f__elist->cierr,(EOF),"lread"); ! 248: } ! 249: if(GETC(ch)!='(') ! 250: { Ungetc(ch,f__cf); ! 251: return(0); ! 252: } ! 253: } ! 254: else ! 255: f__lcount = 1; ! 256: while(iswhit(GETC(ch))); ! 257: Ungetc(ch,f__cf); ! 258: nml_save = nml_read; ! 259: nml_read = 0; ! 260: if (ch = l_R(1)) ! 261: return ch; ! 262: if (!f__ltype) ! 263: err(f__elist->cierr,112,"no real part"); ! 264: lz = f__lx; ! 265: while(iswhit(GETC(ch))); ! 266: if(ch!=',') ! 267: { (void) Ungetc(ch,f__cf); ! 268: err(f__elist->cierr,112,"no comma"); ! 269: } ! 270: while(iswhit(GETC(ch))); ! 271: (void) Ungetc(ch,f__cf); ! 272: if (ch = l_R(1)) ! 273: return ch; ! 274: if (!f__ltype) ! 275: err(f__elist->cierr,112,"no imaginary part"); ! 276: while(iswhit(GETC(ch))); ! 277: if(ch!=')') err(f__elist->cierr,112,"no )"); ! 278: f__ly = f__lx; ! 279: f__lx = lz; ! 280: nml_read = nml_save; ! 281: return(0); ! 282: } ! 283: l_L(Void) ! 284: { ! 285: int ch; ! 286: if(f__lcount>0) return(0); ! 287: f__ltype=0; ! 288: GETC(ch); ! 289: if(isdigit(ch)) ! 290: { ! 291: rd_count(ch); ! 292: if(GETC(ch)!='*') ! 293: if(!f__cf || !feof(f__cf)) ! 294: err(f__elist->cierr,112,"no star") ! 295: else ! 296: err(f__elist->cierr,(EOF),"lread"); ! 297: GETC(ch); ! 298: } ! 299: if(ch == '.') GETC(ch); ! 300: switch(ch) ! 301: { ! 302: case 't': ! 303: case 'T': ! 304: f__lx=1; ! 305: break; ! 306: case 'f': ! 307: case 'F': ! 308: f__lx=0; ! 309: break; ! 310: default: ! 311: if(isblnk(ch) || issep(ch) || ch==EOF) ! 312: { (void) Ungetc(ch,f__cf); ! 313: return(0); ! 314: } ! 315: else err(f__elist->cierr,112,"logical"); ! 316: } ! 317: f__ltype=TYLONG; ! 318: f__lcount = 1; ! 319: while(!issep(GETC(ch)) && ch!=EOF); ! 320: (void) Ungetc(ch, f__cf); ! 321: return(0); ! 322: } ! 323: #define BUFSIZE 128 ! 324: l_CHAR(Void) ! 325: { int ch,size,i; ! 326: char quote,*p; ! 327: if(f__lcount>0) return(0); ! 328: f__ltype=0; ! 329: if(f__lchar!=NULL) free(f__lchar); ! 330: size=BUFSIZE; ! 331: p=f__lchar=malloc((unsigned int)size); ! 332: if(f__lchar==NULL) err(f__elist->cierr,113,"no space"); ! 333: ! 334: GETC(ch); ! 335: if(isdigit(ch)) { ! 336: /* allow Fortran 8x-style unquoted string... */ ! 337: /* either find a repetition count or the string */ ! 338: f__lcount = ch - '0'; ! 339: *p++ = ch; ! 340: for(i = 1;;) { ! 341: switch(GETC(ch)) { ! 342: case '*': ! 343: if (f__lcount == 0) { ! 344: f__lcount = 1; ! 345: goto noquote; ! 346: } ! 347: p = f__lchar; ! 348: goto have_lcount; ! 349: case ',': ! 350: case ' ': ! 351: case '\t': ! 352: case '\n': ! 353: case '/': ! 354: Ungetc(ch,f__cf); ! 355: /* no break */ ! 356: case EOF: ! 357: f__lcount = 1; ! 358: f__ltype = TYCHAR; ! 359: return *p = 0; ! 360: } ! 361: if (!isdigit(ch)) { ! 362: f__lcount = 1; ! 363: goto noquote; ! 364: } ! 365: *p++ = ch; ! 366: f__lcount = 10*f__lcount + ch - '0'; ! 367: if (++i == size) { ! 368: f__lchar = realloc(f__lchar, ! 369: (unsigned int)(size += BUFSIZE)); ! 370: p = f__lchar + i; ! 371: } ! 372: } ! 373: } ! 374: else (void) Ungetc(ch,f__cf); ! 375: have_lcount: ! 376: if(GETC(ch)=='\'' || ch=='"') quote=ch; ! 377: else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF) ! 378: { (void) Ungetc(ch,f__cf); ! 379: return(0); ! 380: } ! 381: else { ! 382: /* Fortran 8x-style unquoted string */ ! 383: *p++ = ch; ! 384: for(i = 1;;) { ! 385: switch(GETC(ch)) { ! 386: case ',': ! 387: case ' ': ! 388: case '\t': ! 389: case '\n': ! 390: case '/': ! 391: Ungetc(ch,f__cf); ! 392: /* no break */ ! 393: case EOF: ! 394: f__ltype = TYCHAR; ! 395: return *p = 0; ! 396: } ! 397: noquote: ! 398: *p++ = ch; ! 399: if (++i == size) { ! 400: f__lchar = realloc(f__lchar, ! 401: (unsigned int)(size += BUFSIZE)); ! 402: p = f__lchar + i; ! 403: } ! 404: } ! 405: } ! 406: f__ltype=TYCHAR; ! 407: for(i=0;;) ! 408: { while(GETC(ch)!=quote && ch!='\n' ! 409: && ch!=EOF && ++i<size) *p++ = ch; ! 410: if(i==size) ! 411: { ! 412: newone: ! 413: f__lchar= realloc(f__lchar, (unsigned int)(size += BUFSIZE)); ! 414: p=f__lchar+i-1; ! 415: *p++ = ch; ! 416: } ! 417: else if(ch==EOF) return(EOF); ! 418: else if(ch=='\n') ! 419: { if(*(p-1) != '\\') continue; ! 420: i--; ! 421: p--; ! 422: if(++i<size) *p++ = ch; ! 423: else goto newone; ! 424: } ! 425: else if(GETC(ch)==quote) ! 426: { if(++i<size) *p++ = ch; ! 427: else goto newone; ! 428: } ! 429: else ! 430: { (void) Ungetc(ch,f__cf); ! 431: *p = 0; ! 432: return(0); ! 433: } ! 434: } ! 435: } ! 436: #ifdef KR_headers ! 437: c_le(a) cilist *a; ! 438: #else ! 439: c_le(cilist *a) ! 440: #endif ! 441: { ! 442: f__fmtbuf="list io"; ! 443: if(a->ciunit>=MXUNIT || a->ciunit<0) ! 444: err(a->cierr,101,"stler"); ! 445: f__scale=f__recpos=0; ! 446: f__elist=a; ! 447: f__curunit = &f__units[a->ciunit]; ! 448: if(f__curunit->ufd==NULL && fk_open(SEQ,FMT,a->ciunit)) ! 449: err(a->cierr,102,"lio"); ! 450: f__cf=f__curunit->ufd; ! 451: if(!f__curunit->ufmt) err(a->cierr,103,"lio") ! 452: return(0); ! 453: } ! 454: #ifdef KR_headers ! 455: l_read(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len; ! 456: #else ! 457: l_read(ftnint *number, char *ptr, ftnlen len, ftnint type) ! 458: #endif ! 459: { ! 460: #define Ptr ((flex *)ptr) ! 461: int i,n,ch; ! 462: doublereal *yy; ! 463: real *xx; ! 464: for(i=0;i<*number;i++) ! 465: { ! 466: if(f__lquit) return(0); ! 467: if(l_eof) ! 468: err(f__elist->ciend, EOF, "list in") ! 469: if(f__lcount == 0) { ! 470: f__ltype = 0; ! 471: for(;;) { ! 472: GETC(ch); ! 473: switch(ch) { ! 474: case EOF: ! 475: goto loopend; ! 476: case ' ': ! 477: case '\t': ! 478: case '\n': ! 479: continue; ! 480: case '/': ! 481: f__lquit = 1; ! 482: goto loopend; ! 483: case ',': ! 484: f__lcount = 1; ! 485: goto loopend; ! 486: default: ! 487: (void) Ungetc(ch, f__cf); ! 488: goto rddata; ! 489: } ! 490: } ! 491: } ! 492: rddata: ! 493: switch((int)type) ! 494: { ! 495: case TYINT1: ! 496: case TYSHORT: ! 497: case TYLONG: ! 498: #ifdef TYQUAD ! 499: case TYQUAD: ! 500: #endif ! 501: case TYREAL: ! 502: case TYDREAL: ! 503: ERR(l_R(0)); ! 504: break; ! 505: case TYCOMPLEX: ! 506: case TYDCOMPLEX: ! 507: ERR(l_C()); ! 508: break; ! 509: case TYLOGICAL1: ! 510: case TYLOGICAL2: ! 511: case TYLOGICAL: ! 512: ERR(l_L()); ! 513: break; ! 514: case TYCHAR: ! 515: ERR(l_CHAR()); ! 516: break; ! 517: } ! 518: while (GETC(ch) == ' ' || ch == '\t'); ! 519: if (ch != ',' || f__lcount > 1) ! 520: Ungetc(ch,f__cf); ! 521: loopend: ! 522: if(f__lquit) return(0); ! 523: if(f__cf) { ! 524: if (feof(f__cf)) ! 525: err(f__elist->ciend,(EOF),"list in") ! 526: else if(ferror(f__cf)) { ! 527: clearerr(f__cf); ! 528: err(f__elist->cierr,errno,"list in") ! 529: } ! 530: } ! 531: if(f__ltype==0) goto bump; ! 532: switch((int)type) ! 533: { ! 534: case TYINT1: ! 535: case TYLOGICAL1: ! 536: Ptr->flchar = f__lx; ! 537: break; ! 538: case TYLOGICAL2: ! 539: case TYSHORT: ! 540: Ptr->flshort=f__lx; ! 541: break; ! 542: case TYLOGICAL: ! 543: case TYLONG: ! 544: Ptr->flint=f__lx; ! 545: break; ! 546: #ifdef TYQUAD ! 547: case TYQUAD: ! 548: Ptr->fllongint = f__lx; ! 549: break; ! 550: #endif ! 551: case TYREAL: ! 552: Ptr->flreal=f__lx; ! 553: break; ! 554: case TYDREAL: ! 555: Ptr->fldouble=f__lx; ! 556: break; ! 557: case TYCOMPLEX: ! 558: xx=(real *)ptr; ! 559: *xx++ = f__lx; ! 560: *xx = f__ly; ! 561: break; ! 562: case TYDCOMPLEX: ! 563: yy=(doublereal *)ptr; ! 564: *yy++ = f__lx; ! 565: *yy = f__ly; ! 566: break; ! 567: case TYCHAR: ! 568: b_char(f__lchar,ptr,len); ! 569: break; ! 570: } ! 571: bump: ! 572: if(f__lcount>0) f__lcount--; ! 573: ptr += len; ! 574: if (nml_read) ! 575: nml_read++; ! 576: } ! 577: return(0); ! 578: #undef Ptr ! 579: } ! 580: #ifdef KR_headers ! 581: integer s_rsle(a) cilist *a; ! 582: #else ! 583: integer s_rsle(cilist *a) ! 584: #endif ! 585: { ! 586: int n; ! 587: ! 588: if(!f__init) f_init(); ! 589: if(n=c_le(a)) return(n); ! 590: f__reading=1; ! 591: f__external=1; ! 592: f__formatted=1; ! 593: f__lioproc = l_read; ! 594: f__lquit = 0; ! 595: f__lcount = 0; ! 596: l_eof = 0; ! 597: if(f__curunit->uwrt && f__nowreading(f__curunit)) ! 598: err(a->cierr,errno,"read start"); ! 599: l_getc = t_getc; ! 600: l_ungetc = un_getc; ! 601: return(0); ! 602: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.