|
|
1.1 root 1: /* Generate transitive closure of a matrix,
2: Copyright (C) 1984 Bob Corbett and Free Software Foundation, Inc.
3:
4: BISON is distributed in the hope that it will be useful, but WITHOUT ANY
5: WARRANTY. No author or distributor accepts responsibility to anyone
6: for the consequences of using it or for whether it serves any
7: particular purpose or works at all, unless he says so in writing.
8: Refer to the BISON General Public License for full details.
9:
10: Everyone is granted permission to copy, modify and redistribute BISON,
11: but only under the conditions described in the BISON General Public
12: License. A copy of this license is supposed to have been given to you
13: along with BISON so you can know your rights and responsibilities. It
14: should be in a file named COPYING. Among other things, the copyright
15: notice and this notice must be preserved on all copies.
16:
17: In other words, you are welcome to use, share and improve this program.
18: You are forbidden to forbid anyone else to use, share and improve
19: what you give them. Help stamp out software-hoarding! */
20:
21: #include <stdio.h>
22: #include "machine.h"
23:
24:
25: /* given n by n matrix of bits R, modify its contents
26: to be the transive closure of what was given. */
27:
28: TC(R, n)
29: unsigned *R;
30: int n;
31: {
32: register int rowsize;
33: register unsigned mask;
34: register unsigned *rowj;
35: register unsigned *rp;
36: register unsigned *rend;
37: register unsigned *ccol;
38:
39: unsigned *relend;
40: unsigned *cword;
41: unsigned *rowi;
42:
43: rowsize = WORDSIZE(n) * sizeof(unsigned);
44: relend = (unsigned *) ((char *) R + (n * rowsize));
45:
46: cword = R;
47: mask = 1;
48: rowi = R;
49: while (rowi < relend)
50: {
51: ccol = cword;
52: rowj = R;
53:
54: while (rowj < relend)
55: {
56: if (*ccol & mask)
57: {
58: rp = rowi;
59: rend = (unsigned *) ((char *) rowj + rowsize);
60:
61: while (rowj < rend)
62: *rowj++ |= *rp++;
63: }
64: else
65: {
66: rowj = (unsigned *) ((char *) rowj + rowsize);
67: }
68:
69: ccol = (unsigned *) ((char *) ccol + rowsize);
70: }
71:
72: mask <<= 1;
73: if (mask == 0)
74: {
75: mask = 1;
76: cword++;
77: }
78:
79: rowi = (unsigned *) ((char *) rowi + rowsize);
80: }
81: }
82:
83:
84: /* Reflexive Transitive Closure. Same as TC
85: and then set all the bits on the diagonal of R. */
86:
87: RTC(R, n)
88: unsigned *R;
89: int n;
90: {
91: register int rowsize;
92: register unsigned mask;
93: register unsigned *rp;
94: register unsigned *relend;
95:
96: TC(R, n);
97:
98: rowsize = WORDSIZE(n) * sizeof(unsigned);
99: relend = (unsigned *) ((char *) R + n*rowsize);
100:
101: mask = 1;
102: rp = R;
103: while (rp < relend)
104: {
105: *rp |= mask;
106:
107: mask <<= 1;
108: if (mask == 0)
109: {
110: mask = 1;
111: rp++;
112: }
113:
114: rp = (unsigned *) ((char *) rp + rowsize);
115: }
116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.