xref: /netbsd-src/external/bsd/byacc/dist/warshall.c (revision 107c160af6c3e8860518cef217297b5cee8ea310)
1*107c160aSchristos /*	$NetBSD: warshall.c,v 1.11 2021/02/20 22:57:56 christos Exp $	*/
2c8b0dbc8Schristos 
3*107c160aSchristos /* Id: warshall.c,v 1.9 2020/09/22 20:17:00 tom Exp  */
4f7a86c12Schristos 
56f6878dfSchristos #include "defs.h"
6570bc97fSjoerg 
781488cfcSjakllsch #include <sys/cdefs.h>
8*107c160aSchristos __RCSID("$NetBSD: warshall.c,v 1.11 2021/02/20 22:57:56 christos Exp $");
981488cfcSjakllsch 
10f7a86c12Schristos static void
transitive_closure(unsigned * R,int n)11f7a86c12Schristos transitive_closure(unsigned *R, int n)
12f7a86c12Schristos {
13f7a86c12Schristos     int rowsize;
14f7a86c12Schristos     unsigned i;
15f7a86c12Schristos     unsigned *rowj;
16f7a86c12Schristos     unsigned *rp;
17f7a86c12Schristos     unsigned *rend;
18f7a86c12Schristos     unsigned *relend;
19f7a86c12Schristos     unsigned *cword;
20f7a86c12Schristos     unsigned *rowi;
21f7a86c12Schristos 
22f7a86c12Schristos     rowsize = WORDSIZE(n);
23f7a86c12Schristos     relend = R + n * rowsize;
24f7a86c12Schristos 
25f7a86c12Schristos     cword = R;
26f7a86c12Schristos     i = 0;
27f7a86c12Schristos     rowi = R;
28f7a86c12Schristos     while (rowi < relend)
29f7a86c12Schristos     {
30*107c160aSchristos 	unsigned *ccol = cword;
31*107c160aSchristos 
32f7a86c12Schristos 	rowj = R;
33f7a86c12Schristos 
34f7a86c12Schristos 	while (rowj < relend)
35f7a86c12Schristos 	{
36*107c160aSchristos 	    if (*ccol & (1U << i))
37f7a86c12Schristos 	    {
38f7a86c12Schristos 		rp = rowi;
39f7a86c12Schristos 		rend = rowj + rowsize;
40f7a86c12Schristos 		while (rowj < rend)
41f7a86c12Schristos 		    *rowj++ |= *rp++;
42f7a86c12Schristos 	    }
43f7a86c12Schristos 	    else
44f7a86c12Schristos 	    {
45f7a86c12Schristos 		rowj += rowsize;
46f7a86c12Schristos 	    }
47f7a86c12Schristos 
48f7a86c12Schristos 	    ccol += rowsize;
49f7a86c12Schristos 	}
50f7a86c12Schristos 
51f7a86c12Schristos 	if (++i >= BITS_PER_WORD)
52f7a86c12Schristos 	{
53f7a86c12Schristos 	    i = 0;
54f7a86c12Schristos 	    cword++;
55f7a86c12Schristos 	}
56f7a86c12Schristos 
57f7a86c12Schristos 	rowi += rowsize;
58f7a86c12Schristos     }
59f7a86c12Schristos }
60f7a86c12Schristos 
61f7a86c12Schristos void
reflexive_transitive_closure(unsigned * R,int n)62f7a86c12Schristos reflexive_transitive_closure(unsigned *R, int n)
63f7a86c12Schristos {
64f7a86c12Schristos     int rowsize;
65f7a86c12Schristos     unsigned i;
66f7a86c12Schristos     unsigned *rp;
67f7a86c12Schristos     unsigned *relend;
68f7a86c12Schristos 
69f7a86c12Schristos     transitive_closure(R, n);
70f7a86c12Schristos 
71f7a86c12Schristos     rowsize = WORDSIZE(n);
72f7a86c12Schristos     relend = R + n * rowsize;
73f7a86c12Schristos 
74f7a86c12Schristos     i = 0;
75f7a86c12Schristos     rp = R;
76f7a86c12Schristos     while (rp < relend)
77f7a86c12Schristos     {
78*107c160aSchristos 	*rp |= (1U << i);
79f7a86c12Schristos 	if (++i >= BITS_PER_WORD)
80f7a86c12Schristos 	{
81f7a86c12Schristos 	    i = 0;
82f7a86c12Schristos 	    rp++;
83f7a86c12Schristos 	}
84f7a86c12Schristos 
85f7a86c12Schristos 	rp += rowsize;
86f7a86c12Schristos     }
87f7a86c12Schristos }
88