Annotation of 42BSD/ingres/source/parser/range_fcn.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <aux.h>
        !             3: # include      <tree.h>
        !             4: # include      <symbol.h>
        !             5: # include      <range.h>
        !             6: # include      "parser.h"
        !             7: # include      <sccs.h>
        !             8: 
        !             9: SCCSID(@(#)range_fcn.c 7.1     2/5/81)
        !            10: 
        !            11: /*
        !            12: **     Range table variables
        !            13: */
        !            14: 
        !            15: PARRNG                 Parrng[MAXRANGE]; /* table for keeping track of atts */
        !            16:                                          /* and allocation of range vars */
        !            17: int                    Resrng;         /* result reln slot */
        !            18: 
        !            19: PARRNG                 *Rngfront;      /* the front of Rnga */
        !            20: PARRNG                 *Rngback;       /* the back of Qt.qt_rangev */
        !            21: 
        !            22: 
        !            23: /*
        !            24: **  RANGE_FCN.C -- functions for manipulating the range table
        !            25: **
        !            26: **     Trace Flags:
        !            27: **             RANGE_FCN.C ~~ 66, 67
        !            28: */
        !            29: 
        !            30: ctlmod_decl(slot)
        !            31: int    slot;
        !            32: {
        !            33:        extern PARRNG   Parrng[];
        !            34: 
        !            35:        Qt.qt_rangev[slot].rngvdesc = NULL;
        !            36:        if (declare(slot, &Parrng[slot].vardesc) != slot)
        !            37:                syserr("declare misdeclared");
        !            38: }
        !            39: 
        !            40: /*
        !            41: **  RNGINIT
        !            42: **     initializes the pointers in the range table
        !            43: **     it should be called prior to starting the parsing
        !            44: **     it also initializes the attrib stash stuff because
        !            45: **     the attrib stash is really part of the range table
        !            46: **
        !            47: **     Trace Flags:
        !            48: **             rnginit ~~ 66.0
        !            49: */
        !            50: rnginit()
        !            51: {
        !            52:        register int            slot;
        !            53:        register PARRNG         *parrngptr;
        !            54:        register RANGEV         *rngptr;
        !            55: 
        !            56: #      ifdef   xPTR2
        !            57:        tTfp(66, 0, "rnginit\n");
        !            58: #      endif
        !            59: 
        !            60:        Rngfront = &Parrng[MAXVAR - 1];                 /* ptr to head of range table */
        !            61:        parrngptr = Parrng;
        !            62:        /* initialize first element */
        !            63:        parrngptr->attlist = NULL;
        !            64:        parrngptr->backpt = NULL;
        !            65:        parrngptr->frontpt = &Parrng[1];
        !            66: 
        !            67:        rngptr = Qt.qt_rangev;
        !            68: 
        !            69:        for (slot = 0, parrngptr = &Parrng[1]; slot < MAXVAR; slot++, parrngptr++)
        !            70:        {
        !            71:                parrngptr->attlist = NULL;
        !            72: 
        !            73:                parrngptr->frontpt = parrngptr + 1;
        !            74:                parrngptr->backpt = parrngptr - 1;
        !            75:        }
        !            76: 
        !            77:        Rngback = Parrng;
        !            78: 
        !            79:        parrngptr = &Parrng[MAXVAR - 1];
        !            80: 
        !            81:        parrngptr->frontpt = NULL;
        !            82: 
        !            83:        /* MAXVAR SLOT = Resultvar */
        !            84:        (++parrngptr)->attlist = NULL;
        !            85:        parrngptr->frontpt = parrngptr->backpt = NULL;
        !            86: 
        !            87:        Rngfront->frontpt = NULL;
        !            88: 
        !            89:        clrrange();
        !            90: 
        !            91:        attinit();
        !            92: }
        !            93: 
        !            94: /*
        !            95: ** RNGLOOK
        !            96: **     returns a pointer to the range table entry else 0
        !            97: **     type = LOOKREL  lookup relation
        !            98: **     type = LOOKVAR  lookup variable
        !            99: **
        !           100: **     Trace Flags:
        !           101: **             rnglook ~~ 66.4, 66.5, 66.6
        !           102: */
        !           103: int
        !           104: rnglook(name, type)
        !           105: char           *name;
        !           106: int            type;
        !           107: {
        !           108:        register PARRNG         *rptr;
        !           109: 
        !           110:        register int            slot;
        !           111: 
        !           112: #      ifdef   xPTR2
        !           113:        tTfp(66, 4, "rnglook:\ttype = %s\tname = %s\n",
        !           114:                    (type == LOOKVAR ? "variable" : "relation"), name);
        !           115: 
        !           116:        if (tTf(66, 5))
        !           117:                printtable();
        !           118: #      endif
        !           119: 
        !           120:        rptr = Parrng;
        !           121: 
        !           122:        for (slot = 0; slot < MAXVAR; slot++, rptr++)   /* search external vbles only */
        !           123:        {
        !           124:                if (rptr->relvused
        !           125:                    && scompare(name, MAXNAME,
        !           126:                    (type == LOOKVAR ? rptr->vardesc.relvname : rptr->vardesc.reldum.relid),
        !           127:                    MAXNAME) == 0)
        !           128:                {
        !           129:                        Qt.qt_rangev[slot].rngvmark = 1;
        !           130:                        
        !           131: #                      ifdef   xPTR2
        !           132:                        tTfp(66, 6, "fnd '%s' at '%d'\n", name, slot);
        !           133: #                      endif
        !           134: 
        !           135:                        rngfront(slot);
        !           136:                        return (slot);
        !           137:                }
        !           138:        }
        !           139:        return (-1);
        !           140: }
        !           141: 
        !           142: /*
        !           143: **  RNGENT
        !           144: **
        !           145: **     Insert variable and relation in range table.
        !           146: **
        !           147: **     Trace Flags:
        !           148: **              rngent ~~ 66.8
        !           149: */
        !           150: 
        !           151: int
        !           152: rngent(type, var, desc)
        !           153: int                    type;
        !           154: char                   *var;
        !           155: register DESC          *desc;
        !           156: {
        !           157:        register PARRNG *rptr;
        !           158:        register int    slot;
        !           159: 
        !           160: #      ifdef   xPTR2
        !           161:        tTfp(66, 8, "rngent:\ttype=%s\tvar=%s\n",
        !           162:                (type == R_INTERNAL ? "internal" : "external"), var);
        !           163: #      endif
        !           164: 
        !           165:        if (type == R_INTERNAL)
        !           166:                slot = MAXVAR;          /* the internal variable */
        !           167:        else
        !           168:        {
        !           169:                if ((slot = rnglook(var, LOOKVAR)) < 0)
        !           170:                {
        !           171:                        /* not in range table */
        !           172:                        slot = rngold();
        !           173:                }
        !           174: 
        !           175:                rngfront(slot);
        !           176:        }
        !           177: 
        !           178:        rptr = &Parrng[slot];
        !           179: 
        !           180:        if (scompare(desc->reldum.relid, MAXNAME + 2,
        !           181:            rptr->vardesc.reldum.relid, MAXNAME + 2) != 0)
        !           182:        {
        !           183:                attfree(rptr->attlist);
        !           184:                rptr->attlist = NULL;
        !           185:        }
        !           186: 
        !           187:        rptr->relvused = 1;
        !           188: 
        !           189:        bmove(desc, &rptr->vardesc, sizeof(*desc));
        !           190:        pmove(var, rptr->vardesc.relvname, MAXNAME, ' ');
        !           191: 
        !           192:        ctlmod_decl(slot);
        !           193: 
        !           194:        return (slot);
        !           195: }
        !           196: 
        !           197: /*
        !           198: ** RNGDEL
        !           199: **     removes an entry from the range table
        !           200: **     removes all variables for the relation name
        !           201: **
        !           202: **     Trace Flags:
        !           203: **              rngdel ~~ 66.12
        !           204: */
        !           205: rngdel(rel)
        !           206: register char  *rel;
        !           207: {
        !           208:        register int    slot;
        !           209: 
        !           210: # ifdef        xPTR2
        !           211:        tTfp(66, 12, "rngdel: %12s\n", rel);
        !           212: # endif
        !           213: 
        !           214:        while ((slot = rnglook(rel, LOOKREL)) >= 0)
        !           215:        {
        !           216:                Parrng[slot].relvused = 0;
        !           217:                rngback(slot);
        !           218:                attfree(Parrng[slot].attlist);
        !           219:                Parrng[slot].attlist = NULL;
        !           220:        }
        !           221: }
        !           222: 
        !           223: 
        !           224: /*
        !           225: ** RNGFRONT
        !           226: **     move entry 'r' to head of range table list
        !           227: **
        !           228: **     Trace Flags:
        !           229: **              rngfront ~~ 67.0 
        !           230: */
        !           231: rngfront(slot)
        !           232: int    slot;
        !           233: {
        !           234:        register PARRNG         *fptr;
        !           235: 
        !           236: #      ifdef   xPTR2
        !           237:        tTfp(67, 0, "rngfront:\tslot %d\n", slot);
        !           238: #      endif
        !           239: 
        !           240: 
        !           241:        rngget(slot);
        !           242: 
        !           243:        fptr = &Parrng[slot];
        !           244: 
        !           245:        fptr->frontpt = NULL;
        !           246:        fptr->backpt = Rngfront;
        !           247:        Rngfront->frontpt = fptr;
        !           248: 
        !           249:        Rngfront = fptr;
        !           250: }
        !           251: 
        !           252: /*
        !           253: ** RNGBACK
        !           254: **     move entry 'r' to back of range table list
        !           255: **
        !           256: **     Trace Flags:
        !           257: **             rngback ~~ 67.4
        !           258: */
        !           259: rngback(slot)
        !           260: int    slot;
        !           261: {
        !           262:        register PARRNG *bptr;
        !           263: 
        !           264: #      ifdef   xPTR2
        !           265:        tTfp(67, 4, "rngback:\tslot %d\n", slot);
        !           266: #      endif
        !           267: 
        !           268:        rngget(slot);
        !           269: 
        !           270:        bptr = &Parrng[slot];
        !           271: 
        !           272:        bptr->backpt = NULL;
        !           273:        bptr->frontpt = Rngback;
        !           274:        Rngback->backpt = bptr;
        !           275: 
        !           276:        Rngback = bptr;
        !           277: }
        !           278: 
        !           279: /*
        !           280: **  RNGGET -- get a descriptor from range table
        !           281: **
        !           282: **     Trace Flags:
        !           283: **             rngget ~~ 67.8
        !           284: */
        !           285: 
        !           286: rngget(slot)
        !           287: int    slot;
        !           288: {
        !           289:        register PARRNG *slotptr;
        !           290:        register PARRNG *forward;
        !           291:        register PARRNG *backward;
        !           292: 
        !           293: #      ifdef   xPTR2
        !           294:        tTfp(67, 8, "rngget:\tslot %d\n", slot);
        !           295: #      endif
        !           296: 
        !           297: 
        !           298:        slotptr = &Parrng[slot];
        !           299:        forward = slotptr->frontpt;
        !           300:        backward = slotptr->backpt;
        !           301: 
        !           302:        if (slotptr == Rngfront)
        !           303:        {
        !           304:                Rngfront = backward;
        !           305:                backward->frontpt = NULL;
        !           306:        }
        !           307:        else if (slotptr == Rngback)
        !           308:        {
        !           309:                Rngback = forward;
        !           310:                forward->backpt = NULL;
        !           311:        }
        !           312:        else
        !           313:        {
        !           314:                forward->backpt = backward;
        !           315:                backward->frontpt = forward;
        !           316:        }
        !           317: 
        !           318:        slotptr->backpt = slotptr->frontpt = NULL;
        !           319: }
        !           320: 
        !           321: /*
        !           322: **  RNGOLD -- find least recently used vble entry
        !           323: **
        !           324: **     Trace Flags:
        !           325: **             rngold ~~ 67.9
        !           326: */
        !           327: int
        !           328: rngold()
        !           329: {
        !           330: # ifdef        xPTR2
        !           331:        tTfp(67, 9, "rngold %d.\n", Rngback - (PARRNG *) Parrng);
        !           332: # endif
        !           333: 
        !           334:        return(Rngback - (PARRNG *) Parrng);
        !           335: }
        !           336: 
        !           337: /*
        !           338: ** RNGRESET
        !           339: **     reset the used marks to '0'
        !           340: **
        !           341: **     Trace Flags:
        !           342: **             rngreset ~~ 67.10
        !           343: */
        !           344: rngreset()
        !           345: {
        !           346:        register int            i;
        !           347:        register RANGEV         *rangevptr;
        !           348: 
        !           349: # ifdef        xPTR2
        !           350:        tTfp(67, 10, "rngreset().\n");
        !           351: # endif
        !           352: 
        !           353:        rangevptr = Qt.qt_rangev;
        !           354: 
        !           355:        for (i = 0; i < MAXVAR; i++, rangevptr++) /* only do external ones */
        !           356:                rangevptr->rngvmark = 0;
        !           357: }
        !           358: 
        !           359: /*
        !           360: ** CHECKUPD
        !           361: **     checks to make sure that the user can update the relation 'name1'
        !           362: **     the 'open' parameter is set if 'Reldesc' contains the openr info
        !           363: **     for the relation in question.
        !           364: **
        !           365: **     Trace Flags:
        !           366: **             checkupd ~~ 67.11
        !           367: */
        !           368: checkupd(entnum)
        !           369: int    entnum;
        !           370: {
        !           371:        extern int              Noupdt;
        !           372:        extern PARRNG           Parrng[];
        !           373:        register PARRNG         *rptr;
        !           374: 
        !           375: # ifdef        xPTR2
        !           376:        tTfp(67, 11, "checkupd(%d).\n", entnum);
        !           377: # endif
        !           378: 
        !           379:        rptr = &Parrng[entnum];
        !           380: 
        !           381:        if (!Noupdt)
        !           382:                return;
        !           383:        if (rptr->vardesc.reldum.relstat & S_NOUPDT)
        !           384:                /* no updates allowed on this relation */
        !           385:                par_error(CANTUPDATE, WARN, trim_relname(rptr->vardesc.reldum.relid), 0);
        !           386: }
        !           387: 
        !           388: /*
        !           389: ** RNGFRESH -- check the range table relstat information for accuracy
        !           390: **
        !           391: **     If the command specified could have changed the relstat info
        !           392: **     make the appropriate adjustments to the range table
        !           393: */
        !           394: rngfresh(op)
        !           395: int    op;
        !           396: {
        !           397:        register PARRNG         *rptr;
        !           398:        register int            slot;
        !           399:        DESC                    desc;
        !           400: 
        !           401: # ifdef        xPTR2
        !           402:        tTfp(67, 11, "rngfresh %d.\n", op);
        !           403: # endif
        !           404: 
        !           405:        /* search the entire table! */
        !           406:        for (slot = 0, rptr = Parrng; slot <= MAXVAR; slot++, rptr++)
        !           407:        {
        !           408:                if (!(rptr->relvused))
        !           409:                        continue;
        !           410: 
        !           411:                switch (op)
        !           412:                {
        !           413:                  case mdDESTROY:
        !           414:                        if ((rptr->vardesc.reldum.relstat & (S_VBASE | S_INTEG | S_PROTUPS | S_INDEX)) != 0)
        !           415:                        {
        !           416:                        fixordel:
        !           417:                                /*
        !           418:                                ** openr the relation, if it doesn't exist make
        !           419:                                ** sure that all range table entries are gone
        !           420:                                */
        !           421:                                if (!openr(&desc, -1, rptr->vardesc.reldum.relid))
        !           422:                                rptr->vardesc.reldum.relstat = desc.reldum.relstat;
        !           423:                                else
        !           424:                                        {
        !           425:                                                /* relation not there, purge table */
        !           426:                                                rngdel(rptr->vardesc.reldum.relid);
        !           427:                                        }
        !           428:                        }
        !           429:                        break;
        !           430: 
        !           431:                  case mdVIEW:
        !           432:                        if ((rptr->vardesc.reldum.relstat & S_VBASE) == 0)
        !           433:                        {
        !           434:                        fixorerr:
        !           435:                                /*
        !           436:                                ** if the relation doesn't exist then it is
        !           437:                                ** a syserr, otherwise, copy the bits.
        !           438:                                */
        !           439:                                if (!openr(&desc, -1, rptr->vardesc.reldum.relid))
        !           440:                                        rptr->vardesc.reldum.relstat = desc.reldum.relstat;
        !           441:                                else
        !           442:                                {
        !           443:                                        /* not there, syserr */
        !           444:                                        syserr("RNGFRESH: extra entry: %s", rptr->vardesc.reldum.relid);
        !           445:                                }
        !           446:                        }
        !           447:                        break;
        !           448: 
        !           449:                  case mdPROT:
        !           450:                        if ((rptr->vardesc.reldum.relstat & S_PROTUPS) == 0)
        !           451:                                goto    fixorerr;
        !           452:                        break;
        !           453: 
        !           454:                  case mdINTEG:
        !           455:                        if ((rptr->vardesc.reldum.relstat & S_INTEG) == 0)
        !           456:                                goto    fixorerr;
        !           457:                        break;
        !           458: 
        !           459:                  case mdMODIFY:
        !           460:                        if ((rptr->vardesc.reldum.relstat & S_INDEX) != 0)
        !           461:                                goto    fixordel;
        !           462:                        break;
        !           463:                
        !           464:                  default:
        !           465:                        return; /* command ok, dont waste time on rest of table */
        !           466:                }
        !           467:        }
        !           468: }
        !           469: 
        !           470: printtable()
        !           471: {
        !           472:        register PARRNG         *rptr;
        !           473:        int                     slot[MAXRANGE];
        !           474:        int                     i;
        !           475: 
        !           476:        printf("Range table:\n");
        !           477: 
        !           478:        for (i = 0; i < MAXRANGE; i++)
        !           479:                slot[i] = 0;
        !           480: 
        !           481:        for (rptr = Rngfront; rptr != NULL; rptr = rptr->backpt)
        !           482:        {
        !           483:                i = rptr - (PARRNG *) Parrng;
        !           484:                slot[i] = 1;
        !           485:                printslot(i);
        !           486:        }
        !           487:        printf("\nEntries not in list:\n");
        !           488:        for (i = 0; i < MAXRANGE; i++)
        !           489:        {
        !           490:                if (!slot[i])
        !           491:                {
        !           492:                        printslot(i);
        !           493:                }
        !           494:        }
        !           495: }
        !           496: 
        !           497: printslot(slot)
        !           498: int    slot;
        !           499: {
        !           500:        register RANGEV         *rptr;
        !           501:        register PARRNG         *auxptr;
        !           502: 
        !           503:        rptr = &Qt.qt_rangev[slot];
        !           504:        auxptr = &Parrng[slot];
        !           505: 
        !           506:        printf("slot:\t%d\n{\trvar:\t%.12s,\trelnm:\t%.12s.\n",
        !           507:            slot, auxptr->vardesc.relvname,
        !           508:            auxptr->vardesc.reldum.relid);
        !           509:        printf("\tRELVUSED: %d, RELVSEND %d.\n",
        !           510:            auxptr->relvused,
        !           511:            rptr->rngvmark);
        !           512: 
        !           513: 
        !           514:        printf("\tratts: %d, attlist: %d.\n}\n", auxptr->vardesc.reldum.relatts, auxptr->attlist);
        !           515: }

unix.superglobalmegacorp.com

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