home *** CD-ROM | disk | FTP | other *** search
-
- /* setlib.h - set pseudo-type for C, library programs */
- /* see sets.h for usage */
-
- #define _SETLIB_
- #include "sets.h"
- #undef _SETLIB_
-
- #define setsize(s) ((SET_BSIZE-(first_element(s)-last_element(s)))>>SET_SSIZE)
-
- set *emptyset(s)
- register set *s;
- {
- register int n;
-
- n = setsize(s);
- s += 2;
- while (n-- > 0)
- *s++ = 0;
- return (EMPTYSET);
- }
-
- set *setcpy(s1,s2)
- register set *s1,*s2;
- {
- register short n;
- register set nonnull = 0;
- set *s = s1;
-
- if (s2 != EMPTYSET) {
- n = setsize(s2);
- *s1++ = *s2++; /* copy the element ranges too - can be different */
- *s1++ = *s2++;
- while (n-- > 0)
- nonnull |= (*s1++ = *s2++);
- return (nonnull ? s : EMPTYSET);
- }
- else
- return (emptyset(s1));
- }
-
- set *set3union(s1,s2,s3)
- register set *s1,*s2,*s3;
- {
- register short n;
- register set nonnull = 0;
- set *s = s1;
-
- if (s2 == EMPTYSET)
- s2 = s3, s3 = EMPTYSET;
- if (s2 == EMPTYSET)
- return (emptyset(s1));
- n = setsize(s2);
- *s1++ = *s2++;
- *s1++ = *s2++;
- if (s3 != EMPTYSET) {
- s3 += 2;
- while (n-- > 0)
- nonnull |= (*s1++ = (*s2++ | *s3++));
- }
- else {
- while (n-- > 0)
- nonnull |= (*s1++ = *s2++);
- }
- return (nonnull ? s : EMPTYSET);
- }
-
- set *set3inter(s1,s2,s3)
- register set *s1,*s2,*s3;
- {
- register short n;
- register set nonnull = 0;
- set *s = s1;
-
- if (s2 == EMPTYSET)
- s2 = s3, s3 = EMPTYSET;
- if (s2 == EMPTYSET)
- return (emptyset(s1));
- n = setsize(s2);
- *s1++ = *s2++;
- *s1++ = *s2++;
- if (s3 != EMPTYSET) {
- s3 += 2;
- while (n-- > 0)
- nonnull |= (*s1++ = (*s2++ & *s3++));
- return (nonnull ? s : EMPTYSET);
- }
- else
- return (emptyset(s)); /* must use s, not (modified) s1 */
- }
-
- set *set3diff(s1,s2,s3)
- register set *s1,*s2,*s3;
- {
- register short n;
- register set nonnull = 0;
- set *s = s1;
-
- if (s2 == EMPTYSET)
- return (emptyset(s1));
- n = setsize(s2);
- *s1++ = *s2++;
- *s1++ = *s2++;
- if (s3 != EMPTYSET && s2 != EMPTYSET) {
- s3 += 2;
- while (n-- > 0)
- nonnull |= (*s1++ = (*s2++ & ~*s3++));
- }
- else {
- while (n-- > 0)
- nonnull |= (*s1++ = *s2++);
- }
- return (nonnull ? s : EMPTYSET);
- }
-
- int setord(s)
- register set *s;
- {
- register short member, total = 0;
-
- if (s != EMPTYSET) {
- for (member=first_element(s); member<=last_element(s); member++) {
- if (ismember(s,member))
- total++;
- }
- }
- return (total);
- }
-
- int setcmp(s1,s2)
- register set *s1,*s2;
- {
- register short n;
- register int result;
-
- if (s1 != EMPTYSET && s2 != EMPTYSET) {
- if (first_element(s1) != first_element(s2) ||
- last_element(s1) != last_element(s2))
- return (ERRORSET);
- n = setsize(s1);
- s1 += 2; s2 += 2;
- result = SAMESET | DISJOINT;
- while (n-- > 0 && result) {
- if (*s1 & ~*s2)
- result &= ~SUBSET;
- if (*s2 & ~*s1)
- result &= ~SUPERSET;
- if (*s1++ & *s2++)
- result &= ~DISJOINT;
- }
- if (result != DISJOINT)
- result &= ~DISJOINT;
- return (result);
- }
- else if (s1 != EMPTYSET) {
- n = setsize(s1);
- s1 += 2;
- while (n-- > 0)
- if (*s1++)
- return (SUPERSET);
- }
- else if (s2 != EMPTYSET) {
- n = setsize(s2);
- s2 += 2;
- while (n-- > 0)
- if (*s2++)
- return (SUBSET);
- }
- return (SAMESET);
- }
-
- int ismember(s,e)
- register set *s;
- int e;
- {
- if (first_element(s) <= e && e <= last_element(s)) {
- e -= first_element(s);
- return ((s[(e>>SET_SSIZE)+2] & (1<<(e & (SET_BSIZE-1)))) != 0);
- }
- else
- return (0);
- }
-
- set *addmember(s,e)
- register set *s;
- int e;
- {
- if (first_element(s) <= e && e <= last_element(s)) {
- e -= first_element(s);
- s[(e>>SET_SSIZE)+2] |= (1<<(e & (SET_BSIZE-1)));
- return (s);
- }
- else
- return (EMPTYSET);
- }
-
- set *submember(s,e)
- register set *s;
- int e;
- {
- if (first_element(s) <= e && e <= last_element(s)) {
- e -= first_element(s);
- s[(e>>SET_SSIZE)+2] &= ~(1<<(e & (SET_BSIZE-1)));
- return (s);
- }
- else
- return (EMPTYSET);
- }
-
- set *xormember(s,e)
- register set *s;
- int e;
- {
- if (first_element(s) <= e && e <= last_element(s)) {
- e -= first_element(s);
- s[(e>>SET_SSIZE)+2] ^= (1<<(e & (SET_BSIZE-1)));
- return (s);
- }
- else
- return (EMPTYSET);
- }
-
- set *S_lmember(s,l,fn)
- register set *s;
- register char *l;
- set *(*fn)();
- {
- register short base;
- register int *ll;
-
- base = first_element(s);
- if (base > 1) {
- while (*l)
- (fn)(s,*l++);
- }
- else {
- ll = (int *)l;
- while (*ll != base-1)
- (fn)(s,*ll++);
- }
- return (s);
- }
-
- int S_setlord(s,l)
- register set *s;
- register char *l;
- {
- register short base, total = 0;
- register int *ll;
-
- if (s == EMPTYSET)
- return (0);
- base = first_element(s);
- if (base > 1) {
- while (*l)
- total += ismember(s,*l++);
- }
- else {
- ll = (int *)l;
- while (*ll != base-1)
- total += ismember(s,*ll++);
- }
- return (total);
- }
-
- set *S_setlcpy(s1,l)
- set *s1;
- char *l;
- {
- emptyset(s1);
- return (S_lmember(s1,l,addmember));
- }
-
- set *setncpy(s1,s2)
- register set *s1, *s2;
- {
- register short member;
- set *result = EMPTYSET;
-
- emptyset(s1);
- if (s2 != EMPTYSET) {
- for (member=first_element(s2); member<=last_element(s2); member++) {
- if (ismember(s2,member) && addmember(s1,member))
- result = s1;
- }
- }
- return (result);
- }
-
- #undef setsize
-