/*************************************************************** 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 #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 ********************/