summaryrefslogtreecommitdiff
path: root/src/warshall.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/warshall.c')
-rw-r--r--src/warshall.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/src/warshall.c b/src/warshall.c
new file mode 100644
index 0000000..bfee572
--- /dev/null
+++ b/src/warshall.c
@@ -0,0 +1,140 @@
+
+/***************************************************************
+ WARSHALL.C
+
+ This file containts TRANSITIVE CLOSURE routines of ZUBR.
+
+ PART OF : ZUBR - Parsers generator for multiple syntax
+ language compilers .
+
+ COMPILE : .
+
+ NOTE : NONE .
+
+ Copyright (C) 1995 - 2026 by Andrey V.Kosteltsev.
+ All Rights Reserved.
+ ***************************************************************/
+/*
+ This file contant RUSSIAN letters( code-page: UTF-8 )
+ ***************************************************************/
+
+#include <defs.h>
+
+#ifndef __NO_COMPILE
+
+
+void transitive_closure( unsigned *R, int n )
+/***************************************************************
+
+ Description : transitive_closure()
+
+ Concepts :
+
+ Use Global Variable:
+
+ Use Functions :
+
+ Parameters : unsigned *R, int n
+
+ Return : [void]
+
+ ***************************************************************/
+{
+ register int rowsize;
+ register unsigned mask;
+ register unsigned *rowj;
+ register unsigned *rp;
+ register unsigned *rend;
+ register unsigned *ccol;
+ register unsigned *relend;
+ register unsigned *cword;
+ register unsigned *rowi;
+
+ rowsize = SIZE_IN_INT( n );
+ relend = R + n*rowsize;
+
+ cword = R;
+ mask = 1;
+ rowi = R;
+ while( rowi < relend )
+ {
+ ccol = cword;
+ rowj = R;
+
+ while( rowj < relend )
+ {
+ if( *ccol & mask )
+ {
+ rp = rowi;
+ rend = rowj + rowsize;
+ while( rowj < rend ) *rowj++ |= *rp++;
+ }
+ else
+ {
+ rowj += rowsize;
+ }
+ ccol += rowsize;
+
+ } /* End of while( rowj < relend ) */
+
+ mask <<= 1;
+ if( mask == 0 )
+ {
+ mask = 1;
+ cword++;
+ }
+ rowi += rowsize;
+
+ } /* End of while( rowi < relend ) */
+
+} /******* End of transitive_closure( unsigned *R, int n ) ***/
+
+
+void reflexive_transitive_closure( unsigned *R, int n )
+/***************************************************************
+
+ Description : transitive_closure()
+
+ Concepts :
+
+ Use Global Variable:
+
+ Use Functions : void transitive_closure( unsigned *R, int n );
+ | this file
+
+ Parameters : unsigned *R, int n
+
+ Return : [void]
+
+ ***************************************************************/
+{
+ register int rowsize;
+ register unsigned mask;
+ register unsigned *rp;
+ register unsigned *relend;
+
+ transitive_closure( R, n );
+
+ rowsize = SIZE_IN_INT( n );
+ relend = R + n*rowsize;
+
+ mask = 1;
+ rp = R;
+ while( rp < relend )
+ {
+ *rp |= mask;
+ mask <<= 1;
+ if( mask == 0 )
+ {
+ mask = 1;
+ rp++;
+ }
+ rp += rowsize;
+
+ } /* End of while( rp < relend ) */
+
+} /******* End of reflexive_transitive_closure( unsigned *R, int n ) ***/
+
+#endif /* __NO_COMPILE */
+
+/***************** END OF FILE WARSHALL.C ********************/