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