]> git.saurik.com Git - bison.git/blobdiff - src/relation.c
2007-01-30 Paolo Bonzini <bonzini@gnu.org>
[bison.git] / src / relation.c
index 7944b16efa75d188f862a3e6bbdcaa5b55445175..1d2b42dd9f34efb802e8617b9905f9c3d8327195 100644 (file)
@@ -1,5 +1,5 @@
 /* Binary relations.
 /* Binary relations.
-   Copyright (C) 2002  Free Software Foundation, Inc.
+   Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    You should have received a copy of the GNU General Public License
    along with Bison; see the file COPYING.  If not, write to
 
    You should have received a copy of the GNU General Public License
    along with Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 
+#include <config.h>
 #include "system.h"
 #include "system.h"
-#include "bitsetv.h"
-#include "relation.h"
+
+#include <bitsetv.h>
+
 #include "getargs.h"
 #include "getargs.h"
+#include "relation.h"
 
 void
 
 void
-relation_print (relation_t relation, size_t size, FILE *out)
+relation_print (relation r, relation_node size, FILE *out)
 {
 {
-  unsigned i, j;
+  relation_node i;
+  relation_node j;
 
   for (i = 0; i < size; ++i)
     {
 
   for (i = 0; i < size; ++i)
     {
-      fprintf (out, "%3d: ", i);
-      if (relation[i])
-       for (j = 0; relation[i][j] != -1; ++j)
-         fprintf (out, "%3d ", relation[i][j]);
+      fprintf (out, "%3lu: ", (unsigned long int) i);
+      if (r[i])
+       for (j = 0; r[i][j] != END_NODE; ++j)
+         fprintf (out, "%3lu ", (unsigned long int) r[i][j]);
       fputc ('\n', out);
     }
   fputc ('\n', out);
       fputc ('\n', out);
     }
   fputc ('\n', out);
@@ -47,24 +51,24 @@ relation_print (relation_t relation, size_t size, FILE *out)
 | two.                                                           |
 `---------------------------------------------------------------*/
 
 | two.                                                           |
 `---------------------------------------------------------------*/
 
-static relation_t R;
-static relation_nodes_t INDEX;
-static relation_nodes_t VERTICES;
-static int top;
-static int infinity;
+static relation R;
+static relation_nodes INDEX;
+static relation_nodes VERTICES;
+static relation_node top;
+static relation_node infinity;
 static bitsetv F;
 
 static void
 static bitsetv F;
 
 static void
-traverse (int i)
+traverse (relation_node i)
 {
 {
-  int j;
-  int height;
+  relation_node j;
+  relation_node height;
 
   VERTICES[++top] = i;
   INDEX[i] = height = top;
 
   if (R[i])
 
   VERTICES[++top] = i;
   INDEX[i] = height = top;
 
   if (R[i])
-    for (j = 0; R[i][j] >= 0; ++j)
+    for (j = 0; R[i][j] != END_NODE; ++j)
       {
        if (INDEX[R[i][j]] == 0)
          traverse (R[i][j]);
       {
        if (INDEX[R[i][j]] == 0)
          traverse (R[i][j]);
@@ -90,28 +94,24 @@ traverse (int i)
 
 
 void
 
 
 void
-relation_digraph (relation_t relation, size_t size,
-                 bitsetv *function)
+relation_digraph (relation r, relation_node size, bitsetv *function)
 {
 {
-  unsigned i;
+  relation_node i;
 
   infinity = size + 2;
 
   infinity = size + 2;
-  INDEX = XCALLOC (relation_node_t, size + 1);
-  VERTICES = XCALLOC (relation_node_t, size + 1);
+  INDEX = xcalloc (size + 1, sizeof *INDEX);
+  VERTICES = xnmalloc (size + 1, sizeof *VERTICES);
   top = 0;
 
   top = 0;
 
-  R = relation;
+  R = r;
   F = *function;
 
   F = *function;
 
-  for (i = 0; i < size; i++)
-    INDEX[i] = 0;
-
   for (i = 0; i < size; i++)
     if (INDEX[i] == 0 && R[i])
       traverse (i);
 
   for (i = 0; i < size; i++)
     if (INDEX[i] == 0 && R[i])
       traverse (i);
 
-  XFREE (INDEX);
-  XFREE (VERTICES);
+  free (INDEX);
+  free (VERTICES);
 
   *function = F;
 }
 
   *function = F;
 }
@@ -122,54 +122,56 @@ relation_digraph (relation_t relation, size_t size,
 `-------------------------------------------*/
 
 void
 `-------------------------------------------*/
 
 void
-relation_transpose (relation_t *R_arg, int n)
+relation_transpose (relation *R_arg, relation_node n)
 {
 {
+  relation r = *R_arg;
   /* The result. */
   /* The result. */
-  relation_t new_R = XCALLOC (relation_nodes_t, n);
+  relation new_R = xnmalloc (n, sizeof *new_R);
   /* END_R[I] -- next entry of NEW_R[I]. */
   /* END_R[I] -- next entry of NEW_R[I]. */
-  relation_t end_R = XCALLOC (relation_nodes_t, n);
+  relation end_R = xnmalloc (n, sizeof *end_R);
   /* NEDGES[I] -- total size of NEW_R[I]. */
   /* NEDGES[I] -- total size of NEW_R[I]. */
-  int *nedges = XCALLOC (int, n);
-  int i, j;
+  size_t *nedges = xcalloc (n, sizeof *nedges);
+  relation_node i;
+  relation_node j;
 
   if (trace_flag & trace_sets)
     {
       fputs ("relation_transpose: input\n", stderr);
 
   if (trace_flag & trace_sets)
     {
       fputs ("relation_transpose: input\n", stderr);
-      relation_print (*R_arg, n, stderr);
+      relation_print (r, n, stderr);
     }
 
   /* Count. */
   for (i = 0; i < n; i++)
     }
 
   /* Count. */
   for (i = 0; i < n; i++)
-    if ((*R_arg)[i])
-      for (j = 0; (*R_arg)[i][j] >= 0; ++j)
-       ++nedges[(*R_arg)[i][j]];
+    if (r[i])
+      for (j = 0; r[i][j] != END_NODE; ++j)
+       ++nedges[r[i][j]];
 
   /* Allocate. */
   for (i = 0; i < n; i++)
 
   /* Allocate. */
   for (i = 0; i < n; i++)
-    if (nedges[i] > 0)
-      {
-       relation_node_t *sp = XCALLOC (relation_node_t, nedges[i] + 1);
-       sp[nedges[i]] = -1;
-       new_R[i] = sp;
-       end_R[i] = sp;
-      }
+    {
+      relation_node *sp = NULL;
+      if (nedges[i] > 0)
+       {
+         sp = xnmalloc (nedges[i] + 1, sizeof *sp);
+         sp[nedges[i]] = END_NODE;
+       }
+      new_R[i] = sp;
+      end_R[i] = sp;
+    }
 
   /* Store. */
   for (i = 0; i < n; i++)
 
   /* Store. */
   for (i = 0; i < n; i++)
-    if ((*R_arg)[i])
-      for (j = 0; (*R_arg)[i][j] >= 0; ++j)
-       {
-         *end_R[(*R_arg)[i][j]] = i;
-         ++end_R[(*R_arg)[i][j]];
-       }
+    if (r[i])
+      for (j = 0; r[i][j] != END_NODE; ++j)
+       *end_R[r[i][j]]++ = i;
 
   free (nedges);
   free (end_R);
 
   /* Free the input: it is replaced with the result. */
   for (i = 0; i < n; i++)
 
   free (nedges);
   free (end_R);
 
   /* Free the input: it is replaced with the result. */
   for (i = 0; i < n; i++)
-    XFREE ((*R_arg)[i]);
-  free (*R_arg);
+    free (r[i]);
+  free (r);
 
   if (trace_flag & trace_sets)
     {
 
   if (trace_flag & trace_sets)
     {