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-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,
}
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)
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