Annotation of 43BSD/contrib/icon/operators/unioncs.c, revision 1.1

1.1     ! root        1: #include "../h/rt.h"
        !             2: 
        !             3: /*
        !             4:  * x ++ y - union of csets x and y or of sets x and y.
        !             5:  */
        !             6: 
        !             7: unioncs(nargs, arg2, arg1, arg0)
        !             8: int nargs;
        !             9: struct descrip arg2, arg1, arg0;
        !            10:    {
        !            11:    DclSave
        !            12:    register int i;
        !            13:    union block *bp;
        !            14:    int *cs1, *cs2, csbuf1[CSETSIZE], csbuf2[CSETSIZE];
        !            15:    extern struct b_cset *alccset();
        !            16: #ifdef SETS
        !            17:    int res;
        !            18:    struct b_set *srcp, *tstp, *dstp;
        !            19:    struct b_selem *ep;
        !            20:    struct descrip *dp, *hook;
        !            21:    extern struct b_set *alcset();
        !            22:    extern struct b_selem *alcselem();
        !            23:    extern struct descrip *memb();
        !            24: #endif SETS
        !            25: 
        !            26:    SetBound;
        !            27: #ifdef SETS
        !            28:    DeRef(arg1)
        !            29:    DeRef(arg2)
        !            30:    if (QUAL(arg1) || QUAL(arg2))
        !            31:       goto skipsets;
        !            32:    if (TYPE(arg1) == T_SET && TYPE(arg2) != T_SET)
        !            33:       runerr(119,&arg2);
        !            34:    if (TYPE(arg2) == T_SET && TYPE(arg1) != T_SET)
        !            35:       runerr(119,&arg1);
        !            36:    if (TYPE(arg1) == T_SET && TYPE(arg2) == T_SET) {
        !            37:       /*
        !            38:        *  Both x and y are sets - do set union
        !            39:        *  get enough space for a set as big as x + y.
        !            40:        */
        !            41:          hneed(sizeof(struct b_set) + (BLKLOC(arg1)->set.setsize +
        !            42:             BLKLOC(arg2)->set.setsize) * sizeof(struct b_selem));
        !            43:          /*
        !            44:           *  Select the larger of the two sets as the source
        !            45:           *  copy each element to a new set for the result
        !            46:           *  then insert each member of the second set into the
        !            47:           *  result set if it is not already there.
        !            48:           */
        !            49:          if (BLKLOC(arg1)->set.setsize >= BLKLOC(arg2)->set.setsize) {
        !            50:             srcp = (struct b_set *) BLKLOC(arg1);
        !            51:             tstp = (struct b_set *) BLKLOC(arg2);
        !            52:             }
        !            53:          else {
        !            54:             srcp = (struct b_set *) BLKLOC(arg2);
        !            55:             tstp = (struct b_set *) BLKLOC(arg1);
        !            56:             }
        !            57:          arg0.type = D_SET;
        !            58:          dstp = alcset();
        !            59:          BLKLOC(arg0) = (union block *) dstp;
        !            60:          for (i = 0; i < NBUCKETS; i++) {
        !            61:             ep = (struct b_selem *) BLKLOC(srcp->sbucks[i]);
        !            62:             dp = &dstp->sbucks[i];
        !            63:             while (ep != NULL) {
        !            64:                dp->type = D_SELEM;
        !            65:                BLKLOC(*dp) = (union block *) alcselem(&ep->setmem, ep->hnum);
        !            66:                dp = &BLKLOC(*dp)->selem.sblink;
        !            67:                dstp->setsize++;
        !            68:                ep = (struct b_selem *) BLKLOC(ep->sblink);
        !            69:                }
        !            70:             }
        !            71:          for (i = 0; i < NBUCKETS; i++) {
        !            72:             ep = (struct b_selem *) BLKLOC(tstp->sbucks[i]);
        !            73:             while (ep != NULL) {
        !            74:                hook = memb(dstp, &ep->setmem, ep->hnum, &res);
        !            75:                if (res == 0)
        !            76:                   addmem(dstp, alcselem(&ep->setmem,  ep->hnum), hook);
        !            77:                ep = (struct b_selem *) BLKLOC(ep->sblink);
        !            78:                }
        !            79:             }
        !            80:          }
        !            81:       else {
        !            82:       skipsets:
        !            83: #endif SETS
        !            84: 
        !            85:    hneed(sizeof(struct b_cset));
        !            86: 
        !            87:    /*
        !            88:     * x and y must be csets.
        !            89:     */
        !            90:    if (cvcset(&arg1, &cs1, csbuf1) == NULL)
        !            91:       runerr(104, &arg1);
        !            92:    if (cvcset(&arg2, &cs2, csbuf2) == NULL)
        !            93:       runerr(104, &arg2);
        !            94: 
        !            95:    /*
        !            96:     * Allocate a new cset and in each word of it, compute the value
        !            97:     *  of the bitwise union of the corresponding words in the
        !            98:     *  x and y csets.
        !            99:     */
        !           100:    bp = (union block *) alccset();
        !           101:    for (i = 0; i < CSETSIZE; i++)
        !           102:        bp->cset.bits[i] = cs1[i] | cs2[i];
        !           103: 
        !           104:    arg0.type = D_CSET;
        !           105:    BLKLOC(arg0) = bp;
        !           106: #ifdef SETS
        !           107:    }
        !           108: #endif SETS
        !           109:    ClearBound;
        !           110:    }
        !           111: 
        !           112: Opblock(unioncs,2,"++")

unix.superglobalmegacorp.com

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