1 #include "defs.h"
2 
transitive_closure(unsigned * R,int n)3 void transitive_closure(unsigned *R, int n)
4 {
5 int rowsize;
6 unsigned mask;
7 unsigned *rowj;
8 unsigned *rp;
9 unsigned *rend;
10 unsigned *ccol;
11 unsigned *relend;
12 unsigned *cword;
13 unsigned *rowi;
14 
15   rowsize = WORDSIZE(n);
16   relend = R + n*rowsize;
17 
18   cword = R;
19   mask = 1;
20   rowi = R;
21   while (rowi < relend)
22     {
23 	ccol = cword;
24 	rowj = R;
25 
26 	while (rowj < relend)
27   	{
28 	    if (*ccol & mask)
29 	    {
30 		rp = rowi;
31 		rend = rowj + rowsize;
32 		while (rowj < rend)
33 		    *rowj++ |= *rp++;
34 	    }
35 	    else
36 	    {
37 		rowj += rowsize;
38 	    }
39 
40 	    ccol += rowsize;
41 	}
42 
43 	mask <<= 1;
44 	if (mask == 0)
45 	{
46 	    mask = 1;
47 	    cword++;
48 	}
49 
50 	rowi += rowsize;
51     }
52 }
53 
reflexive_transitive_closure(unsigned * R,int n)54 void reflexive_transitive_closure(unsigned *R, int n)
55 {
56 int rowsize;
57 unsigned mask;
58 unsigned *rp;
59 unsigned *relend;
60 
61     transitive_closure(R, n);
62 
63     rowsize = WORDSIZE(n);
64     relend = R + n*rowsize;
65 
66     mask = 1;
67     rp = R;
68   while (rp < relend)
69     {
70     *rp |= mask;
71 	 mask <<= 1;
72 	 if (mask == 0)
73 	   {
74       mask = 1;
75 	   rp++;
76 	   }
77 
78 	rp += rowsize;
79    }
80 }
81 
82