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,"--")
Defined functions
diff
defined in line
7; used 1 times