* src/muscle_tab.c (muscle_percent_define_invalid_value): Replace
authorJoel E. Denny <jdenny@ces.clemson.edu>
Tue, 29 May 2007 03:06:34 +0000 (03:06 +0000)
committerJoel E. Denny <jdenny@ces.clemson.edu>
Tue, 29 May 2007 03:06:34 +0000 (03:06 +0000)
with...
(muscle_percent_define_check_values): ... this more helpful function.
Again, it's not used yet, but it will be.
* src/muscle_tab.h: Likewise.

ChangeLog
src/muscle_tab.c
src/muscle_tab.h

index 4f700c3..e2a97a0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-05-29  Joel E. Denny  <jdenny@ces.clemson.edu>
+
+       * src/muscle_tab.c (muscle_percent_define_invalid_value): Replace
+       with...
+       (muscle_percent_define_check_values): ... this more helpful function.
+       Again, it's not used yet, but it will be.
+       * src/muscle_tab.h: Likewise.
+
 2007-05-28  Joel E. Denny  <jdenny@ces.clemson.edu>
 
        * src/lalr.c (state_lookahead_tokens_count): For code readability,
index 9f67167..732fc27 100644 (file)
@@ -507,15 +507,44 @@ muscle_percent_define_default (char const *variable, char const *value)
 }
 
 void
-muscle_percent_define_invalid_value (char const *variable)
+muscle_percent_define_check_values (char const * const *values)
 {
-  char const *loc_name;
-  MUSCLE_USER_NAME_CONVERT (loc_name, "percent_define_loc(", variable, ")");
-  complain_at(muscle_location_decode (loc_name),
-              _("invalid value for %%define variable `%s'"), variable);
+  for (; *values; ++values)
+    {
+      char const *variable = *values;
+      char const *name;
+      char const *loc_name;
+      char *value;
+
+      MUSCLE_USER_NAME_CONVERT (name, "percent_define(", variable, ")");
+      MUSCLE_USER_NAME_CONVERT (loc_name, "percent_define_loc(", variable, ")");
+
+      value = muscle_string_decode (name);
+      if (value)
+        {
+          bool valid = false;
+          for (++values; *values; ++values)
+            {
+              if (0 == strcmp (value, *values))
+                {
+                  valid = true;
+                  while (*values)
+                    ++values;
+                  break;
+                }
+            }
+          if (!valid)
+            complain_at(muscle_location_decode (loc_name),
+                        _("invalid value for %%define variable `%s': `%s'"),
+                        variable, value);
+          free (value);
+        }
+      else
+        fatal(_("undefined %%define variable `%s' passed to muscle_percent_define_check_values"),
+              variable);
+    }
 }
 
-
 void
 muscle_percent_code_grow (char const *qualifier, location qualifier_loc,
                           char const *code, location code_loc)
index 96efaa3..4aab78c 100644 (file)
@@ -158,9 +158,16 @@ bool muscle_percent_define_flag_if (char const *variable);
    suspect that the value has yet influenced the output.  */
 void muscle_percent_define_default (char const *variable, char const *value);
 
-/* Complain that the value set for the %define variable VARIABLE is
-   invalid.  */
-void muscle_percent_define_invalid_value (char const *variable);
+/* VALUES points to a sequence of strings that is partitioned into
+   subsequences by NULL's, one terminating each subsequence.  The last
+   subsequence is followed by a second NULL.  For each subsequence, the first
+   string is the name of a %define variable, and all remaining strings in that
+   subsequence are the valid values for that variable.  Complain if such a
+   variable is undefined (a Bison error since the default value should have
+   been set already) or defined to any other value (possibly a user error).
+   Don't record this as a Bison usage of the variable as there's no reason to
+   suspect that the value has yet influenced the output.  */
+void muscle_percent_define_check_values (char const * const *values);
 
 /* Grow the muscle for the %code qualifier QUALIFIER appearing at QUALIFIER_LOC
    in the grammar file with code CODE appearing at CODE_LOC.  Record this as a