diff options
| author | kx <kx@radix-linux.su> | 2026-09-30 21:14:58 +0300 |
|---|---|---|
| committer | kx <kx@radix-linux.su> | 2026-09-30 21:14:58 +0300 |
| commit | 5b1c65152f77e03a4800fceae32d16efe2dadc9c (patch) | |
| tree | caffe4b2235503cccfedfb772dc266cb311840b3 /src/warshall.c | |
| parent | 8b354d2b9f2640d90705abd324a413a0d8fa3867 (diff) | |
| download | zubr-trunk.tar.xz | |
Diffstat (limited to 'src/warshall.c')
| -rw-r--r-- | src/warshall.c | 140 |
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 ********************/ |
