Annotation of 43BSD/contrib/icon/operators/diff.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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