xref: /minix3/external/bsd/byacc/dist/warshall.c (revision 84d9c625bfea59e274550651111ae9edfdc40fbd)
1*84d9c625SLionel Sambuc /*	$NetBSD: warshall.c,v 1.7 2013/04/06 14:52:24 christos Exp $	*/
2*84d9c625SLionel Sambuc 
34a17663cSThomas Veerman /* Id: warshall.c,v 1.7 2010/06/06 22:48:51 tom Exp  */
44a17663cSThomas Veerman 
54a17663cSThomas Veerman #include "defs.h"
64a17663cSThomas Veerman 
74a17663cSThomas Veerman #include <sys/cdefs.h>
8*84d9c625SLionel Sambuc __RCSID("$NetBSD: warshall.c,v 1.7 2013/04/06 14:52:24 christos Exp $");
94a17663cSThomas Veerman 
104a17663cSThomas Veerman static void
transitive_closure(unsigned * R,int n)114a17663cSThomas Veerman transitive_closure(unsigned *R, int n)
124a17663cSThomas Veerman {
134a17663cSThomas Veerman     int rowsize;
144a17663cSThomas Veerman     unsigned i;
154a17663cSThomas Veerman     unsigned *rowj;
164a17663cSThomas Veerman     unsigned *rp;
174a17663cSThomas Veerman     unsigned *rend;
184a17663cSThomas Veerman     unsigned *ccol;
194a17663cSThomas Veerman     unsigned *relend;
204a17663cSThomas Veerman     unsigned *cword;
214a17663cSThomas Veerman     unsigned *rowi;
224a17663cSThomas Veerman 
234a17663cSThomas Veerman     rowsize = WORDSIZE(n);
244a17663cSThomas Veerman     relend = R + n * rowsize;
254a17663cSThomas Veerman 
264a17663cSThomas Veerman     cword = R;
274a17663cSThomas Veerman     i = 0;
284a17663cSThomas Veerman     rowi = R;
294a17663cSThomas Veerman     while (rowi < relend)
304a17663cSThomas Veerman     {
314a17663cSThomas Veerman 	ccol = cword;
324a17663cSThomas Veerman 	rowj = R;
334a17663cSThomas Veerman 
344a17663cSThomas Veerman 	while (rowj < relend)
354a17663cSThomas Veerman 	{
364a17663cSThomas Veerman 	    if (*ccol & (unsigned)(1 << i))
374a17663cSThomas Veerman 	    {
384a17663cSThomas Veerman 		rp = rowi;
394a17663cSThomas Veerman 		rend = rowj + rowsize;
404a17663cSThomas Veerman 		while (rowj < rend)
414a17663cSThomas Veerman 		    *rowj++ |= *rp++;
424a17663cSThomas Veerman 	    }
434a17663cSThomas Veerman 	    else
444a17663cSThomas Veerman 	    {
454a17663cSThomas Veerman 		rowj += rowsize;
464a17663cSThomas Veerman 	    }
474a17663cSThomas Veerman 
484a17663cSThomas Veerman 	    ccol += rowsize;
494a17663cSThomas Veerman 	}
504a17663cSThomas Veerman 
514a17663cSThomas Veerman 	if (++i >= BITS_PER_WORD)
524a17663cSThomas Veerman 	{
534a17663cSThomas Veerman 	    i = 0;
544a17663cSThomas Veerman 	    cword++;
554a17663cSThomas Veerman 	}
564a17663cSThomas Veerman 
574a17663cSThomas Veerman 	rowi += rowsize;
584a17663cSThomas Veerman     }
594a17663cSThomas Veerman }
604a17663cSThomas Veerman 
614a17663cSThomas Veerman void
reflexive_transitive_closure(unsigned * R,int n)624a17663cSThomas Veerman reflexive_transitive_closure(unsigned *R, int n)
634a17663cSThomas Veerman {
644a17663cSThomas Veerman     int rowsize;
654a17663cSThomas Veerman     unsigned i;
664a17663cSThomas Veerman     unsigned *rp;
674a17663cSThomas Veerman     unsigned *relend;
684a17663cSThomas Veerman 
694a17663cSThomas Veerman     transitive_closure(R, n);
704a17663cSThomas Veerman 
714a17663cSThomas Veerman     rowsize = WORDSIZE(n);
724a17663cSThomas Veerman     relend = R + n * rowsize;
734a17663cSThomas Veerman 
744a17663cSThomas Veerman     i = 0;
754a17663cSThomas Veerman     rp = R;
764a17663cSThomas Veerman     while (rp < relend)
774a17663cSThomas Veerman     {
784a17663cSThomas Veerman 	*rp |= (unsigned)(1 << i);
794a17663cSThomas Veerman 	if (++i >= BITS_PER_WORD)
804a17663cSThomas Veerman 	{
814a17663cSThomas Veerman 	    i = 0;
824a17663cSThomas Veerman 	    rp++;
834a17663cSThomas Veerman 	}
844a17663cSThomas Veerman 
854a17663cSThomas Veerman 	rp += rowsize;
864a17663cSThomas Veerman     }
874a17663cSThomas Veerman }
88