set.c
上传用户:itx_2006
上传日期:2007-01-06
资源大小:493k
文件大小:15k
源码类别:

编译器/解释器

开发平台:

Others

  1. /* set.c
  2. The following is a general-purpose set library originally developed
  3. by Hank Dietz and enhanced by Terence Parr to allow dynamic sets.
  4. Sets are now structs containing the #words in the set and
  5. a pointer to the actual set words.
  6. Generally, sets need not be explicitly allocated.  They are
  7. created/extended/shrunk when appropriate (e.g. in set_of()).
  8. HOWEVER, sets need to be destroyed (free()ed) when they go out of scope
  9. or are otherwise no longer needed.  A routine is provided to
  10. free a set.
  11. Sets can be explicitly created with set_new(s, max_elem).
  12. Sets can be declared to have minimum size to reduce realloc traffic.
  13. Default minimum size = 1.
  14. Sets can be explicitly initialized to have no elements (set.n == 0)
  15. by using the 'empty' initializer:
  16. Examples:
  17. set a = empty; -- set_deg(a) == 0
  18. return( empty );
  19. Example set creation and destruction:
  20. set
  21. set_of2(e,g)
  22. unsigned e,g;
  23. {
  24. set a,b,c;
  25. b = set_of(e); -- Creates space for b and sticks in e
  26. set_new(c, g); -- set_new(); set_orel() ==> set_of()
  27. set_orel(g, &c);
  28. a = set_or(b, c);
  29. .
  30. .
  31. .
  32. set_free(b);
  33. set_free(c);
  34. return( a );
  35. }
  36. 1987 by Hank Dietz
  37. Modified by:
  38. Terence Parr
  39. Purdue University
  40. October 1989
  41. Made it smell less bad to C++ 7/31/93 -- TJP
  42. */
  43. #include <stdio.h>
  44. #ifdef __cplusplus
  45. #ifndef __STDC__
  46. #define __STDC__
  47. #endif
  48. #endif
  49. #ifdef __STDC__
  50. #include <stdlib.h>
  51. #else
  52. #include <malloc.h>
  53. #endif
  54. #include <string.h>
  55. #include "set.h"
  56. #define MIN(i,j) ( (i) > (j) ? (j) : (i))
  57. #define MAX(i,j) ( (i) < (j) ? (j) : (i))
  58. /* elems can be a maximum of 32 bits */
  59. static unsigned bitmask[] = {
  60. 0x00000001, 0x00000002, 0x00000004, 0x00000008,
  61. 0x00000010, 0x00000020, 0x00000040, 0x00000080,
  62. 0x00000100, 0x00000200, 0x00000400, 0x00000800,
  63. 0x00001000, 0x00002000, 0x00004000, 0x00008000,
  64. #if !defined(PC) || defined(PC32)
  65. 0x00010000, 0x00020000, 0x00040000, 0x00080000,
  66. 0x00100000, 0x00200000, 0x00400000, 0x00800000,
  67. 0x01000000, 0x02000000, 0x04000000, 0x08000000,
  68. 0x10000000, 0x20000000, 0x40000000, 0x80000000
  69. #endif
  70. };
  71. set empty = set_init;
  72. static unsigned min=1;
  73. #define StrSize 200
  74. #ifdef MEMCHK
  75. #define CHK(a)
  76. if ( a.setword != NULL )
  77.   if ( !valid(a.setword) )
  78. {fprintf(stderr, "%s(%d): invalid setn",__FILE__,__LINE__); exit(-1);}
  79. #else
  80. #define CHK(a)
  81. #endif
  82. /*
  83.  * Set the minimum size (in words) of a set to reduce realloc calls
  84.  */
  85. void
  86. #ifdef __STDC__
  87. set_size( unsigned n )
  88. #else
  89. set_size( n )
  90. unsigned n;
  91. #endif
  92. {
  93. min = n;
  94. }
  95. unsigned int
  96. #ifdef __STDC__
  97. set_deg( set a )
  98. #else
  99. set_deg( a )
  100. set a;
  101. #endif
  102. {
  103. /* Fast compute degree of a set... the number
  104.    of elements present in the set.  Assumes
  105.    that all word bits are used in the set
  106.    and that SETSIZE(a) is a multiple of WORDSIZE.
  107. */
  108. register unsigned *p = &(a.setword[0]);
  109. register unsigned *endp = &(a.setword[a.n]);
  110. register unsigned degree = 0;
  111. CHK(a);
  112. if ( a.n == 0 ) return(0);
  113. while ( p < endp )
  114. {
  115. register unsigned t = *p;
  116. register unsigned *b = &(bitmask[0]);
  117. do {
  118. if (t & *b) ++degree;
  119. } while (++b < &(bitmask[WORDSIZE]));
  120. p++;
  121. }
  122. return(degree);
  123. }
  124. set
  125. #ifdef __STDC__
  126. set_or( set b, set c )
  127. #else
  128. set_or( b, c )
  129. set b;
  130. set c;
  131. #endif
  132. {
  133. /* Fast set union operation */
  134. /* resultant set size is max(b, c); */
  135. set *big;
  136. set t;
  137. unsigned int m,n;
  138. register unsigned *r, *p, *q, *endp;
  139. CHK(b); CHK(c);
  140. t = empty;
  141. if (b.n > c.n) {big= &b; m=b.n; n=c.n;} else {big= &c; m=c.n; n=b.n;}
  142. set_ext(&t, m);
  143. r = t.setword;
  144. /* Or b,c until max of smaller set */
  145. q = c.setword;
  146. p = b.setword;
  147. endp = &(b.setword[n]);
  148. while ( p < endp ) *r++ = *p++ | *q++;
  149. /* Copy rest of bigger set into result */
  150. p = &(big->setword[n]);
  151. endp = &(big->setword[m]);
  152. while ( p < endp ) *r++ = *p++;
  153. return(t);
  154. }
  155. set
  156. #ifdef __STDC__
  157. set_and( set b, set c )
  158. #else
  159. set_and( b, c )
  160. set b;
  161. set c;
  162. #endif
  163. {
  164. /* Fast set intersection operation */
  165. /* resultant set size is min(b, c); */
  166. set t;
  167. unsigned int n;
  168. register unsigned *r, *p, *q, *endp;
  169. CHK(b); CHK(c);
  170. t = empty;
  171. n = (b.n > c.n) ? c.n : b.n;
  172. if ( n == 0 ) return t; /* TJP 4-27-92 fixed for empty set */
  173. set_ext(&t, n);
  174. r = t.setword;
  175. /* & b,c until max of smaller set */
  176. q = c.setword;
  177. p = b.setword;
  178. endp = &(b.setword[n]);
  179. while ( p < endp ) *r++ = *p++ & *q++;
  180. return(t);
  181. }
  182. set
  183. #ifdef __STDC__
  184. set_dif( set b, set c )
  185. #else
  186. set_dif( b, c )
  187. set b;
  188. set c;
  189. #endif
  190. {
  191. /* Fast set difference operation b - c */
  192. /* resultant set size is size(b) */
  193. set t;
  194. unsigned int n;
  195. register unsigned *r, *p, *q, *endp;
  196. CHK(b); CHK(c);
  197. t = empty;
  198. n = (b.n <= c.n) ? b.n : c.n ;
  199. if ( b.n == 0 ) return t; /* TJP 4-27-92 fixed for empty set */
  200. /* WEC 12-1-92 fixed for c.n = 0 */
  201. set_ext(&t, b.n);
  202. r = t.setword;
  203. /* Dif b,c until smaller set size */
  204. q = c.setword;
  205. p = b.setword;
  206. endp = &(b.setword[n]);
  207. while ( p < endp ) *r++ = *p++ & (~ *q++);
  208. /* Copy rest of b into result if size(b) > c */
  209. if ( b.n > n )
  210. {
  211. p = &(b.setword[n]);
  212. endp = &(b.setword[b.n]);
  213. while ( p < endp ) *r++ = *p++;
  214. }
  215. return(t);
  216. }
  217. set
  218. #ifdef __STDC__
  219. set_of( unsigned b )
  220. #else
  221. set_of( b )
  222. unsigned b;
  223. #endif
  224. {
  225. /* Fast singleton set constructor operation */
  226. static set a;
  227. if ( b == nil ) return( empty );
  228. set_new(a, b);
  229. a.setword[DIVWORD(b)] = bitmask[MODWORD(b)];
  230. return(a);
  231. }
  232. /*
  233.  * Extend (or shrink) the set passed in to have n words.
  234.  *
  235.  * if n is smaller than the minimum, boost n to have the minimum.
  236.  * if the new set size is the same as the old one, do nothing.
  237.  *
  238.  * TJP 4-27-92 Fixed so won't try to alloc 0 bytes
  239.  */
  240. void
  241. #ifdef __STDC__
  242. set_ext( set *a, unsigned int n )
  243. #else
  244. set_ext( a, n )
  245. set *a;
  246. unsigned int n;
  247. #endif
  248. {
  249. register unsigned *p;
  250. register unsigned *endp;
  251. unsigned int size;
  252. CHK((*a));
  253.     if ( a->n == 0 )
  254.     {
  255. if ( n == 0 ) return;
  256.         a->setword = (unsigned *) calloc(n, BytesPerWord);
  257.         if ( a->setword == NULL )
  258.         {
  259.             fprintf(stderr, "set_ext(%d words): cannot allocate setn", n);
  260.             exit(-1);
  261.         }
  262.         a->n = n;
  263.         return;
  264.     }
  265. if ( n < min ) n = min;
  266. if ( a->n == n || n == 0 ) return;
  267. size = a->n;
  268. a->n = n;
  269. a->setword = (unsigned *) realloc( (char *)a->setword, (n*BytesPerWord) );
  270. if ( a->setword == NULL )
  271. {
  272. fprintf(stderr, "set_ext(%d words): cannot allocate setn", n);
  273. exit(-1);
  274. }
  275. p    = &(a->setword[size]); /* clear from old size to new size */
  276. endp = &(a->setword[a->n]);
  277. do {
  278. *p++ = 0;
  279. } while ( p < endp );
  280. }
  281. set
  282. #ifdef __STDC__
  283. set_not( set a )
  284. #else
  285. set_not( a )
  286. set a;
  287. #endif
  288. {
  289. /* Fast not of set a (assumes all bits used) */
  290. /* size of resultant set is size(a) */
  291. /* ~empty = empty cause we don't know how bit to make set */
  292. set t;
  293. register unsigned *r;
  294. register unsigned *p = a.setword;
  295. register unsigned *endp = &(a.setword[a.n]);
  296. CHK(a);
  297. t = empty;
  298. if ( a.n == 0 ) return( empty );
  299. set_ext(&t, a.n);
  300. r = t.setword;
  301. do {
  302. *r++ = (~ *p++);
  303. } while ( p < endp );
  304. return(t);
  305. }
  306. int
  307. #ifdef __STDC__
  308. set_equ( set a, set b )
  309. #else
  310. set_equ( a, b )
  311. set a;
  312. set b;
  313. #endif
  314. {
  315. /* 8-Nov-97     Make it work with sets of different sizes       */
  316. /*              Easy to understand, too.  Probably faster.      */
  317. /*              Check for a equal to b                          */
  318.     unsigned int    count;      /* MR11 */
  319.     unsigned int    i;          /* MR11 */
  320. CHK(a); CHK(b);
  321.     count=MIN(a.n,b.n);
  322.     if (count == 0) return 1;
  323.     for (i=0; i < count; i++) {
  324.       if (a.setword[i] != b.setword[i]) return 0;
  325.     };
  326.     if (a.n < b.n) {
  327.       for (i=count; i < b.n; i++) {
  328.         if (b.setword[i] != 0) return 0;
  329.       }
  330.       return 1;
  331.     } else if (a.n > b.n) {
  332.       for (i=count; i < a.n; i++) {
  333.         if (a.setword[i] != 0) return 0;
  334.       }
  335.       return 1;
  336.     } else {
  337.       return 1;
  338.     };
  339. }
  340. int
  341. #ifdef __STDC__
  342. set_sub( set a, set b )
  343. #else
  344. set_sub( a, b )
  345. set a;
  346. set b;
  347. #endif
  348. {
  349. /* 8-Nov-97     Make it work with sets of different sizes       */
  350. /*              Easy to understand, too.  Probably faster.      */
  351. /*              Check for a is a PROPER subset of b             */
  352.     unsigned int    count;
  353.     unsigned int    i;
  354. CHK(a); CHK(b);
  355.     if (a.n == 0) return 1;
  356.     count=MIN(a.n,b.n);
  357.     for (i=0; i < count; i++) {
  358.       if (a.setword[i] & ~b.setword[i]) return 0;
  359.     };
  360.     if (a.n <= b.n) {
  361.       return 1;
  362.     } else {
  363.       for (i=count; i<a.n ; i++) {
  364.         if (a.setword[i]) return 0;
  365.       };
  366.     };
  367.     return 1;
  368. }
  369. unsigned
  370. #ifdef __STDC__
  371. set_int( set b )
  372. #else
  373. set_int( b )
  374. set b;
  375. #endif
  376. {
  377. /* Fast pick any element of the set b */
  378. register unsigned *p = b.setword;
  379. register unsigned *endp = &(b.setword[b.n]);
  380. CHK(b);
  381. if ( b.n == 0 ) return( nil );
  382. do {
  383. if (*p) {
  384. /* Found a non-empty word of the set */
  385. register unsigned i = ((p - b.setword) << LogWordSize);
  386. register unsigned t = *p;
  387. p = &(bitmask[0]);
  388. while (!(*p & t)) {
  389. ++i; ++p;
  390. }
  391. return(i);
  392. }
  393. } while (++p < endp);
  394. /* Empty -- only element it contains is nil */
  395. return(nil);
  396. }
  397. int
  398. #ifdef __STDC__
  399. set_el( unsigned b, set a )
  400. #else
  401. set_el( b, a )
  402. unsigned b;
  403. set a;
  404. #endif
  405. {
  406. CHK(a);
  407. /* nil is an element of every set */
  408. if (b == nil) return(1);
  409. if ( a.n == 0 || NumWords(b) > a.n ) return(0);
  410. /* Otherwise, we have to check */
  411. return( a.setword[DIVWORD(b)] & bitmask[MODWORD(b)] );
  412. }
  413. int
  414. #ifdef __STDC__
  415. set_nil( set a )
  416. #else
  417. set_nil( a )
  418. set a;
  419. #endif
  420. {
  421. /* Fast check for nil set */
  422. register unsigned *p = a.setword;
  423. register unsigned *endp = &(a.setword[a.n]);
  424. CHK(a);
  425. if ( a.n == 0 ) return(1);
  426. /* The set is not empty if any word used to store
  427.    the set is non-zero.  This means one must be a
  428.    bit careful about doing things like negation.
  429. */
  430. do {
  431. if (*p) return(0);
  432. } while (++p < endp);
  433. return(1);
  434. }
  435. char *
  436. #ifdef __STDC__
  437. set_str( set a )
  438. #else
  439. set_str( a )
  440. set a;
  441. #endif
  442. {
  443. /* Fast convert set a into ASCII char string...
  444.    assumes that all word bits are used in the set
  445.    and that SETSIZE is a multiple of WORDSIZE.
  446.    Trailing 0 bits are removed from the string.
  447.    if no bits are on or set is empty, "" is returned.
  448. */
  449. register unsigned *p = a.setword;
  450. register unsigned *endp = &(a.setword[a.n]);
  451. static char str_tmp[StrSize+1];
  452. register char *q = &(str_tmp[0]);
  453. CHK(a);
  454. if ( a.n==0 ) {*q=0; return( &(str_tmp[0]) );}
  455. do {
  456. register unsigned t = *p;
  457. register unsigned *b = &(bitmask[0]);
  458. do {
  459. *(q++) = (char) ((t & *b) ? '1' : '0');
  460. } while (++b < &(bitmask[WORDSIZE]));
  461. } while (++p < endp);
  462. /* Trim trailing 0s & NULL terminate the string */
  463. while ((q > &(str_tmp[0])) && (*(q-1) != '1')) --q;
  464. *q = 0;
  465. return(&(str_tmp[0]));
  466. }
  467. set
  468. #ifdef __STDC__
  469. set_val( register char *s )
  470. #else
  471. set_val( s )
  472. register char *s;
  473. #endif
  474. {
  475. /* Fast convert set ASCII char string into a set.
  476.    If the string ends early, the remaining set bits
  477.    are all made zero.
  478.    The resulting set size is just big enough to hold all elements.
  479. */
  480. static set a;
  481. register unsigned *p, *endp;
  482. set_new(a, strlen(s));
  483. p = a.setword;
  484. endp = &(a.setword[a.n]);
  485. do {
  486. register unsigned *b = &(bitmask[0]);
  487. /* Start with a word with no bits on */
  488. *p = 0;
  489. do {
  490. if (*s) {
  491. if (*s == '1') {
  492. /* Turn-on this bit */
  493. *p |= *b;
  494. }
  495. ++s;
  496. }
  497. } while (++b < &(bitmask[WORDSIZE]));
  498. } while (++p < endp);
  499. return(a);
  500. }
  501. /*
  502.  * Or element e into set a.  a can be empty.
  503.  */
  504. void
  505. #ifdef __STDC__
  506. set_orel( unsigned e, set *a )
  507. #else
  508. set_orel( e, a )
  509. unsigned e;
  510. set *a;
  511. #endif
  512. {
  513. CHK((*a));
  514. if ( e == nil ) return;
  515. if ( NumWords(e) > a->n ) set_ext(a, NumWords(e));
  516. a->setword[DIVWORD(e)] |= bitmask[MODWORD(e)];
  517. }
  518. /*
  519.  * Or set b into set a.  a can be empty. does nothing if b empty.
  520.  */
  521. void
  522. #ifdef __STDC__
  523. set_orin( set *a, set b )
  524. #else
  525. set_orin( a, b )
  526. set *a;
  527. set b;
  528. #endif
  529. {
  530. /* Fast set union operation */
  531. /* size(a) is max(a, b); */
  532. unsigned int m;
  533. register unsigned *p,
  534.   *q    = b.setword,
  535.   *endq = &(b.setword[b.n]);
  536. CHK((*a)); CHK(b);
  537. if ( b.n == 0 ) return;
  538. m = (a->n > b.n) ? a->n : b.n;
  539. set_ext(a, m);
  540. p = a->setword;
  541. do {
  542. *p++ |= *q++;
  543. } while ( q < endq );
  544. }
  545. /*
  546.  * And set b into set a.  a can be empty. does nothing if b empty.
  547.  */
  548. void
  549. #ifdef __STDC__
  550. set_andin( set *a, set b )
  551. #else
  552. set_andin( a, b )
  553. set *a;
  554. set b;
  555. #endif
  556. {
  557. /* Fast set intersection operation */
  558. /* size(a) is max(a, b); */
  559. unsigned int m;
  560. register unsigned *p,
  561.   *q    = b.setword,
  562.   *endq = &(b.setword[b.n]);
  563. CHK((*a)); CHK(b);
  564. if ( b.n == 0 ) return;
  565. m = (a->n > b.n) ? a->n : b.n;
  566. set_ext(a, m);
  567. p = a->setword;
  568. do {
  569. *p++ &= *q++;
  570. } while ( q < endq );
  571. }
  572. void
  573. #ifdef __STDC__
  574. set_rm( unsigned e, set a )
  575. #else
  576. set_rm( e, a )
  577. unsigned e;
  578. set a;
  579. #endif
  580. {
  581. /* Does not effect size of set */
  582. CHK(a);
  583. if ( (e == nil) || (NumWords(e) > a.n) ) return;
  584. a.setword[DIVWORD(e)] ^= (a.setword[DIVWORD(e)]&bitmask[MODWORD(e)]);
  585. }
  586. void
  587. #ifdef __STDC__
  588. set_clr( set a )
  589. #else
  590. set_clr( a )
  591. set a;
  592. #endif
  593. {
  594. /* Does not effect size of set */
  595. register unsigned *p = a.setword;
  596. register unsigned *endp = &(a.setword[a.n]);
  597. CHK(a);
  598. if ( a.n == 0 ) return;
  599. do {
  600. *p++ = 0;
  601. } while ( p < endp );
  602. }
  603. set
  604. #ifdef __STDC__
  605. set_dup( set a )
  606. #else
  607. set_dup( a )
  608. set a;
  609. #endif
  610. {
  611. set b;
  612. register unsigned *p,
  613.   *q    = a.setword,
  614.   *endq = &(a.setword[a.n]);
  615. CHK(a);
  616. b = empty;
  617. if ( a.n == 0 ) return( empty );
  618. set_ext(&b, a.n);
  619. p = b.setword;
  620. do {
  621. *p++ = *q++;
  622. } while ( q < endq );
  623. return(b);
  624. }
  625. /*
  626.  * Return a nil terminated list of unsigned ints that represents all
  627.  * "on" bits in the bit set.
  628.  *
  629.  * e.g. {011011} --> {1, 2, 4, 5, nil}
  630.  *
  631.  * _set_pdq and set_pdq are useful when an operation is required on each element
  632.  * of a set.  Normally, the sequence is:
  633.  *
  634.  * while ( set_deg(a) > 0 ) {
  635.  * e = set_int(a);
  636.  * set_rm(e, a);
  637.  * ...process e...
  638.  * }
  639.  * Now,
  640.  *
  641.  * t = e = set_pdq(a);
  642.  * while ( *e != nil ) {
  643.  * ...process *e...
  644.  * e++;
  645.  * }
  646.  * free( t );
  647.  *
  648.  * We have saved many set calls and have not destroyed set a.
  649.  */
  650. void
  651. #ifdef __STDC__
  652. _set_pdq( set a, register unsigned *q )
  653. #else
  654. _set_pdq( a, q )
  655. set a;
  656. register unsigned *q;
  657. #endif
  658. {
  659. register unsigned *p = a.setword,
  660.   *endp = &(a.setword[a.n]);
  661. register unsigned e=0;
  662. CHK(a);
  663. /* are there any space (possibility of elements)? */
  664. if ( a.n == 0 ) return;
  665. do {
  666. register unsigned t = *p;
  667. register unsigned *b = &(bitmask[0]);
  668. do {
  669. if ( t & *b ) *q++ = e;
  670. ++e;
  671. } while (++b < &(bitmask[WORDSIZE]));
  672. } while (++p < endp);
  673. *q = nil;
  674. }
  675. /*
  676.  * Same as _set_pdq except allocate memory.  set_pdq is the natural function
  677.  * to use.
  678.  */
  679. unsigned *
  680. #ifdef __STDC__
  681. set_pdq( set a )
  682. #else
  683. set_pdq( a )
  684. set a;
  685. #endif
  686. {
  687. unsigned *q;
  688. int max_deg;
  689. CHK(a);
  690. max_deg = WORDSIZE*a.n;
  691. /* assume a.n!=0 & no elements is rare, but still ok */
  692. if ( a.n == 0 ) return(NULL);
  693. q = (unsigned *) malloc((max_deg+1)*BytesPerWord);
  694. if ( q == NULL ) return( NULL );
  695. _set_pdq(a, q);
  696. return( q );
  697. }
  698. /* a function that produces a hash number for the set
  699.  */
  700. unsigned int
  701. #ifdef __STDC__
  702. set_hash( set a, register unsigned int mod )
  703. #else
  704. set_hash( a, mod )
  705. set a;
  706. register unsigned int mod;
  707. #endif
  708. {
  709. /* Fast hash of set a (assumes all bits used) */
  710. register unsigned *p = &(a.setword[0]);
  711. register unsigned *endp = &(a.setword[a.n]);
  712. register unsigned i = 0;
  713. CHK(a);
  714. while (p<endp){
  715. i += (*p);
  716. ++p;
  717. }
  718. return(i % mod);
  719. }