fix
[oweals/gnunet.git] / src / regex / regex_graph.c
index 9223200c8fb3823b6bdcb3d9ecf4f4b1070ff333..0b5c571eb5ad63ad6a9df2730b9b9881dd9a839f 100644 (file)
@@ -88,26 +88,20 @@ scc_tarjan_strongconnect (unsigned int *scc_counter,
       scc_tarjan_strongconnect (scc_counter, w, index, stack, stack_size);
       v->lowlink = (v->lowlink > w->lowlink) ? w->lowlink : v->lowlink;
     }
-    else if (0 != w->contained)
+    else if (1 == w->contained)
       v->lowlink = (v->lowlink > w->index) ? w->index : v->lowlink;
   }
 
   if (v->lowlink == v->index)
   {
-    w = stack[--(*stack_size)];
-    w->contained = 0;
-
-    if (v != w)
+    (*scc_counter)++;
+    do
     {
-      (*scc_counter)++;
-      while (v != w)
-      {
-        w->scc_id = *scc_counter;
-        w = stack[--(*stack_size)];
-        w->contained = 0;
-      }
+      w = stack[--(*stack_size)];
+      w->contained = 0;
       w->scc_id = *scc_counter;
     }
+    while (w != v);
   }
 }
 
@@ -178,7 +172,7 @@ GNUNET_REGEX_automaton_save_graph_step (void *cls, unsigned int count,
     {
       GNUNET_asprintf (&s_acc,
                        "\"%s\" [shape=doublecircle, color=\"0.%i 0.8 0.95\"];\n",
-                       name, s->scc_id);
+                       name, s->scc_id * s->scc_id);
     }
     else
     {
@@ -190,18 +184,15 @@ GNUNET_REGEX_automaton_save_graph_step (void *cls, unsigned int count,
   {
     GNUNET_asprintf (&s_acc,
                      "\"%s\" [shape=circle, color=\"0.%i 0.8 0.95\"];\n", name,
-                     s->scc_id);
+                     s->scc_id * s->scc_id);
   }
   else
   {
     GNUNET_asprintf (&s_acc, "\"%s\" [shape=circle];\n", name, s->scc_id);
   }
 
-  if (NULL == s_acc)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Could not print state %s\n", s->name);
-    return;
-  }
+  GNUNET_assert (NULL != s_acc);
+
   fwrite (s_acc, strlen (s_acc), 1, ctx->filep);
   GNUNET_free (s_acc);
   s_acc = NULL;
@@ -231,7 +222,7 @@ GNUNET_REGEX_automaton_save_graph_step (void *cls, unsigned int count,
       {
         GNUNET_asprintf (&s_tran,
                          "\"%s\" -> \"%s\" [label = \"ε\", color=\"0.%i 0.8 0.95\"];\n",
-                         name, to_name, s->scc_id);
+                         name, to_name, s->scc_id * s->scc_id);
       }
       else
       {
@@ -245,7 +236,7 @@ GNUNET_REGEX_automaton_save_graph_step (void *cls, unsigned int count,
       {
         GNUNET_asprintf (&s_tran,
                          "\"%s\" -> \"%s\" [label = \"%s\", color=\"0.%i 0.8 0.95\"];\n",
-                         name, to_name, ctran->label, s->scc_id);
+                         name, to_name, ctran->label, s->scc_id * s->scc_id);
       }
       else
       {
@@ -256,12 +247,7 @@ GNUNET_REGEX_automaton_save_graph_step (void *cls, unsigned int count,
 
     GNUNET_free (to_name);
 
-    if (NULL == s_tran)
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Could not print state %s\n",
-                  s->name);
-      return;
-    }
+    GNUNET_assert (NULL != s_tran);
 
     fwrite (s_tran, strlen (s_tran), 1, ctx->filep);
     GNUNET_free (s_tran);
@@ -315,12 +301,13 @@ GNUNET_REGEX_automaton_save_graph (struct GNUNET_REGEX_Automaton *a,
   }
 
   /* First add the SCCs to the automaton, so we can color them nicely */
-  scc_tarjan (a);
+  if (GNUNET_YES == ctx.coloring)
+    scc_tarjan (a);
 
   start = "digraph G {\nrankdir=LR\n";
   fwrite (start, strlen (start), 1, ctx.filep);
 
-  GNUNET_REGEX_automaton_traverse (a, a->start,
+  GNUNET_REGEX_automaton_traverse (a, a->start, NULL, NULL,
                                    &GNUNET_REGEX_automaton_save_graph_step,
                                    &ctx);