]> git.saurik.com Git - bison.git/blobdiff - src/muscle-tab.c
style: fix comments
[bison.git] / src / muscle-tab.c
index f3933c3faf02412f37bd3d792c165ecfe6c7a4ce..4d5dd0acfb504bf2f925a5e15380c8571dea0d88 100644 (file)
@@ -1,6 +1,6 @@
 /* Muscle table manager for Bison.
 
-   Copyright (C) 2001-2012 Free Software Foundation, Inc.
+   Copyright (C) 2001-2013 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -60,10 +60,18 @@ hash_muscle (const void *x, size_t tablesize)
   return hash_string (m->key, tablesize);
 }
 
-/*-----------------------------------------------------------------.
-| Create the MUSCLE_TABLE, and initialize it with default values.  |
-| Also set up the MUSCLE_OBSTACK.                                  |
-`-----------------------------------------------------------------*/
+/* Create a fresh muscle name KEY, and insert in the hash table.  */
+static void *
+muscle_entry_new (char const *key)
+{
+  muscle_entry *res = xmalloc (sizeof *res);
+  res->key = key;
+  res->value = NULL;
+  res->storage = NULL;
+  if (!hash_insert (muscle_table, res))
+    xalloc_die ();
+  return res;
+}
 
 static void
 muscle_entry_free (void *entry)
@@ -87,10 +95,6 @@ muscle_init (void)
 }
 
 
-/*------------------------------------------------------------.
-| Free all the memory consumed by the muscle machinery only.  |
-`------------------------------------------------------------*/
-
 void
 muscle_free (void)
 {
@@ -98,32 +102,26 @@ muscle_free (void)
   obstack_free (&muscle_obstack, NULL);
 }
 
+/* Look for the muscle named KEY.  Return NULL if does not exist.  */
+static
+muscle_entry *
+muscle_lookup (char const *key)
+{
+  muscle_entry probe;
+  probe.key = key;
+  return hash_lookup (muscle_table, &probe);
+}
 
 
-/*------------------------------------------------------------.
-| Insert (KEY, VALUE).  If KEY already existed, overwrite the |
-| previous value.                                             |
-`------------------------------------------------------------*/
-
 void
 muscle_insert (char const *key, char const *value)
 {
-  muscle_entry probe;
-  muscle_entry *entry;
-
-  probe.key = key;
-  entry = hash_lookup (muscle_table, &probe);
-
-  if (!entry)
-    {
-      /* First insertion in the hash. */
-      entry = xmalloc (sizeof *entry);
-      entry->key = key;
-      if (!hash_insert (muscle_table, entry))
-        xalloc_die ();
-    }
-  else
+  muscle_entry *entry = muscle_lookup (key);
+  if (entry)
     free (entry->storage);
+  else
+    /* First insertion in the hash. */
+    entry = muscle_entry_new (key);
   entry->value = value;
   entry->storage = NULL;
 }
@@ -138,22 +136,9 @@ muscle_insert (char const *key, char const *value)
 void
 muscle_grow (const char *key, const char *val, const char *separator)
 {
-  muscle_entry probe;
-  muscle_entry *entry = NULL;
-
-  probe.key = key;
-  entry = hash_lookup (muscle_table, &probe);
+  muscle_entry *entry = muscle_lookup (key);
 
-  if (!entry)
-    {
-      /* First insertion in the hash. */
-      entry = xmalloc (sizeof *entry);
-      entry->key = key;
-      if (!hash_insert (muscle_table, entry))
-        xalloc_die ();
-      entry->value = entry->storage = xstrdup (val);
-    }
-  else
+  if (entry)
     {
       /* Grow the current value. */
       char *new_val;
@@ -163,6 +148,12 @@ muscle_grow (const char *key, const char *val, const char *separator)
       entry->value = entry->storage = xstrdup (new_val);
       obstack_free (&muscle_obstack, new_val);
     }
+  else
+    {
+      /* First insertion in the hash. */
+      entry = muscle_entry_new (key);
+      entry->value = entry->storage = xstrdup (val);
+    }
 }
 
 /*------------------------------------------------------------------.
@@ -197,8 +188,9 @@ muscle_code_grow (const char *key, const char *val, location loc)
 }
 
 
-void muscle_pair_list_grow (const char *muscle,
-                            const char *a1, const char *a2)
+void
+muscle_pair_list_grow (const char *muscle,
+                       const char *a1, const char *a2)
 {
   char *pair;
   obstack_sgrow (&muscle_obstack, "[");
@@ -212,49 +204,28 @@ void muscle_pair_list_grow (const char *muscle,
 }
 
 
-/*----------------------------------------------------------------------------.
-| Find the value of muscle KEY.  Unlike MUSCLE_FIND, this is always reliable  |
-| to determine whether KEY has a value.                                       |
-`----------------------------------------------------------------------------*/
-
 char const *
 muscle_find_const (char const *key)
 {
-  muscle_entry probe;
-  muscle_entry *result = NULL;
-
-  probe.key = key;
-  result = hash_lookup (muscle_table, &probe);
-  if (result)
-    return result->value;
-  return NULL;
+  muscle_entry *entry = muscle_lookup (key);
+  return entry ? entry->value : NULL;
 }
 
 
-/*----------------------------------------------------------------------------.
-| Find the value of muscle KEY.  Abort if muscle_insert was invoked more      |
-| recently than muscle_grow for KEY since muscle_find can't return a          |
-| char const *.                                                               |
-`----------------------------------------------------------------------------*/
-
 char *
 muscle_find (char const *key)
 {
-  muscle_entry probe;
-  muscle_entry *result = NULL;
-
-  probe.key = key;
-  result = hash_lookup (muscle_table, &probe);
-  if (result)
+  muscle_entry *entry = muscle_lookup (key);
+  if (entry)
     {
-      aver (result->value == result->storage);
-      return result->storage;
+      aver (entry->value == entry->storage);
+      return entry->storage;
     }
   return NULL;
 }
 
 
-/* In the format `file_name:line.column', append BOUND to MUSCLE.  Use
+/* In the format 'file_name:line.column', append BOUND to MUSCLE.  Use
    digraphs for special characters in the file name.  */
 
 static void
@@ -270,7 +241,7 @@ muscle_boundary_grow (char const *key, boundary bound)
 }
 
 
-/* In the format `[[file_name:line.column]], [[file_name:line.column]]',
+/* In the format '[[file_name:line.column]], [[file_name:line.column]]',
    append LOC to MUSCLE.  Use digraphs for special characters in each
    file name.  */
 
@@ -384,11 +355,45 @@ muscle_user_name_list_grow (char const *key, char const *user_name,
   muscle_grow (key, "]]", "");
 }
 
+
+/** Return an allocated string that represents the %define directive
+    that performs the assignment.
+
+    @param assignment "VAR", or "VAR=VAL".
+    @param value      default value if VAL \a assignment has no '='.
+
+    For instance:
+    "foo", NULL      => "%define foo"
+    "foo", "baz"     => "%define foo baz"
+    "foo=bar", NULL  => "%define foo bar"
+    "foo=bar", "baz" => "%define foo bar"
+    "foo=", NULL     => "%define foo"
+    "foo=", "baz"    => "%define foo"
+ */
+
+static
+char *
+define_directive (char const *assignment, char const *value)
+{
+  char *eq = strchr (assignment, '=');
+  char const *fmt = !eq && value && *value ? "%%define %s %s" : "%%define %s";
+  char *res = xmalloc (strlen (fmt) + strlen (assignment)
+                       + (value ? strlen (value) : 0));
+  sprintf (res, fmt, assignment, value);
+  eq = strchr (res, '=');
+  if (eq)
+    *eq = eq[1] ? ' ' : '\0';
+  return res;
+}
+
 /** If the \a variable name is obsolete, return the name to use,
- * otherwise \a variable. */
+ * otherwise \a variable.  If the \a value is obsolete, update it too.
+ *
+ * Allocates the returned value.  */
 static
-char const *
-muscle_percent_variable_update (char const *variable, location variable_loc)
+char *
+muscle_percent_variable_update (char const *variable, location variable_loc,
+                                char const **value)
 {
   typedef struct
   {
@@ -399,24 +404,44 @@ muscle_percent_variable_update (char const *variable, location variable_loc)
     {
       { "api.push_pull", "api.push-pull", },
       { "api.tokens.prefix", "api.token.prefix", },
+      { "lex_symbol", "api.token.constructor", },
       { "location_type", "api.location.type", },
       { "lr.default-reductions", "lr.default-reduction", },
       { "lr.keep-unreachable-states", "lr.keep-unreachable-state", },
       { "lr.keep_unreachable_states", "lr.keep-unreachable-state", },
       { "namespace", "api.namespace", },
+      { "stype", "api.value.type", },
+      { "variant=",     "api.value.type=variant", },
+      { "variant=true", "api.value.type=variant", },
+      { NULL, NULL, }
     };
-  char const *res = variable;
-  int i;
-  for (i = 0; i < ARRAY_CARDINALITY (conversion); ++i)
-    if (STREQ (conversion[i].obsolete, variable))
-      {
-        res = conversion[i].updated;
-        complain (&variable_loc, Wdeprecated,
-                  _("deprecated %%define variable name: %s, use %s"),
-                  quote (variable), quote_n (1, res));
-        break;
-      }
-  return res;
+  conversion_type const *c;
+  for (c = conversion; c->obsolete; ++c)
+    {
+      char const *eq = strchr (c->obsolete, '=');
+      if (eq
+          ? (!strncmp (c->obsolete, variable, eq - c->obsolete)
+             && STREQ (eq + 1, *value))
+          : STREQ (c->obsolete, variable))
+        {
+          char *old = define_directive (c->obsolete, *value);
+          char *upd = define_directive (c->updated, *value);
+          deprecated_directive (&variable_loc, old, upd);
+          free (old);
+          free (upd);
+          char *res = xstrdup (c->updated);
+          {
+            char *eq2 = strchr (res, '=');
+            if (eq2)
+              {
+                *eq2 = '\0';
+                *value = eq2 + 1;
+              }
+          }
+          return res;
+        }
+    }
+  return xstrdup (variable);
 }
 
 void
@@ -425,7 +450,7 @@ muscle_percent_define_insert (char const *var, location variable_loc,
                               muscle_percent_define_how how)
 {
   /* Backward compatibility.  */
-  char const *variable = muscle_percent_variable_update (var, variable_loc);
+  char *variable = muscle_percent_variable_update (var, variable_loc, &value);
   char const *name = UNIQSTR_CONCAT ("percent_define(", variable, ")");
   char const *loc_name = UNIQSTR_CONCAT ("percent_define_loc(", variable, ")");
   char const *syncline_name =
@@ -439,7 +464,7 @@ muscle_percent_define_insert (char const *var, location variable_loc,
       muscle_percent_define_how how_old = atoi (muscle_find_const (how_name));
       unsigned i = 0;
       if (how_old == MUSCLE_PERCENT_DEFINE_F)
-        return;
+        goto end;
       complain_indent (&variable_loc, complaint, &i,
                        _("%%define variable %s redefined"),
                        quote (variable));
@@ -456,6 +481,8 @@ muscle_percent_define_insert (char const *var, location variable_loc,
   muscle_user_name_list_grow ("percent_define_user_variables", variable,
                               variable_loc);
   MUSCLE_INSERT_INT (how_name, how);
+ end:
+  free (variable);
 }
 
 /* This is used for backward compatibility, e.g., "%define api.pure"
@@ -464,18 +491,14 @@ void
 muscle_percent_define_ensure (char const *variable, location loc,
                               bool value)
 {
-  char const *val = value ? "" : "false";
   char const *name = UNIQSTR_CONCAT ("percent_define(", variable, ")");
+  char const *val = value ? "" : "false";
 
-  /* %pure-parser is deprecated in favor of `%define api.pure', so use
-     `%define api.pure' in a backward-compatible manner here.  First,
-     don't complain if %pure-parser is specified multiple times.  */
+  /* Don't complain is VARIABLE is already defined, but be sure to set
+     its value to VAL.  */
   if (!muscle_find_const (name))
     muscle_percent_define_insert (variable, loc, val,
                                   MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
-  /* In all cases, use api.pure now so that the backend doesn't complain if
-     the skeleton ignores api.pure, but do warn now if there's a previous
-     conflicting definition from an actual %define.  */
   if (muscle_percent_define_flag_if (variable) != value)
     muscle_percent_define_insert (variable, loc, val,
                                   MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
@@ -608,8 +631,8 @@ muscle_percent_define_check_values (char const * const *values)
                                quote (*variablep), quote_n (1, value));
               i += SUB_INDENT;
               for (values = variablep + 1; *values; ++values)
-                complain_indent (&loc, complaint, &i, _("accepted value: %s"),
-                                 quote (*values));
+                complain_indent (&loc, complaint | no_caret | silent, &i,
+                                 _("accepted value: %s"), quote (*values));
             }
           else
             {
@@ -655,11 +678,6 @@ muscle_m4_output_processor (void *entry, void *out)
 }
 
 
-/*----------------------------------------------------------------.
-| Output the definition of all the current muscles into a list of |
-| m4_defines.                                                     |
-`----------------------------------------------------------------*/
-
 void
 muscles_m4_output (FILE *out)
 {