warshall.c revision 1.4
1/*	$NetBSD: warshall.c,v 1.4 2010/12/25 19:24:28 joerg Exp $	*/
2/* Id: warshall.c,v 1.7 2010/06/06 22:48:51 tom Exp */
3
4#if HAVE_NBTOOL_CONFIG_H
5#include "nbtool_config.h"
6#endif
7
8#include <sys/cdefs.h>
9__RCSID("$NetBSD: warshall.c,v 1.4 2010/12/25 19:24:28 joerg Exp $");
10
11#include "defs.h"
12
13static void
14transitive_closure(unsigned *R, int n)
15{
16    int rowsize;
17    unsigned i;
18    unsigned *rowj;
19    unsigned *rp;
20    unsigned *rend;
21    unsigned *ccol;
22    unsigned *relend;
23    unsigned *cword;
24    unsigned *rowi;
25
26    rowsize = WORDSIZE(n);
27    relend = R + n * rowsize;
28
29    cword = R;
30    i = 0;
31    rowi = R;
32    while (rowi < relend)
33    {
34	ccol = cword;
35	rowj = R;
36
37	while (rowj < relend)
38	{
39	    if (*ccol & (unsigned)(1 << i))
40	    {
41		rp = rowi;
42		rend = rowj + rowsize;
43		while (rowj < rend)
44		    *rowj++ |= *rp++;
45	    }
46	    else
47	    {
48		rowj += rowsize;
49	    }
50
51	    ccol += rowsize;
52	}
53
54	if (++i >= BITS_PER_WORD)
55	{
56	    i = 0;
57	    cword++;
58	}
59
60	rowi += rowsize;
61    }
62}
63
64void
65reflexive_transitive_closure(unsigned *R, int n)
66{
67    int rowsize;
68    unsigned i;
69    unsigned *rp;
70    unsigned *relend;
71
72    transitive_closure(R, n);
73
74    rowsize = WORDSIZE(n);
75    relend = R + n * rowsize;
76
77    i = 0;
78    rp = R;
79    while (rp < relend)
80    {
81	*rp |= (unsigned)(1 << i);
82	if (++i >= BITS_PER_WORD)
83	{
84	    i = 0;
85	    rp++;
86	}
87
88	rp += rowsize;
89    }
90}
91