Annotation of researchv10no/cmd/f2c/io.c, revision 1.1

1.1     ! root        1: /****************************************************************
        !             2: Copyright 1990, 1991, 1993 by AT&T Bell Laboratories and Bellcore.
        !             3: 
        !             4: Permission to use, copy, modify, and distribute this software
        !             5: and its documentation for any purpose and without fee is hereby
        !             6: granted, provided that the above copyright notice appear in all
        !             7: copies and that both that the copyright notice and this
        !             8: permission notice and warranty disclaimer appear in supporting
        !             9: documentation, and that the names of AT&T Bell Laboratories or
        !            10: Bellcore or any of their entities not be used in advertising or
        !            11: publicity pertaining to distribution of the software without
        !            12: specific, written prior permission.
        !            13: 
        !            14: AT&T and Bellcore disclaim all warranties with regard to this
        !            15: software, including all implied warranties of merchantability
        !            16: and fitness.  In no event shall AT&T or Bellcore be liable for
        !            17: any special, indirect or consequential damages or any damages
        !            18: whatsoever resulting from loss of use, data or profits, whether
        !            19: in an action of contract, negligence or other tortious action,
        !            20: arising out of or in connection with the use or performance of
        !            21: this software.
        !            22: ****************************************************************/
        !            23: 
        !            24: /* Routines to generate code for I/O statements.
        !            25:    Some corrections and improvements due to David Wasley, U. C. Berkeley
        !            26: */
        !            27: 
        !            28: /* TEMPORARY */
        !            29: #define TYIOINT TYLONG
        !            30: #define SZIOINT SZLONG
        !            31: 
        !            32: #include "defs.h"
        !            33: #include "names.h"
        !            34: #include "iob.h"
        !            35: 
        !            36: extern int inqmask;
        !            37: 
        !            38: LOCAL void dofclose(), dofinquire(), dofinquire(), dofmove(), dofopen(),
        !            39:        doiolist(), ioset(), ioseta(), iosetc(), iosetip(), iosetlc(),
        !            40:        putio(), putiocall();
        !            41: 
        !            42: iob_data *iob_list;
        !            43: Addrp io_structs[9];
        !            44: 
        !            45: LOCAL char ioroutine[12];
        !            46: 
        !            47: LOCAL long ioendlab;
        !            48: LOCAL long ioerrlab;
        !            49: LOCAL int endbit;
        !            50: LOCAL int errbit;
        !            51: LOCAL long jumplab;
        !            52: LOCAL long skiplab;
        !            53: LOCAL int ioformatted;
        !            54: LOCAL int statstruct = NO;
        !            55: LOCAL struct Labelblock *skiplabel;
        !            56: Addrp ioblkp;
        !            57: 
        !            58: #define UNFORMATTED 0
        !            59: #define FORMATTED 1
        !            60: #define LISTDIRECTED 2
        !            61: #define NAMEDIRECTED 3
        !            62: 
        !            63: #define V(z)   ioc[z].iocval
        !            64: 
        !            65: #define IOALL 07777
        !            66: 
        !            67: LOCAL struct Ioclist
        !            68: {
        !            69:        char *iocname;
        !            70:        int iotype;
        !            71:        expptr iocval;
        !            72: }
        !            73: ioc[ ] =
        !            74: {
        !            75:        { "", 0 },
        !            76:        { "unit", IOALL },
        !            77:        { "fmt", M(IOREAD) | M(IOWRITE) },
        !            78:        { "err", IOALL },
        !            79:        { "end", M(IOREAD) },
        !            80:        { "iostat", IOALL },
        !            81:        { "rec", M(IOREAD) | M(IOWRITE) },
        !            82:        { "recl", M(IOOPEN) | M(IOINQUIRE) },
        !            83:        { "file", M(IOOPEN) | M(IOINQUIRE) },
        !            84:        { "status", M(IOOPEN) | M(IOCLOSE) },
        !            85:        { "access", M(IOOPEN) | M(IOINQUIRE) },
        !            86:        { "form", M(IOOPEN) | M(IOINQUIRE) },
        !            87:        { "blank", M(IOOPEN) | M(IOINQUIRE) },
        !            88:        { "exist", M(IOINQUIRE) },
        !            89:        { "opened", M(IOINQUIRE) },
        !            90:        { "number", M(IOINQUIRE) },
        !            91:        { "named", M(IOINQUIRE) },
        !            92:        { "name", M(IOINQUIRE) },
        !            93:        { "sequential", M(IOINQUIRE) },
        !            94:        { "direct", M(IOINQUIRE) },
        !            95:        { "formatted", M(IOINQUIRE) },
        !            96:        { "unformatted", M(IOINQUIRE) },
        !            97:        { "nextrec", M(IOINQUIRE) },
        !            98:        { "nml", M(IOREAD) | M(IOWRITE) }
        !            99: };
        !           100: 
        !           101: #define NIOS (sizeof(ioc)/sizeof(struct Ioclist) - 1)
        !           102: 
        !           103: /* #define IOSUNIT 1 */
        !           104: /* #define IOSFMT 2 */
        !           105: #define IOSERR 3
        !           106: #define IOSEND 4
        !           107: #define IOSIOSTAT 5
        !           108: #define IOSREC 6
        !           109: #define IOSRECL 7
        !           110: #define IOSFILE 8
        !           111: #define IOSSTATUS 9
        !           112: #define IOSACCESS 10
        !           113: #define IOSFORM 11
        !           114: #define IOSBLANK 12
        !           115: #define IOSEXISTS 13
        !           116: #define IOSOPENED 14
        !           117: #define IOSNUMBER 15
        !           118: #define IOSNAMED 16
        !           119: #define IOSNAME 17
        !           120: #define IOSSEQUENTIAL 18
        !           121: #define IOSDIRECT 19
        !           122: #define IOSFORMATTED 20
        !           123: #define IOSUNFORMATTED 21
        !           124: #define IOSNEXTREC 22
        !           125: #define IOSNML 23
        !           126: 
        !           127: #define IOSTP V(IOSIOSTAT)
        !           128: 
        !           129: 
        !           130: /* offsets in generated structures */
        !           131: 
        !           132: #define SZFLAG SZIOINT
        !           133: 
        !           134: /* offsets for external READ and WRITE statements */
        !           135: 
        !           136: #define XERR 0
        !           137: #define XUNIT  SZFLAG
        !           138: #define XEND   SZFLAG + SZIOINT
        !           139: #define XFMT   2*SZFLAG + SZIOINT
        !           140: #define XREC   2*SZFLAG + SZIOINT + SZADDR
        !           141: 
        !           142: /* offsets for internal READ and WRITE statements */
        !           143: 
        !           144: #define XIUNIT SZFLAG
        !           145: #define XIEND  SZFLAG + SZADDR
        !           146: #define XIFMT  2*SZFLAG + SZADDR
        !           147: #define XIRLEN 2*SZFLAG + 2*SZADDR
        !           148: #define XIRNUM 2*SZFLAG + 2*SZADDR + SZIOINT
        !           149: #define XIREC  2*SZFLAG + 2*SZADDR + 2*SZIOINT
        !           150: 
        !           151: /* offsets for OPEN statements */
        !           152: 
        !           153: #define XFNAME SZFLAG + SZIOINT
        !           154: #define XFNAMELEN      SZFLAG + SZIOINT + SZADDR
        !           155: #define XSTATUS        SZFLAG + 2*SZIOINT + SZADDR
        !           156: #define XACCESS        SZFLAG + 2*SZIOINT + 2*SZADDR
        !           157: #define XFORMATTED     SZFLAG + 2*SZIOINT + 3*SZADDR
        !           158: #define XRECLEN        SZFLAG + 2*SZIOINT + 4*SZADDR
        !           159: #define XBLANK SZFLAG + 3*SZIOINT + 4*SZADDR
        !           160: 
        !           161: /* offset for CLOSE statement */
        !           162: 
        !           163: #define XCLSTATUS      SZFLAG + SZIOINT
        !           164: 
        !           165: /* offsets for INQUIRE statement */
        !           166: 
        !           167: #define XFILE  SZFLAG + SZIOINT
        !           168: #define XFILELEN       SZFLAG + SZIOINT + SZADDR
        !           169: #define XEXISTS        SZFLAG + 2*SZIOINT + SZADDR
        !           170: #define XOPEN  SZFLAG + 2*SZIOINT + 2*SZADDR
        !           171: #define XNUMBER        SZFLAG + 2*SZIOINT + 3*SZADDR
        !           172: #define XNAMED SZFLAG + 2*SZIOINT + 4*SZADDR
        !           173: #define XNAME  SZFLAG + 2*SZIOINT + 5*SZADDR
        !           174: #define XNAMELEN       SZFLAG + 2*SZIOINT + 6*SZADDR
        !           175: #define XQACCESS       SZFLAG + 3*SZIOINT + 6*SZADDR
        !           176: #define XQACCLEN       SZFLAG + 3*SZIOINT + 7*SZADDR
        !           177: #define XSEQ   SZFLAG + 4*SZIOINT + 7*SZADDR
        !           178: #define XSEQLEN        SZFLAG + 4*SZIOINT + 8*SZADDR
        !           179: #define XDIRECT        SZFLAG + 5*SZIOINT + 8*SZADDR
        !           180: #define XDIRLEN        SZFLAG + 5*SZIOINT + 9*SZADDR
        !           181: #define XFORM  SZFLAG + 6*SZIOINT + 9*SZADDR
        !           182: #define XFORMLEN       SZFLAG + 6*SZIOINT + 10*SZADDR
        !           183: #define XFMTED SZFLAG + 7*SZIOINT + 10*SZADDR
        !           184: #define XFMTEDLEN      SZFLAG + 7*SZIOINT + 11*SZADDR
        !           185: #define XUNFMT SZFLAG + 8*SZIOINT + 11*SZADDR
        !           186: #define XUNFMTLEN      SZFLAG + 8*SZIOINT + 12*SZADDR
        !           187: #define XQRECL SZFLAG + 9*SZIOINT + 12*SZADDR
        !           188: #define XNEXTREC       SZFLAG + 9*SZIOINT + 13*SZADDR
        !           189: #define XQBLANK        SZFLAG + 9*SZIOINT + 14*SZADDR
        !           190: #define XQBLANKLEN     SZFLAG + 9*SZIOINT + 15*SZADDR
        !           191: 
        !           192: LOCAL char *cilist_names[] = {
        !           193:        "cilist",
        !           194:        "cierr",
        !           195:        "ciunit",
        !           196:        "ciend",
        !           197:        "cifmt",
        !           198:        "cirec"
        !           199:        };
        !           200: LOCAL char *icilist_names[] = {
        !           201:        "icilist",
        !           202:        "icierr",
        !           203:        "iciunit",
        !           204:        "iciend",
        !           205:        "icifmt",
        !           206:        "icirlen",
        !           207:        "icirnum"
        !           208:        };
        !           209: LOCAL char *olist_names[] = {
        !           210:        "olist",
        !           211:        "oerr",
        !           212:        "ounit",
        !           213:        "ofnm",
        !           214:        "ofnmlen",
        !           215:        "osta",
        !           216:        "oacc",
        !           217:        "ofm",
        !           218:        "orl",
        !           219:        "oblnk"
        !           220:        };
        !           221: LOCAL char *cllist_names[] = {
        !           222:        "cllist",
        !           223:        "cerr",
        !           224:        "cunit",
        !           225:        "csta"
        !           226:        };
        !           227: LOCAL char *alist_names[] = {
        !           228:        "alist",
        !           229:        "aerr",
        !           230:        "aunit"
        !           231:        };
        !           232: LOCAL char *inlist_names[] = {
        !           233:        "inlist",
        !           234:        "inerr",
        !           235:        "inunit",
        !           236:        "infile",
        !           237:        "infilen",
        !           238:        "inex",
        !           239:        "inopen",
        !           240:        "innum",
        !           241:        "innamed",
        !           242:        "inname",
        !           243:        "innamlen",
        !           244:        "inacc",
        !           245:        "inacclen",
        !           246:        "inseq",
        !           247:        "inseqlen",
        !           248:        "indir",
        !           249:        "indirlen",
        !           250:        "infmt",
        !           251:        "infmtlen",
        !           252:        "inform",
        !           253:        "informlen",
        !           254:        "inunf",
        !           255:        "inunflen",
        !           256:        "inrecl",
        !           257:        "innrec",
        !           258:        "inblank",
        !           259:        "inblanklen"
        !           260:        };
        !           261: 
        !           262: LOCAL char **io_fields;
        !           263: 
        !           264: #define zork(n,t) n, sizeof(n)/sizeof(char *) - 1, t
        !           265: 
        !           266: LOCAL io_setup io_stuff[] = {
        !           267:        zork(cilist_names, TYCILIST),   /* external read/write */
        !           268:        zork(inlist_names, TYINLIST),   /* inquire */
        !           269:        zork(olist_names,  TYOLIST),    /* open */
        !           270:        zork(cllist_names, TYCLLIST),   /* close */
        !           271:        zork(alist_names,  TYALIST),    /* rewind */
        !           272:        zork(alist_names,  TYALIST),    /* backspace */
        !           273:        zork(alist_names,  TYALIST),    /* endfile */
        !           274:        zork(icilist_names,TYICILIST),  /* internal read */
        !           275:        zork(icilist_names,TYICILIST)   /* internal write */
        !           276:        };
        !           277: 
        !           278: #undef zork
        !           279: 
        !           280: 
        !           281: fmtstmt(lp)
        !           282: register struct Labelblock *lp;
        !           283: {
        !           284:        if(lp == NULL)
        !           285:        {
        !           286:                execerr("unlabeled format statement" , CNULL);
        !           287:                return(-1);
        !           288:        }
        !           289:        if(lp->labtype == LABUNKNOWN)
        !           290:        {
        !           291:                lp->labtype = LABFORMAT;
        !           292:                lp->labelno = newlabel();
        !           293:        }
        !           294:        else if(lp->labtype != LABFORMAT)
        !           295:        {
        !           296:                execerr("bad format number", CNULL);
        !           297:                return(-1);
        !           298:        }
        !           299:        return(lp->labelno);
        !           300: }
        !           301: 
        !           302: 
        !           303: setfmt(lp)
        !           304: struct Labelblock *lp;
        !           305: {
        !           306:        int n;
        !           307:        char *s0, *lexline();
        !           308:        register char *s, *se, *t;
        !           309:        register k;
        !           310: 
        !           311:        s0 = s = lexline(&n);
        !           312:        se = t = s + n;
        !           313: 
        !           314:        /* warn of trivial errors, e.g. "  11 CONTINUE" (one too few spaces) */
        !           315:        /* following FORMAT... */
        !           316: 
        !           317:        if (n <= 0)
        !           318:                warn("No (...) after FORMAT");
        !           319:        else if (*s != '(')
        !           320:                warni("%c rather than ( after FORMAT", *s);
        !           321:        else if (se[-1] != ')') {
        !           322:                *se = 0;
        !           323:                while(--t > s && *t != ')') ;
        !           324:                if (t <= s)
        !           325:                        warn("No ) at end of FORMAT statement");
        !           326:                else if (se - t > 30)
        !           327:                        warn1("Extraneous text at end of FORMAT: ...%s", se-12);
        !           328:                else
        !           329:                        warn1("Extraneous text at end of FORMAT: %s", t+1);
        !           330:                t = se;
        !           331:                }
        !           332: 
        !           333:        /* fix MYQUOTES (\002's) and \\'s */
        !           334: 
        !           335:        while(s < se)
        !           336:                switch(*s++) {
        !           337:                        case 2:
        !           338:                                t += 3; break;
        !           339:                        case '"':
        !           340:                        case '\\':
        !           341:                                t++; break;
        !           342:                        }
        !           343:        s = s0;
        !           344:        if (lp) {
        !           345:                lp->fmtstring = t = mem((int)(t - s + 1), 0);
        !           346:                while(s < se)
        !           347:                        switch(k = *s++) {
        !           348:                                case 2:
        !           349:                                        t[0] = '\\';
        !           350:                                        t[1] = '0';
        !           351:                                        t[2] = '0';
        !           352:                                        t[3] = '2';
        !           353:                                        t += 4;
        !           354:                                        break;
        !           355:                                case '"':
        !           356:                                case '\\':
        !           357:                                        *t++ = '\\';
        !           358:                                        /* no break */
        !           359:                                default:
        !           360:                                        *t++ = k;
        !           361:                                }
        !           362:                *t = 0;
        !           363:                }
        !           364:        flline();
        !           365: }
        !           366: 
        !           367: 
        !           368: 
        !           369: startioctl()
        !           370: {
        !           371:        register int i;
        !           372: 
        !           373:        inioctl = YES;
        !           374:        nioctl = 0;
        !           375:        ioformatted = UNFORMATTED;
        !           376:        for(i = 1 ; i<=NIOS ; ++i)
        !           377:                V(i) = NULL;
        !           378: }
        !           379: 
        !           380:  static long
        !           381: newiolabel() {
        !           382:        long rv;
        !           383:        rv = ++lastiolabno;
        !           384:        skiplabel = mklabel(rv);
        !           385:        skiplabel->labdefined = 1;
        !           386:        return rv;
        !           387:        }
        !           388: 
        !           389: 
        !           390: endioctl()
        !           391: {
        !           392:        int i;
        !           393:        expptr p;
        !           394:        struct io_setup *ios;
        !           395: 
        !           396:        inioctl = NO;
        !           397: 
        !           398:        /* set up for error recovery */
        !           399: 
        !           400:        ioerrlab = ioendlab = skiplab = jumplab = 0;
        !           401: 
        !           402:        if(p = V(IOSEND))
        !           403:                if(ISICON(p))
        !           404:                        execlab(ioendlab = p->constblock.Const.ci);
        !           405:                else
        !           406:                        err("bad end= clause");
        !           407: 
        !           408:        if(p = V(IOSERR))
        !           409:                if(ISICON(p))
        !           410:                        execlab(ioerrlab = p->constblock.Const.ci);
        !           411:                else
        !           412:                        err("bad err= clause");
        !           413: 
        !           414:        if(IOSTP)
        !           415:                if(IOSTP->tag!=TADDR || ! ISINT(IOSTP->addrblock.vtype) )
        !           416:                {
        !           417:                        err("iostat must be an integer variable");
        !           418:                        frexpr(IOSTP);
        !           419:                        IOSTP = NULL;
        !           420:                }
        !           421: 
        !           422:        if(iostmt == IOREAD)
        !           423:        {
        !           424:                if(IOSTP)
        !           425:                {
        !           426:                        if(ioerrlab && ioendlab && ioerrlab==ioendlab)
        !           427:                                jumplab = ioerrlab;
        !           428:                        else
        !           429:                                skiplab = jumplab = newiolabel();
        !           430:                }
        !           431:                else    {
        !           432:                        if(ioerrlab && ioendlab && ioerrlab!=ioendlab)
        !           433:                        {
        !           434:                                IOSTP = (expptr) mktmp(TYINT, ENULL);
        !           435:                                skiplab = jumplab = newiolabel();
        !           436:                        }
        !           437:                        else
        !           438:                                jumplab = (ioerrlab ? ioerrlab : ioendlab);
        !           439:                }
        !           440:        }
        !           441:        else if(iostmt == IOWRITE)
        !           442:        {
        !           443:                if(IOSTP && !ioerrlab)
        !           444:                        skiplab = jumplab = newiolabel();
        !           445:                else
        !           446:                        jumplab = ioerrlab;
        !           447:        }
        !           448:        else
        !           449:                jumplab = ioerrlab;
        !           450: 
        !           451:        endbit = IOSTP!=NULL || ioendlab!=0;    /* for use in startrw() */
        !           452:        errbit = IOSTP!=NULL || ioerrlab!=0;
        !           453:        if (jumplab && !IOSTP)
        !           454:                IOSTP = (expptr) mktmp(TYINT, ENULL);
        !           455: 
        !           456:        if(iostmt!=IOREAD && iostmt!=IOWRITE)
        !           457:        {
        !           458:                ios = io_stuff + iostmt;
        !           459:                io_fields = ios->fields;
        !           460:                ioblkp = io_structs[iostmt];
        !           461:                if(ioblkp == NULL)
        !           462:                        io_structs[iostmt] = ioblkp =
        !           463:                                autovar(1, ios->type, ENULL, "");
        !           464:                ioset(TYIOINT, XERR, ICON(errbit));
        !           465:        }
        !           466: 
        !           467:        switch(iostmt)
        !           468:        {
        !           469:        case IOOPEN:
        !           470:                dofopen();
        !           471:                break;
        !           472: 
        !           473:        case IOCLOSE:
        !           474:                dofclose();
        !           475:                break;
        !           476: 
        !           477:        case IOINQUIRE:
        !           478:                dofinquire();
        !           479:                break;
        !           480: 
        !           481:        case IOBACKSPACE:
        !           482:                dofmove("f_back");
        !           483:                break;
        !           484: 
        !           485:        case IOREWIND:
        !           486:                dofmove("f_rew");
        !           487:                break;
        !           488: 
        !           489:        case IOENDFILE:
        !           490:                dofmove("f_end");
        !           491:                break;
        !           492: 
        !           493:        case IOREAD:
        !           494:        case IOWRITE:
        !           495:                startrw();
        !           496:                break;
        !           497: 
        !           498:        default:
        !           499:                fatali("impossible iostmt %d", iostmt);
        !           500:        }
        !           501:        for(i = 1 ; i<=NIOS ; ++i)
        !           502:                if(i!=IOSIOSTAT && V(i)!=NULL)
        !           503:                        frexpr(V(i));
        !           504: }
        !           505: 
        !           506: 
        !           507: 
        !           508: iocname()
        !           509: {
        !           510:        register int i;
        !           511:        int found, mask;
        !           512: 
        !           513:        found = 0;
        !           514:        mask = M(iostmt);
        !           515:        for(i = 1 ; i <= NIOS ; ++i)
        !           516:                if(!strcmp(ioc[i].iocname, token))
        !           517:                        if(ioc[i].iotype & mask)
        !           518:                                return(i);
        !           519:                        else {
        !           520:                                found = i;
        !           521:                                break;
        !           522:                                }
        !           523:        if(found) {
        !           524:                if (iostmt == IOOPEN && !strcmp(ioc[i].iocname, "name")) {
        !           525:                        NOEXT("open with \"name=\" treated as \"file=\"");
        !           526:                        for(i = 1; strcmp(ioc[i].iocname, "file"); i++);
        !           527:                        return i;
        !           528:                        }
        !           529:                errstr("invalid control %s for statement", ioc[found].iocname);
        !           530:                }
        !           531:        else
        !           532:                errstr("unknown iocontrol %s", token);
        !           533:        return(IOSBAD);
        !           534: }
        !           535: 
        !           536: 
        !           537: ioclause(n, p)
        !           538: register int n;
        !           539: register expptr p;
        !           540: {
        !           541:        struct Ioclist *iocp;
        !           542: 
        !           543:        ++nioctl;
        !           544:        if(n == IOSBAD)
        !           545:                return;
        !           546:        if(n == IOSPOSITIONAL)
        !           547:                {
        !           548:                n = nioctl;
        !           549:                if (n == IOSFMT) {
        !           550:                        if (iostmt == IOOPEN) {
        !           551:                                n = IOSFILE;
        !           552:                                NOEXT("file= specifier omitted from open");
        !           553:                                }
        !           554:                        else if (iostmt < IOREAD)
        !           555:                                goto illegal;
        !           556:                        }
        !           557:                else if(n > IOSFMT)
        !           558:                        {
        !           559:  illegal:
        !           560:                        err("illegal positional iocontrol");
        !           561:                        return;
        !           562:                        }
        !           563:                }
        !           564:        else if (n == IOSNML)
        !           565:                n = IOSFMT;
        !           566: 
        !           567:        if(p == NULL)
        !           568:        {
        !           569:                if(n == IOSUNIT)
        !           570:                        p = (expptr) (iostmt==IOREAD ? IOSTDIN : IOSTDOUT);
        !           571:                else if(n != IOSFMT)
        !           572:                {
        !           573:                        err("illegal * iocontrol");
        !           574:                        return;
        !           575:                }
        !           576:        }
        !           577:        if(n == IOSFMT)
        !           578:                ioformatted = (p==NULL ? LISTDIRECTED : FORMATTED);
        !           579: 
        !           580:        iocp = & ioc[n];
        !           581:        if(iocp->iocval == NULL)
        !           582:        {
        !           583:                if(n!=IOSFMT && ( n!=IOSUNIT || (p && p->headblock.vtype!=TYCHAR) ) )
        !           584:                        p = fixtype(p);
        !           585:                else if (p && p->tag == TPRIM
        !           586:                           && p->primblock.namep->vclass == CLUNKNOWN) {
        !           587:                        /* kludge made necessary by attempt to infer types
        !           588:                         * for untyped external parameters: given an error
        !           589:                         * in calling sequences, an integer argument might
        !           590:                         * tentatively be assumed TYCHAR; this would otherwise
        !           591:                         * be corrected too late in startrw after startrw
        !           592:                         * had decided this to be an internal file.
        !           593:                         */
        !           594:                        vardcl(p->primblock.namep);
        !           595:                        p->primblock.vtype = p->primblock.namep->vtype;
        !           596:                        }
        !           597:                iocp->iocval = p;
        !           598:        }
        !           599:        else
        !           600:                errstr("iocontrol %s repeated", iocp->iocname);
        !           601: }
        !           602: 
        !           603: /* io list item */
        !           604: 
        !           605: doio(list)
        !           606: chainp list;
        !           607: {
        !           608:        expptr call0();
        !           609: 
        !           610:        if(ioformatted == NAMEDIRECTED)
        !           611:        {
        !           612:                if(list)
        !           613:                        err("no I/O list allowed in NAMELIST read/write");
        !           614:        }
        !           615:        else
        !           616:        {
        !           617:                doiolist(list);
        !           618:                ioroutine[0] = 'e';
        !           619:                if (skiplab || ioroutine[4] == 'l')
        !           620:                        jumplab = 0;
        !           621:                putiocall( call0(TYINT, ioroutine) );
        !           622:        }
        !           623: }
        !           624: 
        !           625: 
        !           626: 
        !           627: 
        !           628: 
        !           629:  LOCAL void
        !           630: doiolist(p0)
        !           631:  chainp p0;
        !           632: {
        !           633:        chainp p;
        !           634:        register tagptr q;
        !           635:        register expptr qe;
        !           636:        register Namep qn;
        !           637:        Addrp tp, mkscalar();
        !           638:        int range;
        !           639:        extern char *ohalign;
        !           640: 
        !           641:        for (p = p0 ; p ; p = p->nextp)
        !           642:        {
        !           643:                q = (tagptr)p->datap;
        !           644:                if(q->tag == TIMPLDO)
        !           645:                {
        !           646:                        exdo(range=newlabel(), (Namep)0,
        !           647:                                q->impldoblock.impdospec);
        !           648:                        doiolist(q->impldoblock.datalist);
        !           649:                        enddo(range);
        !           650:                        free( (charptr) q);
        !           651:                }
        !           652:                else    {
        !           653:                        if(q->tag==TPRIM && q->primblock.argsp==NULL
        !           654:                            && q->primblock.namep->vdim!=NULL)
        !           655:                        {
        !           656:                                vardcl(qn = q->primblock.namep);
        !           657:                                if(qn->vdim->nelt) {
        !           658:                                        putio( fixtype(cpexpr(qn->vdim->nelt)),
        !           659:                                            (expptr)mkscalar(qn) );
        !           660:                                        qn->vlastdim = 0;
        !           661:                                        }
        !           662:                                else
        !           663:                                        err("attempt to i/o array of unknown size");
        !           664:                        }
        !           665:                        else if(q->tag==TPRIM && q->primblock.argsp==NULL &&
        !           666:                            (qe = (expptr) memversion(q->primblock.namep)) )
        !           667:                                putio(ICON(1),qe);
        !           668:                        else if (ISCONST(q) && q->constblock.vtype == TYCHAR) {
        !           669:                                halign = 0;
        !           670:                                putio(ICON(1), qe = fixtype(cpexpr(q)));
        !           671:                                halign = ohalign;
        !           672:                                }
        !           673:                        else if(((qe = fixtype(cpexpr(q)))->tag==TADDR &&
        !           674:                            (qe->addrblock.uname_tag != UNAM_CONST ||
        !           675:                            !ISCOMPLEX(qe -> addrblock.vtype))) ||
        !           676:                            (qe -> tag == TCONST && !ISCOMPLEX(qe ->
        !           677:                            headblock.vtype))) {
        !           678:                                if (qe -> tag == TCONST)
        !           679:                                        qe = (expptr) putconst((Constp)qe);
        !           680:                                putio(ICON(1), qe);
        !           681:                        }
        !           682:                        else if(qe->headblock.vtype != TYERROR)
        !           683:                        {
        !           684:                                if(iostmt == IOWRITE)
        !           685:                                {
        !           686:                                        ftnint lencat();
        !           687:                                        expptr qvl;
        !           688:                                        qvl = NULL;
        !           689:                                        if( ISCHAR(qe) )
        !           690:                                        {
        !           691:                                                qvl = (expptr)
        !           692:                                                    cpexpr(qe->headblock.vleng);
        !           693:                                                tp = mktmp(qe->headblock.vtype,
        !           694:                                                    ICON(lencat(qe)));
        !           695:                                        }
        !           696:                                        else
        !           697:                                                tp = mktmp(qe->headblock.vtype,
        !           698:                                                    qe->headblock.vleng);
        !           699:                                        puteq( cpexpr((expptr)tp), qe);
        !           700:                                        if(qvl) /* put right length on block */
        !           701:                                        {
        !           702:                                                frexpr(tp->vleng);
        !           703:                                                tp->vleng = qvl;
        !           704:                                        }
        !           705:                                        putio(ICON(1), (expptr)tp);
        !           706:                                }
        !           707:                                else
        !           708:                                        err("non-left side in READ list");
        !           709:                        }
        !           710:                        frexpr(q);
        !           711:                }
        !           712:        }
        !           713:        frchain( &p0 );
        !           714: }
        !           715: 
        !           716:  int iocalladdr = TYADDR;      /* for fixing TYADDR in saveargtypes */
        !           717:  int typeconv[TYERROR+1] = {
        !           718: #ifdef TYQUAD
        !           719:                0, 1, 11, 2, 3, 14, 4, 5, 6, 7, 12, 13, 8, 9, 10, 15
        !           720: #else
        !           721:                0, 1, 11, 2, 3,     4, 5, 6, 7, 12, 13, 8, 9, 10, 14
        !           722: #endif
        !           723:                };
        !           724: 
        !           725:  LOCAL void
        !           726: putio(nelt, addr)
        !           727:  expptr nelt;
        !           728:  register expptr addr;
        !           729: {
        !           730:        int type;
        !           731:        register expptr q;
        !           732:        register Addrp c = 0;
        !           733: 
        !           734:        type = addr->headblock.vtype;
        !           735:        if(ioformatted!=LISTDIRECTED && ISCOMPLEX(type) )
        !           736:        {
        !           737:                nelt = mkexpr(OPSTAR, ICON(2), nelt);
        !           738:                type -= (TYCOMPLEX-TYREAL);
        !           739:        }
        !           740: 
        !           741:        /* pass a length with every item.  for noncharacter data, fake one */
        !           742:        if(type != TYCHAR)
        !           743:        {
        !           744: 
        !           745:                if( ISCONST(addr) )
        !           746:                        addr = (expptr) putconst((Constp)addr);
        !           747:                c = ALLOC(Addrblock);
        !           748:                c->tag = TADDR;
        !           749:                c->vtype = TYLENG;
        !           750:                c->vstg = STGAUTO;
        !           751:                c->ntempelt = 1;
        !           752:                c->isarray = 1;
        !           753:                c->memoffset = ICON(0);
        !           754:                c->uname_tag = UNAM_IDENT;
        !           755:                c->charleng = 1;
        !           756:                sprintf(c->user.ident, "(ftnlen)sizeof(%s)", typename[type]);
        !           757:                addr = mkexpr(OPCHARCAST, addr, ENULL);
        !           758:                }
        !           759: 
        !           760:        nelt = fixtype( mkconv(tyioint,nelt) );
        !           761:        if(ioformatted == LISTDIRECTED) {
        !           762:                expptr mc = mkconv(tyioint, ICON(typeconv[type]));
        !           763:                q = c   ? call4(TYINT, "do_lio", mc, nelt, addr, (expptr)c)
        !           764:                        : call3(TYINT, "do_lio", mc, nelt, addr);
        !           765:                }
        !           766:        else {
        !           767:                char *s = ioformatted==FORMATTED ? "do_fio" : "do_uio";
        !           768:                q = c   ? call3(TYINT, s, nelt, addr, (expptr)c)
        !           769:                        : call2(TYINT, s, nelt, addr);
        !           770:                }
        !           771:        iocalladdr = TYCHAR;
        !           772:        putiocall(q);
        !           773:        iocalladdr = TYADDR;
        !           774: }
        !           775: 
        !           776: 
        !           777: 
        !           778: 
        !           779: endio()
        !           780: {
        !           781:        extern void p1_label();
        !           782: 
        !           783:        if(skiplab)
        !           784:        {
        !           785:                if (ioformatted != NAMEDIRECTED)
        !           786:                        p1_label((long)(skiplabel - labeltab));
        !           787:                if(ioendlab) {
        !           788:                        exif( mkexpr(OPLT, cpexpr(IOSTP), ICON(0)));
        !           789:                        exgoto(execlab(ioendlab));
        !           790:                        exendif();
        !           791:                        }
        !           792:                if(ioerrlab) {
        !           793:                        exif( mkexpr(iostmt==IOREAD||iostmt==IOWRITE
        !           794:                                        ? OPGT : OPNE,
        !           795:                                cpexpr(IOSTP), ICON(0)));
        !           796:                        exgoto(execlab(ioerrlab));
        !           797:                        exendif();
        !           798:                        }
        !           799:        }
        !           800: 
        !           801:        if(IOSTP)
        !           802:                frexpr(IOSTP);
        !           803: }
        !           804: 
        !           805: 
        !           806: 
        !           807:  LOCAL void
        !           808: putiocall(q)
        !           809:  register expptr q;
        !           810: {
        !           811:        int tyintsave;
        !           812: 
        !           813:        tyintsave = tyint;
        !           814:        tyint = tyioint;        /* for -I2 and -i2 */
        !           815: 
        !           816:        if(IOSTP)
        !           817:        {
        !           818:                q->headblock.vtype = TYINT;
        !           819:                q = fixexpr((Exprp)mkexpr(OPASSIGN, cpexpr(IOSTP), q));
        !           820:        }
        !           821:        putexpr(q);
        !           822:        if(jumplab) {
        !           823:                exif(mkexpr(OPNE, cpexpr(IOSTP), ICON(0)));
        !           824:                exgoto(execlab(jumplab));
        !           825:                exendif();
        !           826:                }
        !           827:        tyint = tyintsave;
        !           828: }
        !           829: 
        !           830:  void
        !           831: fmtname(np, q)
        !           832:  Namep np;
        !           833:  register Addrp q;
        !           834: {
        !           835:        register int k;
        !           836:        register char *s, *t;
        !           837:        extern chainp assigned_fmts;
        !           838: 
        !           839:        if (!np->vfmt_asg) {
        !           840:                np->vfmt_asg = 1;
        !           841:                assigned_fmts = mkchain((char *)np, assigned_fmts);
        !           842:                }
        !           843:        k = strlen(s = np->fvarname);
        !           844:        if (k < IDENT_LEN - 4) {
        !           845:                q->uname_tag = UNAM_IDENT;
        !           846:                t = q->user.ident;
        !           847:                }
        !           848:        else {
        !           849:                q->uname_tag = UNAM_CHARP;
        !           850:                q->user.Charp = t = mem(k + 5,0);
        !           851:                }
        !           852:        sprintf(t, "%s_fmt", s);
        !           853:        }
        !           854: 
        !           855: LOCAL Addrp asg_addr(p)
        !           856:  union Expression *p;
        !           857: {
        !           858:        register Addrp q;
        !           859: 
        !           860:        if (p->tag != TPRIM)
        !           861:                badtag("asg_addr", p->tag);
        !           862:        q = ALLOC(Addrblock);
        !           863:        q->tag = TADDR;
        !           864:        q->vtype = TYCHAR;
        !           865:        q->vstg = STGAUTO;
        !           866:        q->ntempelt = 1;
        !           867:        q->isarray = 0;
        !           868:        q->memoffset = ICON(0);
        !           869:        fmtname(p->primblock.namep, q);
        !           870:        return q;
        !           871:        }
        !           872: 
        !           873: startrw()
        !           874: {
        !           875:        register expptr p;
        !           876:        register Namep np;
        !           877:        register Addrp unitp, fmtp, recp;
        !           878:        register expptr nump;
        !           879:        Addrp mkscalar();
        !           880:        expptr mkaddcon();
        !           881:        int iostmt1;
        !           882:        flag intfile, sequential, ok, varfmt;
        !           883:        struct io_setup *ios;
        !           884: 
        !           885:        /* First look at all the parameters and determine what is to be done */
        !           886: 
        !           887:        ok = YES;
        !           888:        statstruct = YES;
        !           889: 
        !           890:        intfile = NO;
        !           891:        if(p = V(IOSUNIT))
        !           892:        {
        !           893:                if( ISINT(p->headblock.vtype) ) {
        !           894:  int_unit:
        !           895:                        unitp = (Addrp) cpexpr(p);
        !           896:                        }
        !           897:                else if(p->headblock.vtype == TYCHAR)
        !           898:                {
        !           899:                        if (nioctl == 1 && iostmt == IOREAD) {
        !           900:                                /* kludge to recognize READ(format expr) */
        !           901:                                V(IOSFMT) = p;
        !           902:                                V(IOSUNIT) = p = (expptr) IOSTDIN;
        !           903:                                ioformatted = FORMATTED;
        !           904:                                goto int_unit;
        !           905:                                }
        !           906:                        intfile = YES;
        !           907:                        if(p->tag==TPRIM && p->primblock.argsp==NULL &&
        !           908:                            (np = p->primblock.namep)->vdim!=NULL)
        !           909:                        {
        !           910:                                vardcl(np);
        !           911:                                if(nump = np->vdim->nelt)
        !           912:                                {
        !           913:                                        nump = fixtype(cpexpr(nump));
        !           914:                                        if( ! ISCONST(nump) ) {
        !           915:                                                statstruct = NO;
        !           916:                                                np->vlastdim = 0;
        !           917:                                                }
        !           918:                                }
        !           919:                                else
        !           920:                                {
        !           921:                                        err("attempt to use internal unit array of unknown size");
        !           922:                                        ok = NO;
        !           923:                                        nump = ICON(1);
        !           924:                                }
        !           925:                                unitp = mkscalar(np);
        !           926:                        }
        !           927:                        else    {
        !           928:                                nump = ICON(1);
        !           929:                                unitp = (Addrp /*pjw */) fixtype(cpexpr(p));
        !           930:                        }
        !           931:                        if(! isstatic((expptr)unitp) )
        !           932:                                statstruct = NO;
        !           933:                }
        !           934:                else {
        !           935:                        err("unit specifier not of type integer or character");
        !           936:                        ok = NO;
        !           937:                        }
        !           938:        }
        !           939:        else
        !           940:        {
        !           941:                err("bad unit specifier");
        !           942:                ok = NO;
        !           943:        }
        !           944: 
        !           945:        sequential = YES;
        !           946:        if(p = V(IOSREC))
        !           947:                if( ISINT(p->headblock.vtype) )
        !           948:                {
        !           949:                        recp = (Addrp) cpexpr(p);
        !           950:                        sequential = NO;
        !           951:                }
        !           952:                else    {
        !           953:                        err("bad REC= clause");
        !           954:                        ok = NO;
        !           955:                }
        !           956:        else
        !           957:                recp = NULL;
        !           958: 
        !           959: 
        !           960:        varfmt = YES;
        !           961:        fmtp = NULL;
        !           962:        if(p = V(IOSFMT))
        !           963:        {
        !           964:                if(p->tag==TPRIM && p->primblock.argsp==NULL)
        !           965:                {
        !           966:                        np = p->primblock.namep;
        !           967:                        if(np->vclass == CLNAMELIST)
        !           968:                        {
        !           969:                                ioformatted = NAMEDIRECTED;
        !           970:                                fmtp = (Addrp) fixtype(p);
        !           971:                                V(IOSFMT) = (expptr)fmtp;
        !           972:                                if (skiplab)
        !           973:                                        jumplab = 0;
        !           974:                                goto endfmt;
        !           975:                        }
        !           976:                        vardcl(np);
        !           977:                        if(np->vdim)
        !           978:                        {
        !           979:                                if( ! ONEOF(np->vstg, MSKSTATIC) )
        !           980:                                        statstruct = NO;
        !           981:                                fmtp = mkscalar(np);
        !           982:                                goto endfmt;
        !           983:                        }
        !           984:                        if( ISINT(np->vtype) )  /* ASSIGNed label */
        !           985:                        {
        !           986:                                statstruct = NO;
        !           987:                                varfmt = YES;
        !           988:                                fmtp = asg_addr(p);
        !           989:                                goto endfmt;
        !           990:                        }
        !           991:                }
        !           992:                p = V(IOSFMT) = fixtype(p);
        !           993:                if(p->headblock.vtype == TYCHAR
        !           994:                        /* Since we allow write(6,n)            */
        !           995:                        /* we may as well allow write(6,n(2))   */
        !           996:                || p->tag == TADDR && ISINT(p->addrblock.vtype))
        !           997:                {
        !           998:                        if( ! isstatic(p) )
        !           999:                                statstruct = NO;
        !          1000:                        fmtp = (Addrp) cpexpr(p);
        !          1001:                }
        !          1002:                else if( ISICON(p) )
        !          1003:                {
        !          1004:                        struct Labelblock *lp;
        !          1005:                        lp = mklabel(p->constblock.Const.ci);
        !          1006:                        if (fmtstmt(lp) > 0)
        !          1007:                        {
        !          1008:                                fmtp = (Addrp)mkaddcon(lp->stateno);
        !          1009:                                /* lp->stateno for names fmt_nnn */
        !          1010:                                lp->fmtlabused = 1;
        !          1011:                                varfmt = NO;
        !          1012:                        }
        !          1013:                        else
        !          1014:                                ioformatted = UNFORMATTED;
        !          1015:                }
        !          1016:                else    {
        !          1017:                        err("bad format descriptor");
        !          1018:                        ioformatted = UNFORMATTED;
        !          1019:                        ok = NO;
        !          1020:                }
        !          1021:        }
        !          1022:        else
        !          1023:                fmtp = NULL;
        !          1024: 
        !          1025: endfmt:
        !          1026:        if(intfile) {
        !          1027:                if (ioformatted==UNFORMATTED) {
        !          1028:                        err("unformatted internal I/O not allowed");
        !          1029:                        ok = NO;
        !          1030:                        }
        !          1031:                if (recp) {
        !          1032:                        err("direct internal I/O not allowed");
        !          1033:                        ok = NO;
        !          1034:                        }
        !          1035:                }
        !          1036:        if(!sequential && ioformatted==LISTDIRECTED)
        !          1037:        {
        !          1038:                err("direct list-directed I/O not allowed");
        !          1039:                ok = NO;
        !          1040:        }
        !          1041:        if(!sequential && ioformatted==NAMEDIRECTED)
        !          1042:        {
        !          1043:                err("direct namelist I/O not allowed");
        !          1044:                ok = NO;
        !          1045:        }
        !          1046: 
        !          1047:        if( ! ok ) {
        !          1048:                statstruct = NO;
        !          1049:                return;
        !          1050:                }
        !          1051: 
        !          1052:        /*
        !          1053:    Now put out the I/O structure, statically if all the clauses
        !          1054:    are constants, dynamically otherwise
        !          1055: */
        !          1056: 
        !          1057:        if (intfile) {
        !          1058:                ios = io_stuff + iostmt;
        !          1059:                iostmt1 = IOREAD;
        !          1060:                }
        !          1061:        else {
        !          1062:                ios = io_stuff;
        !          1063:                iostmt1 = 0;
        !          1064:                }
        !          1065:        io_fields = ios->fields;
        !          1066:        if(statstruct)
        !          1067:        {
        !          1068:                ioblkp = ALLOC(Addrblock);
        !          1069:                ioblkp->tag = TADDR;
        !          1070:                ioblkp->vtype = ios->type;
        !          1071:                ioblkp->vclass = CLVAR;
        !          1072:                ioblkp->vstg = STGINIT;
        !          1073:                ioblkp->memno = ++lastvarno;
        !          1074:                ioblkp->memoffset = ICON(0);
        !          1075:                ioblkp -> uname_tag = UNAM_IDENT;
        !          1076:                new_iob_data(ios,
        !          1077:                        temp_name("io_", lastvarno, ioblkp->user.ident));                       }
        !          1078:        else if(!(ioblkp = io_structs[iostmt1]))
        !          1079:                io_structs[iostmt1] = ioblkp =
        !          1080:                        autovar(1, ios->type, ENULL, "");
        !          1081: 
        !          1082:        ioset(TYIOINT, XERR, ICON(errbit));
        !          1083:        if(iostmt == IOREAD)
        !          1084:                ioset(TYIOINT, (intfile ? XIEND : XEND), ICON(endbit) );
        !          1085: 
        !          1086:        if(intfile)
        !          1087:        {
        !          1088:                ioset(TYIOINT, XIRNUM, nump);
        !          1089:                ioset(TYIOINT, XIRLEN, cpexpr(unitp->vleng) );
        !          1090:                ioseta(XIUNIT, unitp);
        !          1091:        }
        !          1092:        else
        !          1093:                ioset(TYIOINT, XUNIT, (expptr) unitp);
        !          1094: 
        !          1095:        if(recp)
        !          1096:                ioset(TYIOINT, /* intfile ? XIREC : */ XREC, (expptr) recp);
        !          1097: 
        !          1098:        if(varfmt)
        !          1099:                ioseta( intfile ? XIFMT : XFMT , fmtp);
        !          1100:        else
        !          1101:                ioset(TYADDR, intfile ? XIFMT : XFMT, (expptr) fmtp);
        !          1102: 
        !          1103:        ioroutine[0] = 's';
        !          1104:        ioroutine[1] = '_';
        !          1105:        ioroutine[2] = iostmt==IOREAD ? 'r' : 'w';
        !          1106:        ioroutine[3] = "ds"[sequential];
        !          1107:        ioroutine[4] = "ufln"[ioformatted];
        !          1108:        ioroutine[5] = "ei"[intfile];
        !          1109:        ioroutine[6] = '\0';
        !          1110: 
        !          1111:        putiocall( call1(TYINT, ioroutine, cpexpr((expptr)ioblkp) ));
        !          1112: 
        !          1113:        if(statstruct)
        !          1114:        {
        !          1115:                frexpr((expptr)ioblkp);
        !          1116:                statstruct = NO;
        !          1117:                ioblkp = 0;     /* unnecessary */
        !          1118:        }
        !          1119: }
        !          1120: 
        !          1121: 
        !          1122: 
        !          1123:  LOCAL void
        !          1124: dofopen()
        !          1125: {
        !          1126:        register expptr p;
        !          1127: 
        !          1128:        if( (p = V(IOSUNIT)) && ISINT(p->headblock.vtype) )
        !          1129:                ioset(TYIOINT, XUNIT, cpexpr(p) );
        !          1130:        else
        !          1131:                err("bad unit in open");
        !          1132:        if( (p = V(IOSFILE)) )
        !          1133:                if(p->headblock.vtype == TYCHAR)
        !          1134:                        ioset(TYIOINT, XFNAMELEN, cpexpr(p->headblock.vleng) );
        !          1135:                else
        !          1136:                        err("bad file in open");
        !          1137: 
        !          1138:        iosetc(XFNAME, p);
        !          1139: 
        !          1140:        if(p = V(IOSRECL))
        !          1141:                if( ISINT(p->headblock.vtype) )
        !          1142:                        ioset(TYIOINT, XRECLEN, cpexpr(p) );
        !          1143:                else
        !          1144:                        err("bad recl");
        !          1145:        else
        !          1146:                ioset(TYIOINT, XRECLEN, ICON(0) );
        !          1147: 
        !          1148:        iosetc(XSTATUS, V(IOSSTATUS));
        !          1149:        iosetc(XACCESS, V(IOSACCESS));
        !          1150:        iosetc(XFORMATTED, V(IOSFORM));
        !          1151:        iosetc(XBLANK, V(IOSBLANK));
        !          1152: 
        !          1153:        putiocall( call1(TYINT, "f_open", cpexpr((expptr)ioblkp) ));
        !          1154: }
        !          1155: 
        !          1156: 
        !          1157:  LOCAL void
        !          1158: dofclose()
        !          1159: {
        !          1160:        register expptr p;
        !          1161: 
        !          1162:        if( (p = V(IOSUNIT)) && ISINT(p->headblock.vtype) )
        !          1163:        {
        !          1164:                ioset(TYIOINT, XUNIT, cpexpr(p) );
        !          1165:                iosetc(XCLSTATUS, V(IOSSTATUS));
        !          1166:                putiocall( call1(TYINT, "f_clos", cpexpr((expptr)ioblkp)) );
        !          1167:        }
        !          1168:        else
        !          1169:                err("bad unit in close statement");
        !          1170: }
        !          1171: 
        !          1172: 
        !          1173:  LOCAL void
        !          1174: dofinquire()
        !          1175: {
        !          1176:        register expptr p;
        !          1177:        if(p = V(IOSUNIT))
        !          1178:        {
        !          1179:                if( V(IOSFILE) )
        !          1180:                        err("inquire by unit or by file, not both");
        !          1181:                ioset(TYIOINT, XUNIT, cpexpr(p) );
        !          1182:        }
        !          1183:        else if( ! V(IOSFILE) )
        !          1184:                err("must inquire by unit or by file");
        !          1185:        iosetlc(IOSFILE, XFILE, XFILELEN);
        !          1186:        iosetip(IOSEXISTS, XEXISTS);
        !          1187:        iosetip(IOSOPENED, XOPEN);
        !          1188:        iosetip(IOSNUMBER, XNUMBER);
        !          1189:        iosetip(IOSNAMED, XNAMED);
        !          1190:        iosetlc(IOSNAME, XNAME, XNAMELEN);
        !          1191:        iosetlc(IOSACCESS, XQACCESS, XQACCLEN);
        !          1192:        iosetlc(IOSSEQUENTIAL, XSEQ, XSEQLEN);
        !          1193:        iosetlc(IOSDIRECT, XDIRECT, XDIRLEN);
        !          1194:        iosetlc(IOSFORM, XFORM, XFORMLEN);
        !          1195:        iosetlc(IOSFORMATTED, XFMTED, XFMTEDLEN);
        !          1196:        iosetlc(IOSUNFORMATTED, XUNFMT, XUNFMTLEN);
        !          1197:        iosetip(IOSRECL, XQRECL);
        !          1198:        iosetip(IOSNEXTREC, XNEXTREC);
        !          1199:        iosetlc(IOSBLANK, XQBLANK, XQBLANKLEN);
        !          1200: 
        !          1201:        putiocall( call1(TYINT,  "f_inqu", cpexpr((expptr)ioblkp) ));
        !          1202: }
        !          1203: 
        !          1204: 
        !          1205: 
        !          1206:  LOCAL void
        !          1207: dofmove(subname)
        !          1208:  char *subname;
        !          1209: {
        !          1210:        register expptr p;
        !          1211: 
        !          1212:        if( (p = V(IOSUNIT)) && ISINT(p->headblock.vtype) )
        !          1213:        {
        !          1214:                ioset(TYIOINT, XUNIT, cpexpr(p) );
        !          1215:                putiocall( call1(TYINT, subname, cpexpr((expptr)ioblkp) ));
        !          1216:        }
        !          1217:        else
        !          1218:                err("bad unit in I/O motion statement");
        !          1219: }
        !          1220: 
        !          1221: static int ioset_assign = OPASSIGN;
        !          1222: 
        !          1223:  LOCAL void
        !          1224: ioset(type, offset, p)
        !          1225:  int type, offset;
        !          1226:  register expptr p;
        !          1227: {
        !          1228:        offset /= SZLONG;
        !          1229:        if(statstruct && ISCONST(p)) {
        !          1230:                register char *s;
        !          1231:                switch(type) {
        !          1232:                        case TYADDR:    /* stmt label */
        !          1233:                                s = "fmt_";
        !          1234:                                break;
        !          1235:                        case TYIOINT:
        !          1236:                                s = "";
        !          1237:                                break;
        !          1238:                        default:
        !          1239:                                badtype("ioset", type);
        !          1240:                        }
        !          1241:                iob_list->fields[offset] =
        !          1242:                        string_num(s, p->constblock.Const.ci);
        !          1243:                frexpr(p);
        !          1244:                }
        !          1245:        else {
        !          1246:                register Addrp q;
        !          1247: 
        !          1248:                q = ALLOC(Addrblock);
        !          1249:                q->tag = TADDR;
        !          1250:                q->vtype = type;
        !          1251:                q->vstg = STGAUTO;
        !          1252:                q->ntempelt = 1;
        !          1253:                q->isarray = 0;
        !          1254:                q->memoffset = ICON(0);
        !          1255:                q->uname_tag = UNAM_IDENT;
        !          1256:                sprintf(q->user.ident, "%s.%s",
        !          1257:                        statstruct ? iob_list->name : ioblkp->user.ident,
        !          1258:                        io_fields[offset + 1]);
        !          1259:                if (type == TYADDR && p->tag == TCONST
        !          1260:                                   && p->constblock.vtype == TYADDR) {
        !          1261:                        /* kludge */
        !          1262:                        register Addrp p1;
        !          1263:                        p1 = ALLOC(Addrblock);
        !          1264:                        p1->tag = TADDR;
        !          1265:                        p1->vtype = type;
        !          1266:                        p1->vstg = STGAUTO;     /* wrong, but who cares? */
        !          1267:                        p1->ntempelt = 1;
        !          1268:                        p1->isarray = 0;
        !          1269:                        p1->memoffset = ICON(0);
        !          1270:                        p1->uname_tag = UNAM_IDENT;
        !          1271:                        sprintf(p1->user.ident, "fmt_%ld",
        !          1272:                                p->constblock.Const.ci);
        !          1273:                        frexpr(p);
        !          1274:                        p = (expptr)p1;
        !          1275:                        }
        !          1276:                if (type == TYADDR && p->headblock.vtype == TYCHAR)
        !          1277:                        q->vtype = TYCHAR;
        !          1278:                putexpr(mkexpr(ioset_assign, (expptr)q, p));
        !          1279:                }
        !          1280: }
        !          1281: 
        !          1282: 
        !          1283: 
        !          1284: 
        !          1285:  LOCAL void
        !          1286: iosetc(offset, p)
        !          1287:  int offset;
        !          1288:  register expptr p;
        !          1289: {
        !          1290:        extern Addrp putchop();
        !          1291: 
        !          1292:        if(p == NULL)
        !          1293:                ioset(TYADDR, offset, ICON(0) );
        !          1294:        else if(p->headblock.vtype == TYCHAR) {
        !          1295:                p = putx(fixtype((expptr)putchop(cpexpr(p))));
        !          1296:                ioset(TYADDR, offset, addrof(p));
        !          1297:                }
        !          1298:        else
        !          1299:                err("non-character control clause");
        !          1300: }
        !          1301: 
        !          1302: 
        !          1303: 
        !          1304:  LOCAL void
        !          1305: ioseta(offset, p)
        !          1306:  int offset;
        !          1307:  register Addrp p;
        !          1308: {
        !          1309:        char *s, *s1;
        !          1310:        static char who[] = "ioseta";
        !          1311:        expptr e, mo;
        !          1312:        Namep np;
        !          1313:        ftnint ci;
        !          1314:        int k;
        !          1315:        char buf[24], buf1[24];
        !          1316:        Extsym *comm;
        !          1317:        extern int usedefsforcommon;
        !          1318: 
        !          1319:        if(statstruct)
        !          1320:        {
        !          1321:                if (!p)
        !          1322:                        return;
        !          1323:                if (p->tag != TADDR)
        !          1324:                        badtag(who, p->tag);
        !          1325:                offset /= SZLONG;
        !          1326:                switch(p->uname_tag) {
        !          1327:                    case UNAM_NAME:
        !          1328:                        mo = p->memoffset;
        !          1329:                        if (mo->tag != TCONST)
        !          1330:                                badtag("ioseta/memoffset", mo->tag);
        !          1331:                        np = p->user.name;
        !          1332:                        np->visused = 1;
        !          1333:                        ci = mo->constblock.Const.ci - np->voffset;
        !          1334:                        if (np->vstg == STGCOMMON
        !          1335:                        && !np->vcommequiv
        !          1336:                        && !usedefsforcommon) {
        !          1337:                                comm = &extsymtab[np->vardesc.varno];
        !          1338:                                sprintf(buf, "%d.", comm->curno);
        !          1339:                                k = strlen(buf) + strlen(comm->cextname)
        !          1340:                                        + strlen(np->cvarname);
        !          1341:                                if (ci) {
        !          1342:                                        sprintf(buf1, "+%ld", ci);
        !          1343:                                        k += strlen(buf1);
        !          1344:                                        }
        !          1345:                                else
        !          1346:                                        buf1[0] = 0;
        !          1347:                                s = mem(k + 1, 0);
        !          1348:                                sprintf(s, "%s%s%s%s", comm->cextname, buf,
        !          1349:                                        np->cvarname, buf1);
        !          1350:                                }
        !          1351:                        else if (ci) {
        !          1352:                                sprintf(buf,"%ld", ci);
        !          1353:                                s1 = p->user.name->cvarname;
        !          1354:                                k = strlen(buf) + strlen(s1);
        !          1355:                                sprintf(s = mem(k+2,0), "%s+%s", s1, buf);
        !          1356:                                }
        !          1357:                        else
        !          1358:                                s = cpstring(np->cvarname);
        !          1359:                        break;
        !          1360:                    case UNAM_CONST:
        !          1361:                        s = tostring(p->user.Const.ccp1.ccp0,
        !          1362:                                (int)p->vleng->constblock.Const.ci);
        !          1363:                        break;
        !          1364:                    default:
        !          1365:                        badthing("uname_tag", who, p->uname_tag);
        !          1366:                    }
        !          1367:                /* kludge for Hollerith */
        !          1368:                if (p->vtype != TYCHAR) {
        !          1369:                        s1 = mem(strlen(s)+10,0);
        !          1370:                        sprintf(s1, "(char *)%s%s", p->isarray ? "" : "&", s);
        !          1371:                        s = s1;
        !          1372:                        }
        !          1373:                iob_list->fields[offset] = s;
        !          1374:        }
        !          1375:        else {
        !          1376:                if (!p)
        !          1377:                        e = ICON(0);
        !          1378:                else if (p->vtype != TYCHAR) {
        !          1379:                        NOEXT("non-character variable as format or internal unit");
        !          1380:                        e = mkexpr(OPCHARCAST, (expptr)p, ENULL);
        !          1381:                        }
        !          1382:                else
        !          1383:                        e = addrof((expptr)p);
        !          1384:                ioset(TYADDR, offset, e);
        !          1385:                }
        !          1386: }
        !          1387: 
        !          1388: 
        !          1389: 
        !          1390: 
        !          1391:  LOCAL void
        !          1392: iosetip(i, offset)
        !          1393:  int i, offset;
        !          1394: {
        !          1395:        register expptr p;
        !          1396: 
        !          1397:        if(p = V(i))
        !          1398:                if(p->tag==TADDR &&
        !          1399:                    ONEOF(p->addrblock.vtype, inqmask) ) {
        !          1400:                        ioset_assign = OPASSIGNI;
        !          1401:                        ioset(TYADDR, offset, addrof(cpexpr(p)) );
        !          1402:                        ioset_assign = OPASSIGN;
        !          1403:                        }
        !          1404:                else
        !          1405:                        errstr("impossible inquire parameter %s", ioc[i].iocname);
        !          1406:        else
        !          1407:                ioset(TYADDR, offset, ICON(0) );
        !          1408: }
        !          1409: 
        !          1410: 
        !          1411: 
        !          1412:  LOCAL void
        !          1413: iosetlc(i, offp, offl)
        !          1414:  int i, offp, offl;
        !          1415: {
        !          1416:        register expptr p;
        !          1417:        if( (p = V(i)) && p->headblock.vtype==TYCHAR)
        !          1418:                ioset(TYIOINT, offl, cpexpr(p->headblock.vleng) );
        !          1419:        iosetc(offp, p);
        !          1420: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.