X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/aa7815f5c6e8e07a85e47df9cd7b579468969efb..e9f87b5b7df2e328d2e4196d276c0d96594c906b:/src/warshall.c diff --git a/src/warshall.c b/src/warshall.c index 0d7af6ad..523d42ae 100644 --- a/src/warshall.c +++ b/src/warshall.c @@ -1,5 +1,5 @@ /* Generate transitive closure of a matrix, - Copyright 1984, 1989, 2000 Free Software Foundation, Inc. + Copyright 1984, 1989, 2000, 2001 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -20,95 +20,97 @@ #include "system.h" +#include "getargs.h" #include "warshall.h" -/* Given n by n matrix of bits R, modify its contents to be the - transive closure of what was given. */ +/*-------------------------------------------------------------. +| Given n by n matrix of bits R, modify its contents to be the | +| transive closure of what was given. | +`-------------------------------------------------------------*/ static void -TC (unsigned *R, int n) +bitmatrix_print (const char *title, unsigned *matrix, size_t size) { - int rowsize; - unsigned mask; - unsigned *rowj; - unsigned *rp; - unsigned *rend; - unsigned *ccol; - - unsigned *relend; - unsigned *cword; - unsigned *rowi; - - rowsize = WORDSIZE(n) * sizeof(unsigned); - relend = (unsigned *) ((char *) R + (n * rowsize)); - - cword = R; - mask = 1; - rowi = R; - while (rowi < relend) + size_t i, j; + size_t rowsize = WORDSIZE (size) * sizeof (unsigned); +#define ROW(Num) ((unsigned *) ((char *) matrix + ((Num) * rowsize))) + + /* Title. */ + fprintf (stderr, "%s BEGIN\n", title); + + /* Column numbers. */ + fputs (" ", stderr); + for (i = 0; i < size; ++i) + putc (i / 10 ? '0' + i / 10 : ' ', stderr); + putc ('\n', stderr); + fputs (" ", stderr); + for (i = 0; i < size; ++i) + fprintf (stderr, "%d", i % 10); + putc ('\n', stderr); + + /* Bar. */ + fputs (" .", stderr); + for (i = 0; i < size; ++i) + putc ('-', stderr); + fputs (".\n", stderr); + + /* Contents. */ + for (i = 0; i < size; ++i) { - ccol = cword; - rowj = R; - - while (rowj < relend) - { - if (*ccol & mask) - { - rp = rowi; - rend = (unsigned *) ((char *) rowj + rowsize); - - while (rowj < rend) - *rowj++ |= *rp++; - } - else - { - rowj = (unsigned *) ((char *) rowj + rowsize); - } - - ccol = (unsigned *) ((char *) ccol + rowsize); - } - - mask <<= 1; - if (mask == 0) - { - mask = 1; - cword++; - } - - rowi = (unsigned *) ((char *) rowi + rowsize); + fprintf (stderr, "%2d|", i); + for (j = 0; j < size; ++j) + fputs (BITISSET (ROW (i), j) ? "1" : " ", stderr); + fputs ("|\n", stderr); } -} + /* Bar. */ + fputs (" `", stderr); + for (i = 0; i < size; ++i) + putc ('-', stderr); + fputs ("'\n", stderr); -/* Reflexive Transitive Closure. Same as TC - and then set all the bits on the diagonal of R. */ + /* End title. */ + fprintf (stderr, "%s END\n\n", title); +} -void -RTC (unsigned *R, int n) +#define R(Num) (unsigned *) ((char *) R + ((Num) * rowsize)) + +static void +TC (unsigned *R, int n) { - int rowsize; - unsigned mask; - unsigned *rp; - unsigned *relend; + int rowsize = WORDSIZE (n) * sizeof (unsigned); + int i, j, k; - TC(R, n); + if (trace_flag) + bitmatrix_print ("TC: Input", R, n); - rowsize = WORDSIZE(n) * sizeof(unsigned); - relend = (unsigned *) ((char *) R + n*rowsize); + /* R (J, I) && R (I, K) => R (J, K). + I *must* be the outter loop. */ - mask = 1; - rp = R; - while (rp < relend) - { - *rp |= mask; + for (i = 0; i < n; ++i) + for (j = 0; j < n; ++j) + if (BITISSET (R (j), i)) + for (k = 0; k < n; ++k) + if (BITISSET (R (i), k)) + SETBIT (R (j), k); - mask <<= 1; - if (mask == 0) - { - mask = 1; - rp++; - } + if (trace_flag) + bitmatrix_print ("TC: Output", R, n); +} - rp = (unsigned *) ((char *) rp + rowsize); - } + +/*---------------------------------------------------------------. +| Reflexive Transitive Closure. Same as TC and then set all the | +| bits on the diagonal of R. | +`---------------------------------------------------------------*/ + +void +RTC (unsigned *R, int n) +{ + int rowsize = WORDSIZE (n) * sizeof (unsigned); + int i; + + TC (R, n); + for (i = 0; i < n; ++i) + SETBIT (R (i), i); }