bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

23-fyi-vcg-quotes.patch


From: Akim Demaille
Subject: 23-fyi-vcg-quotes.patch
Date: Mon, 19 Nov 2001 10:03:33 +0100

If you try some grammar such as `expr: "number"', the output is
broken.   This is much cleaner.

Index: ChangeLog
from  Akim Demaille  <address@hidden>

        * src/vcg.c: You do the output, so you are responsible of the
        handling of VCG syntax, in particular: use quotearg.
        * src/print_graph.c: Don't.
        (print_actions): Don't output the actions as part of the nodes,
        since that's the job of the edges.
        (print_state): Don't output by hand: fill the node description,
        and ask for its output. 
        
Index: src/print_graph.c
--- src/print_graph.c Fri, 16 Nov 2001 01:00:46 +0100 akim
+++ src/print_graph.c Sat, 17 Nov 2001 14:59:44 +0100 akim
@@ -31,21 +31,10 @@
 #include "obstack.h"
 #include "print_graph.h"
 #include "vcg.h"
-#include "quotearg.h"
 
 static graph_t graph;
 static FILE *fgraph = NULL;
 
-static size_t node_output_size = 0;
-
-/* Return an unambiguous printable representated, allocated in slot 0,
-   for NAME, suitable for C strings.  */
-static char const *
-quote (char const *name)
-{
-  return quotearg_n_style (0, escape_quoting_style, name);
-}
-
 /* This part will construct the label of nodes. */
 static void
 print_core (int state, struct obstack *node_obstack)
@@ -66,7 +55,7 @@
   for (i = 0; i < k; i++)
     {
       if (i)
-       obstack_sgrow (node_obstack, "\\n");
+       obstack_1grow (node_obstack, '\n');
 
       sp1 = sp = ritem + statep->items[i];
 
@@ -77,22 +66,26 @@
 
       obstack_fgrow1 (node_obstack, "%d: ", rule);
       obstack_fgrow1 (node_obstack, " %s  ->  ",
-                     quote (tags[rule_table[rule].lhs]));
+                     tags[rule_table[rule].lhs]);
 
       for (sp = ritem + rule_table[rule].rhs; sp < sp1; sp++)
-       obstack_fgrow1 (node_obstack, "%s ", quote (tags[*sp]));
+       obstack_fgrow1 (node_obstack, "%s ", tags[*sp]);
 
       obstack_1grow (node_obstack, '.');
 
       while (*sp > 0)
-       obstack_fgrow1 (node_obstack, " %s", quote (tags[*sp++]));
+       obstack_fgrow1 (node_obstack, " %s", tags[*sp++]);
     }
 }
 
-/* Output in graph_obstack edges specifications in incidence with current
-   node.  */
+
+/*---------------------------------------------------------------.
+| Output in graph_obstack edges specifications in incidence with |
+| current node.                                                  |
+`---------------------------------------------------------------*/
+
 static void
-print_actions (int state, const char *node_name, struct obstack *node_obstack)
+print_actions (int state, const char *node_name)
 {
   int i;
   int k;
@@ -111,10 +104,12 @@
 
   if (!shiftp && !redp)
     {
+#if 0
       if (final_state == state)
        obstack_sgrow (node_obstack, "$default: accept");
       else
        obstack_sgrow (node_obstack, "NO ACTIONS");
+#endif
       return;
     }
 
@@ -143,9 +138,7 @@
            sprintf (buff, "%d", state1);
            edge.targetname = buff;
            edge.color = (symbol == 0) ? red : blue;
-           /* FIXME: Be aware that quote uses static memory.  The string
-              must be output immediately (which is the case here). */
-           edge.label = tags[symbol] ? quote (tags[symbol]) : NULL;
+           edge.label = tags[symbol];
            output_edge (&edge, fgraph);
            close_edge (fgraph);
          }
@@ -157,6 +150,7 @@
       k = 0;
     }
 
+#if 0
   if (errp)
     {
       int j, nerrs;
@@ -169,25 +163,29 @@
            continue;
          symbol = errp->errs[j];
          /* If something has been added in the NODE_OBSTACK after
-            the declaration of the label, then we need a `\n'.  */
+            the declaration of the label, then we need a `\n'.
          if (obstack_object_size (node_obstack) > node_output_size)
-           obstack_sgrow (node_obstack, "\\n");
+           obstack_sgrow (node_obstack, "\n");
+           */
          obstack_fgrow1 (node_obstack, _("%-4s\terror (nonassociative)"),
                          tags[symbol]);
        }
       if (j > 0)
-       obstack_sgrow (node_obstack, "\\n");
+       obstack_1grow (node_obstack, '\n');
     }
 
   if (state_table[state].consistent && redp)
     {
       rule = redp->rules[0];
       symbol = rule_table[rule].lhs;
+      /*
       if (obstack_object_size (node_obstack) > node_output_size)
-       obstack_sgrow (node_obstack, "\\n");
+       obstack_sgrow (node_obstack, "\n");
+       */
       obstack_fgrow2 (node_obstack, _("$default\treduce using rule %d (%s)"),
                      rule, tags[symbol]);
     }
+#endif
 
   if (i < k)
     {
@@ -204,15 +202,19 @@
          sprintf (buff, "%d", state1);
          edge.targetname = buff;
          edge.color = red;
-         edge.label = tags[symbol] ? quote (tags[symbol]) : NULL;
+         edge.label = tags[symbol];
          output_edge (&edge, fgraph);
          close_edge (fgraph);
        }
     }
 }
 
-/* Output in GRAPH_OBSTACK the current node specifications and edges
-   which go out from that node.  */
+
+/*-------------------------------------------------------------.
+| Output in FGRAPH the current node specifications and exiting |
+| edges.                                                       |
+`-------------------------------------------------------------*/
+
 static void
 print_state (int state)
 {
@@ -220,35 +222,22 @@
   struct obstack node_obstack;
   node_t node;
 
+  /* The labels of the nodes are their the items.  */
   obstack_init (&node_obstack);
-  new_node (&node);    /* Set node attributs default value.  */
+  new_node (&node);
   sprintf (name, "%d", state);
-  node.title = name;   /* Give a name to the node.  */
-
-  {
-    /* Here we begin to compute the node label. */
-    obstack_sgrow (&node_obstack, "\t\tlabel:\t\"");   /* Open Label  */
-
-    /* Keep the size of NODE_OBSTACK before computing the label. It is
-       useful to format the label.  */
-    node_output_size = obstack_object_size (&node_obstack);
-
-    /* Compute the labels of nodes on the fly.  */
-    print_core (state, &node_obstack);
-    /* Compute edges and additionnal parts of node label.  */
-    print_actions (state, node.title, &node_obstack);
-
-    obstack_sgrow (&node_obstack, "\"\n");             /* Close Label.  */
-  }
+  node.title = name;
+  print_core (state, &node_obstack);
+  obstack_1grow (&node_obstack, '\0');
+  node.label = obstack_finish (&node_obstack);
 
   open_node (fgraph);
-  /* Output a VCG formatted attributs list.  */
   output_node (&node, fgraph);
-  /* Save the node label.  */
-  fwrite (obstack_base (&node_obstack),
-         obstack_object_size (&node_obstack), 1, fgraph);
   close_node (fgraph);
 
+  /* Output the edges.  */
+  print_actions (state, name);
+
   obstack_free (&node_obstack, 0);
 }
 
@@ -286,8 +275,8 @@
   open_graph (fgraph);
   output_graph (&graph, fgraph);
 
+  /* Output nodes and edges. */
   for (i = 0; i < nstates; i++)
-    /* Output nodes & edges. */
     print_state (i);
 
   /* Close graph. */
Index: src/vcg.c
--- src/vcg.c Fri, 28 Sep 2001 09:33:42 +0200 akim
+++ src/vcg.c Sat, 17 Nov 2001 14:16:22 +0100 akim
@@ -21,6 +21,16 @@
 #include "system.h"
 #include "vcg.h"
 #include "vcg_defaults.h"
+#include "quotearg.h"
+
+/* Return an unambiguous printable representated, allocated in slot 0,
+   for NAME, suitable for C strings.  */
+static char const *
+quote (char const *name)
+{
+  return quotearg_n_style (0, c_quoting_style, name);
+}
+
 
 /* Initialize a graph with the default values. */
 void
@@ -429,7 +439,7 @@
 add_classname (graph_t *g, int val, const char *name)
 {
   struct classname_s *classname;
-  
+
   classname = XMALLOC (struct classname_s, 1);
   classname->no = val;
   classname->name = name;
@@ -441,7 +451,7 @@
 add_infoname (graph_t *g, int integer, const char *string)
 {
   struct infoname_s *infoname;
-  
+
   infoname = XMALLOC (struct infoname_s, 1);
   infoname->integer = integer;
   infoname->string = string;
@@ -451,11 +461,11 @@
 
 /* Build a colorentry struct and add it to the list.  */
 void
-add_colorentry (graph_t *g, int color_idx, int red_cp, 
+add_colorentry (graph_t *g, int color_idx, int red_cp,
                int green_cp, int blue_cp)
 {
   struct colorentry_s *ce;
-  
+
   ce = XMALLOC (struct colorentry_s, 1);
   ce->color_index = color_idx;
   ce->red_cp = red_cp;
@@ -556,9 +566,9 @@
 output_node (node_t *node, FILE *fout)
 {
   if (node->title != N_TITLE)
-    fprintf (fout, "\t\ttitle:\t\"%s\"\n", node->title);
+    fprintf (fout, "\t\ttitle:\t%s\n", quote (node->title));
   if (node->label != N_LABEL)
-    fprintf (fout, "\t\tlabel:\t\"%s\"\n", node->label);
+    fprintf (fout, "\t\tlabel:\t%s\n", quote (node->label));
 
   if ((node->locx != N_LOCX) && (node->locy != N_LOCY))
     fprintf (fout, "\t\tloc { x: %d  y: %d }\t\n", node->locx, node->locy);
@@ -600,12 +610,13 @@
     fprintf (fout, "\t\tbordercolor:\t%s\n",
             get_color_str (node->bordercolor));
 
-  if (node->infos[0])
-    fprintf (fout, "\t\tinfo1:\t\"%s\"\n", node->infos[0]);
-  if (node->infos[1])
-    fprintf (fout, "\t\tinfo2:\t\"%s\"\n", node->infos[1]);
-  if (node->infos[2])
-    fprintf (fout, "\t\tinfo3:\t\"%s\"\n", node->infos[2]);
+  {
+    int i;
+    for (i = 0; i < 3; ++i)
+      if (node->infos[i])
+       fprintf (fout, "\t\tinfo%d:\t%s\n",
+                i, quote (node->infos[i]));
+  }
 }
 
 void
@@ -614,16 +625,16 @@
   /* FIXME: SOURCENAME and TARGETNAME are mandatory
      so it has to be fatal not to give these informations.  */
   if (edge->sourcename != E_SOURCENAME)
-    fprintf (fout, "\t\tsourcename:\t\"%s\"\n", edge->sourcename);
+    fprintf (fout, "\t\tsourcename:\t%s\n", quote (edge->sourcename));
   if (edge->targetname != E_TARGETNAME)
-    fprintf (fout, "\t\ttargetname:\t\"%s\"\n", edge->targetname);
+    fprintf (fout, "\t\ttargetname:\t%s\n", quote (edge->targetname));
 
   if (edge->label != E_LABEL)
-    fprintf (fout, "\t\tlabel:\t\"%s\"\n", edge->label);
+    fprintf (fout, "\t\tlabel:\t%s\n", quote (edge->label));
 
   if (edge->linestyle != E_LINESTYLE)
-    fprintf (fout, "\t\tlinestyle:\t\"%s\"\n", 
-            get_linestyle_str(edge->linestyle));
+    fprintf (fout, "\t\tlinestyle:\t%s\n",
+            quote (get_linestyle_str(edge->linestyle)));
 
   if (edge->thickness != E_THICKNESS)
     fprintf (fout, "\t\tthickness:\t%d\n", edge->thickness);
@@ -666,16 +677,16 @@
 output_graph (graph_t *graph, FILE *fout)
 {
   if (graph->title)
-    fprintf (fout, "\ttitle:\t\"%s\"\n", graph->title);
+    fprintf (fout, "\ttitle:\t%s\n", quote (graph->title));
   if (graph->label)
-    fprintf (fout, "\tlabel:\t\"%s\"\n", graph->label);
+    fprintf (fout, "\tlabel:\t%s\n", quote (graph->label));
 
-  if (graph->infos[0])
-    fprintf (fout, "\tinfo1:\t\"%s\"\n", graph->infos[0]);
-  if (graph->infos[1])
-    fprintf (fout, "\tinfo2:\t\"%s\"\n", graph->infos[1]);
-  if (graph->infos[2])
-    fprintf (fout, "\tinfo3:\t\"%s\"\n", graph->infos[2]);
+  {
+    int i;
+    for (i = 0; i < 3; ++i)
+      if (graph->infos[i])
+       fprintf (fout, "\tinfo%d:\t%s\n", i, quote (graph->infos[i]));
+  }
 
   if (graph->color != G_COLOR)
     fprintf (fout, "\tcolor:\t%s\n", get_color_str (graph->color));
@@ -711,11 +722,11 @@
 
   if (graph->shape != G_SHAPE)
     fprintf (fout, "\tshape:\t%s\n", get_shape_str (graph->shape));
-  
+
   if (graph->vertical_order != G_VERTICAL_ORDER)
-    fprintf (fout, "\tvertical_order:\t%d\n", graph->vertical_order);  
+    fprintf (fout, "\tvertical_order:\t%d\n", graph->vertical_order);
   if (graph->horizontal_order != G_HORIZONTAL_ORDER)
-    fprintf (fout, "\thorizontal_order:\t%d\n", graph->horizontal_order);  
+    fprintf (fout, "\thorizontal_order:\t%d\n", graph->horizontal_order);
 
   if (graph->xmax != G_XMAX)
     fprintf (fout, "\txmax:\t%d\n", graph->xmax);
@@ -743,8 +754,8 @@
 
   if (graph->hidden != G_HIDDEN)
     fprintf (fout, "\thidden:\t%d\n", graph->hidden);
-  
-  /* FIXME: Unallocate struct list if required.  
+
+  /* FIXME: Unallocate struct list if required.
      Maybe with a little function.  */
   if (graph->classname != G_CLASSNAME)
     {
@@ -765,15 +776,15 @@
   if (graph->colorentry != G_COLORENTRY)
     {
       struct colorentry_s *ite;
-      
+
       for (ite = graph->colorentry; ite; ite = ite->next)
-       {       
-         fprintf (fout, "\tcolorentry %d :\t%d %d %d\n", 
-                  ite->color_index, 
+       {
+         fprintf (fout, "\tcolorentry %d :\t%d %d %d\n",
+                  ite->color_index,
                   ite->red_cp,
                   ite->green_cp,
                   ite->blue_cp);
-       }    
+       }
     }
 
   if (graph->layoutalgorithm != G_LAYOUTALGORITHM)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]