|
|
1.1 ! root 1: /* Routines to generate code for I/O statements. ! 2: Some corrections and improvements due to David Wasley, U. C. Berkeley ! 3: */ ! 4: ! 5: /* TEMPORARY */ ! 6: #define TYIOINT TYLONG ! 7: #define SZIOINT SZLONG ! 8: ! 9: #include "defs" ! 10: ! 11: ! 12: LOCAL char ioroutine[XL+1]; ! 13: ! 14: LOCAL int ioendlab; ! 15: LOCAL int ioerrlab; ! 16: LOCAL int endbit; ! 17: LOCAL int jumplab; ! 18: LOCAL int skiplab; ! 19: LOCAL int ioformatted; ! 20: ! 21: #define UNFORMATTED 0 ! 22: #define FORMATTED 1 ! 23: #define LISTDIRECTED 2 ! 24: ! 25: #define V(z) ioc[z].iocval ! 26: ! 27: #define IOALL 07777 ! 28: ! 29: LOCAL struct Ioclist ! 30: { ! 31: char *iocname; ! 32: int iotype; ! 33: expptr iocval; ! 34: } ioc[ ] = ! 35: { ! 36: { "", 0 }, ! 37: { "unit", IOALL }, ! 38: { "fmt", M(IOREAD) | M(IOWRITE) }, ! 39: { "err", IOALL }, ! 40: { "end", M(IOREAD) }, ! 41: { "iostat", IOALL }, ! 42: { "rec", M(IOREAD) | M(IOWRITE) }, ! 43: { "recl", M(IOOPEN) | M(IOINQUIRE) }, ! 44: { "file", M(IOOPEN) | M(IOINQUIRE) }, ! 45: { "status", M(IOOPEN) | M(IOCLOSE) }, ! 46: { "access", M(IOOPEN) | M(IOINQUIRE) }, ! 47: { "form", M(IOOPEN) | M(IOINQUIRE) }, ! 48: { "blank", M(IOOPEN) | M(IOINQUIRE) }, ! 49: { "exist", M(IOINQUIRE) }, ! 50: { "opened", M(IOINQUIRE) }, ! 51: { "number", M(IOINQUIRE) }, ! 52: { "named", M(IOINQUIRE) }, ! 53: { "name", M(IOINQUIRE) }, ! 54: { "sequential", M(IOINQUIRE) }, ! 55: { "direct", M(IOINQUIRE) }, ! 56: { "formatted", M(IOINQUIRE) }, ! 57: { "unformatted", M(IOINQUIRE) }, ! 58: { "nextrec", M(IOINQUIRE) } ! 59: } ; ! 60: ! 61: #define NIOS (sizeof(ioc)/sizeof(struct Ioclist) - 1) ! 62: #define MAXIO SZFLAG + 10*SZIOINT + 15*SZADDR ! 63: ! 64: #define IOSUNIT 1 ! 65: #define IOSFMT 2 ! 66: #define IOSERR 3 ! 67: #define IOSEND 4 ! 68: #define IOSIOSTAT 5 ! 69: #define IOSREC 6 ! 70: #define IOSRECL 7 ! 71: #define IOSFILE 8 ! 72: #define IOSSTATUS 9 ! 73: #define IOSACCESS 10 ! 74: #define IOSFORM 11 ! 75: #define IOSBLANK 12 ! 76: #define IOSEXIST 13 ! 77: #define IOSOPENED 14 ! 78: #define IOSNUMBER 15 ! 79: #define IOSNAMED 16 ! 80: #define IOSNAME 17 ! 81: #define IOSSEQUENTIAL 18 ! 82: #define IOSDIRECT 19 ! 83: #define IOSFORMATTED 20 ! 84: #define IOSUNFORMATTED 21 ! 85: #define IOSNEXTREC 22 ! 86: ! 87: #define IOSTP V(IOSIOSTAT) ! 88: ! 89: ! 90: /* offsets in generated structures */ ! 91: ! 92: #define SZFLAG SZIOINT ! 93: ! 94: /* offsets for external READ and WRITE statements */ ! 95: ! 96: #define XERR 0 ! 97: #define XUNIT SZFLAG ! 98: #define XEND SZFLAG + SZIOINT ! 99: #define XFMT 2*SZFLAG + SZIOINT ! 100: #define XREC 2*SZFLAG + SZIOINT + SZADDR ! 101: #define XRLEN 2*SZFLAG + 2*SZADDR ! 102: #define XRNUM 2*SZFLAG + 2*SZADDR + SZIOINT ! 103: ! 104: /* offsets for internal READ and WRITE statements */ ! 105: ! 106: #define XIERR 0 ! 107: #define XIUNIT SZFLAG ! 108: #define XIEND SZFLAG + SZADDR ! 109: #define XIFMT 2*SZFLAG + SZADDR ! 110: #define XIRLEN 2*SZFLAG + 2*SZADDR ! 111: #define XIRNUM 2*SZFLAG + 2*SZADDR + SZIOINT ! 112: #define XIREC 2*SZFLAG + 2*SZADDR + 2*SZIOINT ! 113: ! 114: /* offsets for OPEN statements */ ! 115: ! 116: #define XFNAME SZFLAG + SZIOINT ! 117: #define XFNAMELEN SZFLAG + SZIOINT + SZADDR ! 118: #define XSTATUS SZFLAG + 2*SZIOINT + SZADDR ! 119: #define XACCESS SZFLAG + 2*SZIOINT + 2*SZADDR ! 120: #define XFORMATTED SZFLAG + 2*SZIOINT + 3*SZADDR ! 121: #define XRECLEN SZFLAG + 2*SZIOINT + 4*SZADDR ! 122: #define XBLANK SZFLAG + 3*SZIOINT + 4*SZADDR ! 123: ! 124: /* offset for CLOSE statement */ ! 125: ! 126: #define XCLSTATUS SZFLAG + SZIOINT ! 127: ! 128: /* offsets for INQUIRE statement */ ! 129: ! 130: #define XFILE SZFLAG + SZIOINT ! 131: #define XFILELEN SZFLAG + SZIOINT + SZADDR ! 132: #define XEXISTS SZFLAG + 2*SZIOINT + SZADDR ! 133: #define XOPEN SZFLAG + 2*SZIOINT + 2*SZADDR ! 134: #define XNUMBER SZFLAG + 2*SZIOINT + 3*SZADDR ! 135: #define XNAMED SZFLAG + 2*SZIOINT + 4*SZADDR ! 136: #define XNAME SZFLAG + 2*SZIOINT + 5*SZADDR ! 137: #define XNAMELEN SZFLAG + 2*SZIOINT + 6*SZADDR ! 138: #define XQACCESS SZFLAG + 3*SZIOINT + 6*SZADDR ! 139: #define XQACCLEN SZFLAG + 3*SZIOINT + 7*SZADDR ! 140: #define XSEQ SZFLAG + 4*SZIOINT + 7*SZADDR ! 141: #define XSEQLEN SZFLAG + 4*SZIOINT + 8*SZADDR ! 142: #define XDIRECT SZFLAG + 5*SZIOINT + 8*SZADDR ! 143: #define XDIRLEN SZFLAG + 5*SZIOINT + 9*SZADDR ! 144: #define XFORM SZFLAG + 6*SZIOINT + 9*SZADDR ! 145: #define XFORMLEN SZFLAG + 6*SZIOINT + 10*SZADDR ! 146: #define XFMTED SZFLAG + 7*SZIOINT + 10*SZADDR ! 147: #define XFMTEDLEN SZFLAG + 7*SZIOINT + 11*SZADDR ! 148: #define XUNFMT SZFLAG + 8*SZIOINT + 11*SZADDR ! 149: #define XUNFMTLEN SZFLAG + 8*SZIOINT + 12*SZADDR ! 150: #define XQRECL SZFLAG + 9*SZIOINT + 12*SZADDR ! 151: #define XNEXTREC SZFLAG + 9*SZIOINT + 13*SZADDR ! 152: #define XQBLANK SZFLAG + 9*SZIOINT + 14*SZADDR ! 153: #define XQBLANKLEN SZFLAG + 9*SZIOINT + 15*SZADDR ! 154: ! 155: fmtstmt(lp) ! 156: register struct Labelblock *lp; ! 157: { ! 158: if(lp == NULL) ! 159: { ! 160: execerr("unlabeled format statement" , 0); ! 161: return(-1); ! 162: } ! 163: if(lp->labtype == LABUNKNOWN) ! 164: { ! 165: lp->labtype = LABFORMAT; ! 166: lp->labelno = newlabel(); ! 167: } ! 168: else if(lp->labtype != LABFORMAT) ! 169: { ! 170: execerr("bad format number", 0); ! 171: return(-1); ! 172: } ! 173: return(lp->labelno); ! 174: } ! 175: ! 176: ! 177: ! 178: setfmt(lp) ! 179: struct Labelblock *lp; ! 180: { ! 181: ftnint n; ! 182: char *s, *lexline(); ! 183: ! 184: s = lexline(&n); ! 185: preven(ALILONG); ! 186: prlabel(asmfile, lp->labelno); ! 187: putstr(asmfile, s, n); ! 188: flline(); ! 189: } ! 190: ! 191: ! 192: ! 193: startioctl() ! 194: { ! 195: register int i; ! 196: ! 197: inioctl = YES; ! 198: nioctl = 0; ! 199: ioformatted = UNFORMATTED; ! 200: for(i = 1 ; i<=NIOS ; ++i) ! 201: V(i) = NULL; ! 202: } ! 203: ! 204: ! 205: ! 206: endioctl() ! 207: { ! 208: int i; ! 209: expptr p; ! 210: ! 211: inioctl = NO; ! 212: if(ioblkp == NULL) ! 213: ioblkp = autovar( (MAXIO+SZIOINT-1)/SZIOINT , TYIOINT, NULL); ! 214: ! 215: /* set up for error recovery */ ! 216: ! 217: ioerrlab = ioendlab = skiplab = jumplab = 0; ! 218: ! 219: if(p = V(IOSEND)) ! 220: if(ISICON(p)) ! 221: ioendlab = mklabel(p->constblock.const.ci)->labelno; ! 222: else ! 223: err("bad end= clause"); ! 224: ! 225: if(p = V(IOSERR)) ! 226: if(ISICON(p)) ! 227: ioerrlab = mklabel(p->constblock.const.ci)->labelno; ! 228: else ! 229: err("bad err= clause"); ! 230: ! 231: if(IOSTP) ! 232: if(IOSTP->headblock.tag!=TADDR || ! ISINT(IOSTP->addrblock.vtype) ) ! 233: { ! 234: err("iostat must be an integer variable"); ! 235: frexpr(IOSTP); ! 236: IOSTP = NULL; ! 237: } ! 238: ! 239: if(iostmt == IOREAD) ! 240: { ! 241: if(IOSTP) ! 242: { ! 243: if(ioerrlab && ioendlab && ioerrlab==ioendlab) ! 244: jumplab = ioerrlab; ! 245: else ! 246: skiplab = jumplab = newlabel(); ! 247: } ! 248: else { ! 249: if(ioerrlab && ioendlab && ioerrlab!=ioendlab) ! 250: { ! 251: IOSTP = mktemp(TYINT, NULL); ! 252: skiplab = jumplab = newlabel(); ! 253: } ! 254: else ! 255: jumplab = (ioerrlab ? ioerrlab : ioendlab); ! 256: } ! 257: } ! 258: else if(iostmt == IOWRITE) ! 259: { ! 260: if(IOSTP && !ioerrlab) ! 261: skiplab = jumplab = newlabel(); ! 262: else ! 263: jumplab = ioerrlab; ! 264: } ! 265: else ! 266: jumplab = ioerrlab; ! 267: ! 268: ioset(TYIOINT, XERR, ICON(IOSTP!=NULL || ioerrlab!=0) ); ! 269: endbit = IOSTP!=NULL || ioendlab!=0; /* for use in startrw() */ ! 270: ! 271: switch(iostmt) ! 272: { ! 273: case IOOPEN: ! 274: dofopen(); break; ! 275: ! 276: case IOCLOSE: ! 277: dofclose(); break; ! 278: ! 279: case IOINQUIRE: ! 280: dofinquire(); break; ! 281: ! 282: case IOBACKSPACE: ! 283: dofmove("f_back"); break; ! 284: ! 285: case IOREWIND: ! 286: dofmove("f_rew"); break; ! 287: ! 288: case IOENDFILE: ! 289: dofmove("f_end"); break; ! 290: ! 291: case IOREAD: ! 292: case IOWRITE: ! 293: startrw(); break; ! 294: ! 295: default: ! 296: fatali("impossible iostmt %d", iostmt); ! 297: } ! 298: for(i = 1 ; i<=NIOS ; ++i) ! 299: if(i!=IOSIOSTAT && V(i)!=NULL) ! 300: frexpr(V(i)); ! 301: } ! 302: ! 303: ! 304: ! 305: iocname() ! 306: { ! 307: register int i; ! 308: int found, mask; ! 309: ! 310: found = 0; ! 311: mask = M(iostmt); ! 312: for(i = 1 ; i <= NIOS ; ++i) ! 313: if(toklen==strlen(ioc[i].iocname) && eqn(toklen, token, ioc[i].iocname)) ! 314: if(ioc[i].iotype & mask) ! 315: return(i); ! 316: else found = i; ! 317: if(found) ! 318: errstr("invalid control %s for statement", ioc[found].iocname); ! 319: else ! 320: errstr("unknown iocontrol %s", varstr(toklen, token) ); ! 321: return(IOSBAD); ! 322: } ! 323: ! 324: ! 325: ioclause(n, p) ! 326: register int n; ! 327: register expptr p; ! 328: { ! 329: struct Ioclist *iocp; ! 330: ! 331: ++nioctl; ! 332: if(n == IOSBAD) ! 333: return; ! 334: if(n == IOSPOSITIONAL) ! 335: { ! 336: if(nioctl > IOSFMT) ! 337: { ! 338: err("illegal positional iocontrol"); ! 339: return; ! 340: } ! 341: n = nioctl; ! 342: } ! 343: ! 344: if(p == NULL) ! 345: { ! 346: if(n == IOSUNIT) ! 347: p = (iostmt==IOREAD ? IOSTDIN : IOSTDOUT); ! 348: else if(n != IOSFMT) ! 349: { ! 350: err("illegal * iocontrol"); ! 351: return; ! 352: } ! 353: } ! 354: if(n == IOSFMT) ! 355: ioformatted = (p==NULL ? LISTDIRECTED : FORMATTED); ! 356: ! 357: iocp = & ioc[n]; ! 358: if(iocp->iocval == NULL) ! 359: { ! 360: if(n!=IOSFMT && ( n!=IOSUNIT || (p!=NULL && p->headblock.vtype!=TYCHAR) ) ) ! 361: p = fixtype(p); ! 362: iocp->iocval = p; ! 363: } ! 364: else ! 365: errstr("iocontrol %s repeated", iocp->iocname); ! 366: } ! 367: ! 368: /* io list item */ ! 369: ! 370: doio(list) ! 371: chainp list; ! 372: { ! 373: struct Exprblock *call0(); ! 374: doiolist(list); ! 375: ioroutine[0] = 'e'; ! 376: putiocall( call0(TYINT, ioroutine) ); ! 377: } ! 378: ! 379: ! 380: ! 381: ! 382: ! 383: LOCAL doiolist(p0) ! 384: chainp p0; ! 385: { ! 386: chainp p; ! 387: register tagptr q; ! 388: register expptr qe; ! 389: register struct Nameblock *qn; ! 390: struct Addrblock *tp, *mkscalar(); ! 391: int range; ! 392: ! 393: for (p = p0 ; p ; p = p->nextp) ! 394: { ! 395: q = p->datap; ! 396: if(q->headblock.tag == TIMPLDO) ! 397: { ! 398: exdo(range=newlabel(), q->impldoblock.varnp); ! 399: doiolist(q->impldoblock.datalist); ! 400: enddo(range); ! 401: free(q); ! 402: } ! 403: else { ! 404: if(q->headblock.tag==TPRIM && q->primblock.argsp==NULL ! 405: && q->primblock.namep->vdim!=NULL) ! 406: { ! 407: vardcl(qn = q->primblock.namep); ! 408: if(qn->vdim->nelt) ! 409: putio( fixtype(cpexpr(qn->vdim->nelt)), ! 410: mkscalar(qn) ); ! 411: else ! 412: err("attempt to i/o array of unknown size"); ! 413: } ! 414: else if(q->headblock.tag==TPRIM && q->primblock.argsp==NULL && ! 415: (qe = memversion(q->primblock.namep)) ) ! 416: putio(ICON(1),qe); ! 417: else if( (qe = fixtype(cpexpr(q)))->headblock.tag==TADDR) ! 418: putio(ICON(1), qe); ! 419: else if(qe->headblock.vtype != TYERROR) ! 420: { ! 421: if(iostmt == IOWRITE) ! 422: { ! 423: tp = mktemp(qe->headblock.vtype, qe->headblock.vleng); ! 424: puteq( cpexpr(tp), qe); ! 425: putio(ICON(1), tp); ! 426: } ! 427: else ! 428: err("non-left side in READ list"); ! 429: } ! 430: frexpr(q); ! 431: } ! 432: } ! 433: frchain( &p0 ); ! 434: } ! 435: ! 436: ! 437: ! 438: ! 439: ! 440: LOCAL putio(nelt, addr) ! 441: expptr nelt; ! 442: register expptr addr; ! 443: { ! 444: int type; ! 445: register struct Exprblock *q; ! 446: ! 447: type = addr->headblock.vtype; ! 448: if(ioformatted!=LISTDIRECTED && ISCOMPLEX(type) ) ! 449: { ! 450: nelt = mkexpr(OPSTAR, ICON(2), nelt); ! 451: type -= (TYCOMPLEX-TYREAL); ! 452: } ! 453: ! 454: /* pass a length with every item. for noncharacter data, fake one */ ! 455: if(type != TYCHAR) ! 456: { ! 457: if( ISCONST(addr) ) ! 458: addr = putconst(addr); ! 459: addr->headblock.vtype = TYCHAR; ! 460: addr->headblock.vleng = ICON( typesize[type] ); ! 461: } ! 462: ! 463: nelt = fixtype( mkconv(TYLENG,nelt) ); ! 464: if(ioformatted == LISTDIRECTED) ! 465: q = call3(TYINT, "do_lio", mkconv(TYLONG, ICON(type)), nelt, addr); ! 466: else ! 467: q = call2(TYINT, (ioformatted==FORMATTED ? "do_fio" : "do_uio"), ! 468: nelt, addr); ! 469: putiocall(q); ! 470: } ! 471: ! 472: ! 473: ! 474: ! 475: endio() ! 476: { ! 477: if(skiplab) ! 478: { ! 479: putlabel(skiplab); ! 480: if(ioendlab) ! 481: putif( mkexpr(OPGE, cpexpr(IOSTP), ICON(0)), ioendlab); ! 482: if(ioerrlab) ! 483: putif( mkexpr( ( (iostmt==IOREAD||iostmt==IOWRITE) ? OPLE : OPEQ), ! 484: cpexpr(IOSTP), ICON(0)) , ioerrlab); ! 485: } ! 486: if(IOSTP) ! 487: frexpr(IOSTP); ! 488: } ! 489: ! 490: ! 491: ! 492: LOCAL putiocall(q) ! 493: register struct Exprblock *q; ! 494: { ! 495: if(IOSTP) ! 496: { ! 497: q->vtype = TYINT; ! 498: q = fixexpr( mkexpr(OPASSIGN, cpexpr(IOSTP), q)); ! 499: } ! 500: ! 501: if(jumplab) ! 502: putif( mkexpr(OPEQ, q, ICON(0) ), jumplab); ! 503: else ! 504: putexpr(q); ! 505: } ! 506: ! 507: ! 508: startrw() ! 509: { ! 510: register expptr p; ! 511: register struct Nameblock *np; ! 512: register struct Addrblock *unitp, *nump; ! 513: struct Constblock *mkaddcon(); ! 514: int k, fmtoff; ! 515: int intfile, sequential; ! 516: ! 517: intfile = NO; ! 518: if(p = V(IOSUNIT)) ! 519: { ! 520: if( ISINT(p->headblock.vtype) ) ! 521: ioset(TYIOINT, XUNIT, cpexpr(p) ); ! 522: else if(p->headblock.vtype == TYCHAR) ! 523: { ! 524: intfile = YES; ! 525: if(p->headblock.tag==TPRIM && p->primblock.argsp==NULL && ! 526: (np = p->primblock.namep)->vdim!=NULL) ! 527: { ! 528: vardcl(np); ! 529: if(np->vdim->nelt) ! 530: nump = cpexpr(np->vdim->nelt); ! 531: else ! 532: { ! 533: err("attempt to use internal unit array of unknown size"); ! 534: nump = ICON(1); ! 535: } ! 536: unitp = mkscalar(np); ! 537: } ! 538: else { ! 539: nump = ICON(1); ! 540: unitp = fixtype(cpexpr(p)); ! 541: } ! 542: ioset(TYIOINT, XIRNUM, nump); ! 543: ioset(TYIOINT, XIRLEN, cpexpr(unitp->vleng) ); ! 544: ioset(TYADDR, XIUNIT, addrof(unitp) ); ! 545: } ! 546: } ! 547: else ! 548: err("bad unit specifier"); ! 549: ! 550: sequential = YES; ! 551: if(p = V(IOSREC)) ! 552: if( ISINT(p->headblock.vtype) ) ! 553: { ! 554: ioset(TYIOINT, (intfile ? XIREC : XREC), cpexpr(p) ); ! 555: sequential = NO; ! 556: } ! 557: else ! 558: err("bad REC= clause"); ! 559: ! 560: if(iostmt == IOREAD) ! 561: ioset(TYIOINT, (intfile ? XIEND : XEND), ICON(endbit) ); ! 562: ! 563: fmtoff = (intfile ? XIFMT : XFMT); ! 564: ! 565: if(p = V(IOSFMT)) ! 566: { ! 567: if(p->headblock.tag==TPRIM && p->primblock.argsp==NULL) ! 568: { ! 569: vardcl(np = p->primblock.namep); ! 570: if(np->vdim) ! 571: { ! 572: ioset(TYADDR, fmtoff, addrof(mkscalar(np)) ); ! 573: goto endfmt; ! 574: } ! 575: if( ISINT(np->vtype) ) ! 576: { ! 577: ioset(TYADDR, fmtoff, p); ! 578: goto endfmt; ! 579: } ! 580: } ! 581: p = V(IOSFMT) = fixtype(p); ! 582: if(p->headblock.vtype == TYCHAR) ! 583: ioset(TYADDR, fmtoff, addrof(cpexpr(p)) ); ! 584: else if( ISICON(p) ) ! 585: { ! 586: if( (k = fmtstmt( mklabel(p->constblock.const.ci) )) > 0 ) ! 587: ioset(TYADDR, fmtoff, mkaddcon(k) ); ! 588: else ! 589: ioformatted = UNFORMATTED; ! 590: } ! 591: else { ! 592: err("bad format descriptor"); ! 593: ioformatted = UNFORMATTED; ! 594: } ! 595: } ! 596: else ! 597: ioset(TYADDR, fmtoff, ICON(0) ); ! 598: ! 599: endfmt: ! 600: if(intfile && ioformatted==UNFORMATTED) ! 601: err("unformatted internal I/O not allowed"); ! 602: if(!sequential && ioformatted==LISTDIRECTED) ! 603: err("direct list-directed I/O not allowed"); ! 604: ! 605: ioroutine[0] = 's'; ! 606: ioroutine[1] = '_'; ! 607: ioroutine[2] = (iostmt==IOREAD ? 'r' : 'w'); ! 608: ioroutine[3] = (sequential ? 's' : 'd'); ! 609: ioroutine[4] = "ufl" [ioformatted]; ! 610: ioroutine[5] = (intfile ? 'i' : 'e'); ! 611: ioroutine[6] = '\0'; ! 612: putiocall( call1(TYINT, ioroutine, cpexpr(ioblkp) )); ! 613: } ! 614: ! 615: ! 616: ! 617: LOCAL dofopen() ! 618: { ! 619: register expptr p; ! 620: ! 621: if( (p = V(IOSUNIT)) && ISINT(p->headblock.vtype) ) ! 622: ioset(TYIOINT, XUNIT, cpexpr(p) ); ! 623: else ! 624: err("bad unit in open"); ! 625: if( (p = V(IOSFILE)) ) ! 626: if(p->headblock.vtype == TYCHAR) ! 627: ioset(TYIOINT, XFNAMELEN, cpexpr(p->headblock.vleng) ); ! 628: else ! 629: err("bad file in open"); ! 630: ! 631: iosetc(XFNAME, p); ! 632: ! 633: if(p = V(IOSRECL)) ! 634: if( ISINT(p->headblock.vtype) ) ! 635: ioset(TYIOINT, XRECLEN, cpexpr(p) ); ! 636: else ! 637: err("bad recl"); ! 638: else ! 639: ioset(TYIOINT, XRECLEN, ICON(0) ); ! 640: ! 641: iosetc(XSTATUS, V(IOSSTATUS)); ! 642: iosetc(XACCESS, V(IOSACCESS)); ! 643: iosetc(XFORMATTED, V(IOSFORM)); ! 644: iosetc(XBLANK, V(IOSBLANK)); ! 645: ! 646: putiocall( call1(TYINT, "f_open", cpexpr(ioblkp) )); ! 647: } ! 648: ! 649: ! 650: LOCAL dofclose() ! 651: { ! 652: register expptr p; ! 653: ! 654: if( (p = V(IOSUNIT)) && ISINT(p->headblock.vtype) ) ! 655: { ! 656: ioset(TYIOINT, XUNIT, cpexpr(p) ); ! 657: iosetc(XCLSTATUS, V(IOSSTATUS)); ! 658: putiocall( call1(TYINT, "f_clos", cpexpr(ioblkp)) ); ! 659: } ! 660: else ! 661: err("bad unit in close statement"); ! 662: } ! 663: ! 664: ! 665: LOCAL dofinquire() ! 666: { ! 667: register expptr p; ! 668: if(p = V(IOSUNIT)) ! 669: { ! 670: if( V(IOSFILE) ) ! 671: err("inquire by unit or by file, not both"); ! 672: ioset(TYIOINT, XUNIT, cpexpr(p) ); ! 673: } ! 674: else if( ! V(IOSFILE) ) ! 675: err("must inquire by unit or by file"); ! 676: iosetlc(IOSFILE, XFILE, XFILELEN); ! 677: iosetip(IOSEXISTS, XEXISTS); ! 678: iosetip(IOSOPENED, XOPEN); ! 679: iosetip(IOSNUMBER, XNUMBER); ! 680: iosetip(IOSNAMED, XNAMED); ! 681: iosetlc(IOSNAME, XNAME, XNAMELEN); ! 682: iosetlc(IOSACCESS, XQACCESS, XQACCLEN); ! 683: iosetlc(IOSSEQUENTIAL, XSEQ, XSEQLEN); ! 684: iosetlc(IOSDIRECT, XDIRECT, XDIRLEN); ! 685: iosetlc(IOSFORM, XFORM, XFORMLEN); ! 686: iosetlc(IOSFORMATTED, XFMTED, XFMTEDLEN); ! 687: iosetlc(IOSUNFORMATTED, XUNFMT, XUNFMTLEN); ! 688: iosetip(IOSRECL, XQRECL); ! 689: iosetip(IOSNEXTREC, XNEXTREC); ! 690: iosetlc(IOSBLANK, XQBLANK, XQBLANKLEN); ! 691: ! 692: putiocall( call1(TYINT, "f_inqu", cpexpr(ioblkp) )); ! 693: } ! 694: ! 695: ! 696: ! 697: LOCAL dofmove(subname) ! 698: char *subname; ! 699: { ! 700: register expptr p; ! 701: ! 702: if( (p = V(IOSUNIT)) && ISINT(p->headblock.vtype) ) ! 703: { ! 704: ioset(TYIOINT, XUNIT, cpexpr(p) ); ! 705: putiocall( call1(TYINT, subname, cpexpr(ioblkp) )); ! 706: } ! 707: else ! 708: err("bad unit in I/O motion statement"); ! 709: } ! 710: ! 711: ! 712: ! 713: LOCAL ioset(type, offset, p) ! 714: int type, offset; ! 715: expptr p; ! 716: { ! 717: register struct Addrblock *q; ! 718: ! 719: q = cpexpr(ioblkp); ! 720: q->vtype = type; ! 721: q->memoffset = fixtype( mkexpr(OPPLUS, q->memoffset, ICON(offset)) ); ! 722: puteq(q, p); ! 723: } ! 724: ! 725: ! 726: ! 727: ! 728: LOCAL iosetc(offset, p) ! 729: int offset; ! 730: register expptr p; ! 731: { ! 732: if(p == NULL) ! 733: ioset(TYADDR, offset, ICON(0) ); ! 734: else if(p->headblock.vtype == TYCHAR) ! 735: ioset(TYADDR, offset, addrof(cpexpr(p) )); ! 736: else ! 737: err("non-character control clause"); ! 738: } ! 739: ! 740: ! 741: ! 742: LOCAL iosetip(i, offset) ! 743: int i, offset; ! 744: { ! 745: register expptr p; ! 746: ! 747: if(p = V(i)) ! 748: if(p->headblock.tag==TADDR && ! 749: ONEOF(p->addrblock.vtype, M(TYLONG)|M(TYLOGICAL)) ) ! 750: ioset(TYADDR, offset, addrof(cpexpr(p)) ); ! 751: else ! 752: errstr("impossible inquire parameter %s", ioc[i].iocname); ! 753: else ! 754: ioset(TYADDR, offset, ICON(0) ); ! 755: } ! 756: ! 757: ! 758: ! 759: LOCAL iosetlc(i, offp, offl) ! 760: int i, offp, offl; ! 761: { ! 762: register expptr p; ! 763: if( (p = V(i)) && p->headblock.vtype==TYCHAR) ! 764: ioset(TYIOINT, offl, cpexpr(p->headblock.vleng) ); ! 765: iosetc(offp, p); ! 766: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.