|
|
1.1 ! root 1: #include "fio.h" ! 2: #include "fmt.h" ! 3: #include "lio.h" ! 4: #include "ctype.h" ! 5: extern char *fmtbuf; ! 6: int (*lioproc)(); ! 7: ! 8: #define isblnk(x) (ltab[x+1]&B) ! 9: #define issep(x) (ltab[x+1]&SX) ! 10: #define isapos(x) (ltab[x+1]&AX) ! 11: #define isexp(x) (ltab[x+1]&EX) ! 12: #define issign(x) (ltab[x+1]&SG) ! 13: #define SX 1 ! 14: #define B 2 ! 15: #define AX 4 ! 16: #define EX 8 ! 17: #define SG 16 ! 18: char ltab[128+1] = { /* offset one for EOF */ ! 19: 0, ! 20: 0,0,AX,0,0,0,0,0,0,0,SX,0,0,0,0,0, ! 21: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ! 22: SX|B,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX, ! 23: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ! 24: 0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0, ! 25: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ! 26: AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0, ! 27: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ! 28: }; ! 29: ! 30: char l_comma, l_first; ! 31: t_getc() ! 32: { int ch; ! 33: if(curunit->uend) return(EOF); ! 34: if((ch=getc(cf))!=EOF) return(ch); ! 35: if(feof(cf)) curunit->uend = 1; ! 36: return(EOF); ! 37: } ! 38: e_rsle() ! 39: { ! 40: int ch; ! 41: if(curunit->uend) return(0); ! 42: while((ch=t_getc())!='\n' && ch!=EOF); ! 43: return(0); ! 44: } ! 45: ! 46: flag lquit; ! 47: int lcount,ltype; ! 48: char *lchar; ! 49: double lx,ly; ! 50: #define ERR(x) if(n=(x)) return(n) ! 51: #define GETC(x) (x=t_getc()) ! 52: ! 53: l_read(number,ptr,len,type) ftnint *number,type; flex *ptr; ftnlen len; ! 54: { int i,n,ch; ! 55: double *yy; ! 56: float *xx; ! 57: for(i=0;i<*number;i++) ! 58: { ! 59: if(lquit) return(0); ! 60: if(curunit->uend) err(elist->ciend, EOF, "list in") ! 61: if(lcount == 0) { ! 62: ltype = NULL; ! 63: if(!l_first) l_comma = 0; ! 64: else l_first = 0; ! 65: for(;;) { ! 66: GETC(ch); ! 67: switch(ch) { ! 68: case EOF: ! 69: goto loopend; ! 70: case ' ': ! 71: case '\n': ! 72: continue; ! 73: case '/': ! 74: lquit = 1; ! 75: goto loopend; ! 76: case ',': ! 77: if(l_comma) { ! 78: lcount = 1; ! 79: ungetc(ch, cf); ! 80: goto loopend; ! 81: } ! 82: l_comma = 1; ! 83: continue; ! 84: default: ! 85: ungetc(ch, cf); ! 86: goto rddata; ! 87: } ! 88: } ! 89: } ! 90: rddata: ! 91: switch((int)type) ! 92: { ! 93: case TYSHORT: ! 94: case TYLONG: ! 95: case TYREAL: ! 96: case TYDREAL: ! 97: ERR(l_R()); ! 98: break; ! 99: case TYCOMPLEX: ! 100: case TYDCOMPLEX: ! 101: ERR(l_C()); ! 102: break; ! 103: case TYLOGICAL: ! 104: ERR(l_L()); ! 105: break; ! 106: case TYCHAR: ! 107: ERR(l_CHAR()); ! 108: break; ! 109: } ! 110: loopend: ! 111: if(lquit) return(0); ! 112: if(feof(cf)) err(elist->ciend,(EOF),"list in") ! 113: else if(ferror(cf)) ! 114: { clearerr(cf); ! 115: err(elist->cierr,errno,"list in") ! 116: } ! 117: if(ltype==NULL) goto bump; ! 118: switch((int)type) ! 119: { ! 120: case TYSHORT: ! 121: ptr->flshort=lx; ! 122: break; ! 123: case TYLOGICAL: ! 124: case TYLONG: ! 125: ptr->flint=lx; ! 126: break; ! 127: case TYREAL: ! 128: ptr->flreal=lx; ! 129: break; ! 130: case TYDREAL: ! 131: ptr->fldouble=lx; ! 132: break; ! 133: case TYCOMPLEX: ! 134: xx=(float *)ptr; ! 135: *xx++ = lx; ! 136: *xx = ly; ! 137: break; ! 138: case TYDCOMPLEX: ! 139: yy=(double *)ptr; ! 140: *yy++ = lx; ! 141: *yy = ly; ! 142: break; ! 143: case TYCHAR: ! 144: b_char(lchar,(char *)ptr,len); ! 145: break; ! 146: } ! 147: bump: ! 148: if(lcount>0) lcount--; ! 149: ptr = (flex *)((char *)ptr + len); ! 150: } ! 151: return(0); ! 152: } ! 153: l_R() ! 154: { double a,b,c,d; ! 155: int i,ch,sign=0,da,db,dc; ! 156: a=b=c=d=0; ! 157: da=db=dc=0; ! 158: if(lcount>0) return(0); ! 159: ltype=NULL; ! 160: da=rd_int(&a); ! 161: if(da== -1) sign=da; ! 162: if(GETC(ch)!='*') ! 163: { ungetc(ch,cf); ! 164: db=1; ! 165: b=a; ! 166: a=1; ! 167: } ! 168: else ! 169: db=rd_int(&b); ! 170: if(GETC(ch)!='.') ! 171: { dc=c=0; ! 172: ungetc(ch,cf); ! 173: } ! 174: else dc=rd_int(&c); ! 175: if(isexp(GETC(ch))) db=rd_int(&d); ! 176: else if(issign(ch)) ! 177: { ungetc(ch, cf); ! 178: db = rd_int(&d); ! 179: } ! 180: else ! 181: { ungetc(ch,cf); ! 182: d=0; ! 183: } ! 184: lcount=a; ! 185: if(!db && !dc) ! 186: return(0); ! 187: if(db && b<0) ! 188: { sign=1; ! 189: b = -b; ! 190: } ! 191: for(i=0;i<dc;i++) c/=10; ! 192: b=b+c; ! 193: for(i=0;i<d;i++) b *= 10; ! 194: for(i=0;i< -d;i++) b /= 10; ! 195: if(sign) b = -b; ! 196: ltype=TYLONG; ! 197: lx=b; ! 198: return(0); ! 199: } ! 200: rd_int(x) double *x; ! 201: { int ch,sign=0,i; ! 202: double y; ! 203: i=0; ! 204: y=0; ! 205: if(GETC(ch)=='-') sign = -1; ! 206: else if(ch=='+') sign=0; ! 207: else ungetc(ch,cf); ! 208: while(isdigit(GETC(ch))) ! 209: { i++; ! 210: y=10*y+ch-'0'; ! 211: } ! 212: ungetc(ch,cf); ! 213: if(sign) y = -y; ! 214: *x = y; ! 215: return(y!=0?i:sign); ! 216: } ! 217: l_C() ! 218: { int ch; ! 219: if(lcount>0) return(0); ! 220: ltype=NULL; ! 221: GETC(ch); ! 222: if(ch!='(') ! 223: { if(fscanf(cf,"%d",&lcount)!=1) ! 224: if(!feof(cf)) err(elist->cierr,112,"complex format") ! 225: else err(elist->cierr,(EOF),"lread"); ! 226: if(GETC(ch)!='*') ! 227: { ungetc(ch,cf); ! 228: if(!feof(cf)) err(elist->cierr,112,"no star") ! 229: else err(elist->cierr,(EOF),"lread"); ! 230: } ! 231: if(GETC(ch)!='(') ! 232: { ungetc(ch,cf); ! 233: return(0); ! 234: } ! 235: } ! 236: lcount = 1; ! 237: ltype=TYLONG; ! 238: fscanf(cf,"%lf",&lx); ! 239: while(isblnk(GETC(ch)) || (ch == '\n')); ! 240: if(ch!=',') ! 241: { ungetc(ch,cf); ! 242: err(elist->cierr,112,"no comma"); ! 243: } ! 244: while(isblnk(GETC(ch))); ! 245: ungetc(ch,cf); ! 246: fscanf(cf,"%lf",&ly); ! 247: while(isblnk(GETC(ch))); ! 248: if(ch!=')') err(elist->cierr,112,"no )"); ! 249: while(isblnk(GETC(ch))); ! 250: if(ch != '\n') ungetc(ch,cf); ! 251: return(0); ! 252: } ! 253: l_L() ! 254: { ! 255: int ch; ! 256: if(lcount>0) return(0); ! 257: ltype=NULL; ! 258: GETC(ch); ! 259: if(isdigit(ch)) ! 260: { ungetc(ch,cf); ! 261: fscanf(cf,"%d",&lcount); ! 262: if(GETC(ch)!='*') ! 263: if(!feof(cf)) err(elist->cierr,112,"no star") ! 264: else err(elist->cierr,(EOF),"lread"); ! 265: } ! 266: else ungetc(ch,cf); ! 267: if(GETC(ch)=='.') GETC(ch); ! 268: switch(ch) ! 269: { ! 270: case 't': ! 271: case 'T': ! 272: lx=1; ! 273: break; ! 274: case 'f': ! 275: case 'F': ! 276: lx=0; ! 277: break; ! 278: default: ! 279: if(isblnk(ch) || issep(ch) || ch==EOF) ! 280: { ungetc(ch,cf); ! 281: return(0); ! 282: } ! 283: else err(elist->cierr,112,"logical"); ! 284: } ! 285: ltype=TYLONG; ! 286: lcount = 1; ! 287: while(!issep(GETC(ch)) && ch!=EOF); ! 288: ungetc(ch, cf); ! 289: return(0); ! 290: } ! 291: #define BUFSIZE 128 ! 292: l_CHAR() ! 293: { int ch,size,i; ! 294: char quote,*p; ! 295: if(lcount>0) return(0); ! 296: ltype=NULL; ! 297: ! 298: GETC(ch); ! 299: if(isdigit(ch)) ! 300: { ungetc(ch,cf); ! 301: fscanf(cf,"%d",&lcount); ! 302: if(GETC(ch)!='*') err(elist->cierr,112,"no star"); ! 303: } ! 304: else ungetc(ch,cf); ! 305: if(GETC(ch)=='\'' || ch=='"') quote=ch; ! 306: else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF) ! 307: { ungetc(ch,cf); ! 308: return(0); ! 309: } ! 310: else err(elist->cierr,112,"no quote"); ! 311: ltype=TYCHAR; ! 312: if(lchar!=NULL) free(lchar); ! 313: size=BUFSIZE; ! 314: p=lchar=(char *)malloc(size); ! 315: if(lchar==NULL) err(elist->cierr,113,"no space"); ! 316: for(i=0;;) ! 317: { while(GETC(ch)!=quote && ch!='\n' ! 318: && ch!=EOF && ++i<size) *p++ = ch; ! 319: if(i==size) ! 320: { ! 321: newone: ! 322: lchar=(char *)realloc(lchar, size += BUFSIZE); ! 323: p=lchar+i-1; ! 324: *p++ = ch; ! 325: } ! 326: else if(ch==EOF) return(EOF); ! 327: else if(ch=='\n') ! 328: { if(*(p-1) != '\\') continue; ! 329: i--; ! 330: p--; ! 331: if(++i<size) *p++ = ch; ! 332: else goto newone; ! 333: } ! 334: else if(GETC(ch)==quote) ! 335: { if(++i<size) *p++ = ch; ! 336: else goto newone; ! 337: } ! 338: else ! 339: { ungetc(ch,cf); ! 340: *p++ = 0; ! 341: return(0); ! 342: } ! 343: } ! 344: } ! 345: s_rsle(a) cilist *a; ! 346: { ! 347: int n; ! 348: if(!init) f_init(); ! 349: if(n=c_le(a,READ)) return(n); ! 350: reading=1; ! 351: external=1; ! 352: formatted=1; ! 353: l_first=1; ! 354: l_comma = 1; ! 355: lioproc = l_read; ! 356: lquit = 0; ! 357: lcount = 0; ! 358: if(curunit->uwrt) ! 359: return(nowreading(curunit)); ! 360: else return(0); ! 361: } ! 362: c_le(a,flag) cilist *a; ! 363: { ! 364: fmtbuf="list io"; ! 365: if(a->ciunit>=MXUNIT || a->ciunit<0) ! 366: err(a->cierr,101,"stler"); ! 367: scale=recpos=0; ! 368: elist=a; ! 369: curunit = &units[a->ciunit]; ! 370: if(curunit->ufd==NULL && fk_open(flag,SEQ,FMT,a->ciunit)) ! 371: err(a->cierr,102,"lio"); ! 372: cf=curunit->ufd; ! 373: if(!curunit->ufmt) err(a->cierr,103,"lio") ! 374: return(0); ! 375: } ! 376: do_lio(type,number,ptr,len) ftnint *number,*type; flex *ptr; ftnlen len; ! 377: { ! 378: return((*lioproc)(number,ptr,len,*type)); ! 379: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.