]> git.saurik.com Git - bison.git/blobdiff - src/muscle-tab.h
Merge remote-tracking branch 'origin/maint'
[bison.git] / src / muscle-tab.h
index 12e4f1d1f202e75f164d2c9d7e666795cfe3ef70..5f701ae41a242aaee5dc7fb840d12a178230db2d 100644 (file)
@@ -1,7 +1,6 @@
 /* Muscle table manager for Bison,
 
-   Copyright (C) 2001, 2002, 2003, 2006, 2007, 2008, 2009
-   Free Software Foundation, Inc.
+   Copyright (C) 2001-2003, 2006-2012 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -21,6 +20,8 @@
 #ifndef MUSCLE_TAB_H_
 # define MUSCLE_TAB_H_
 
+# include <quotearg.h>
+
 # include "location.h"
 
 void muscle_init (void);
@@ -33,40 +34,40 @@ void muscle_free (void);
 /* An obstack dedicated to receive muscle keys and values.  */
 extern struct obstack muscle_obstack;
 
-#define MUSCLE_INSERT_BOOL(Key, Value)                         \
-do {                                                           \
-  int v__ = Value;                                             \
-  MUSCLE_INSERT_INT (Key, v__);                                        \
+#define MUSCLE_INSERT_BOOL(Key, Value)                          \
+do {                                                            \
+  int v__ = Value;                                              \
+  MUSCLE_INSERT_INT (Key, v__);                                 \
 } while(0)
 
-#define MUSCLE_INSERT_INT(Key, Value)                          \
-do {                                                           \
-  obstack_fgrow1 (&muscle_obstack, "%d", Value);               \
-  obstack_1grow (&muscle_obstack, 0);                          \
-  muscle_insert (Key, obstack_finish (&muscle_obstack));       \
+#define MUSCLE_INSERT_INT(Key, Value)                           \
+do {                                                            \
+  obstack_fgrow1 (&muscle_obstack, "%d", Value);                \
+  obstack_1grow (&muscle_obstack, 0);                           \
+  muscle_insert (Key, obstack_finish (&muscle_obstack));        \
 } while(0)
 
-#define MUSCLE_INSERT_LONG_INT(Key, Value)                     \
-do {                                                           \
-  obstack_fgrow1 (&muscle_obstack, "%ld", Value);              \
-  obstack_1grow (&muscle_obstack, 0);                          \
-  muscle_insert (Key, obstack_finish (&muscle_obstack));       \
+#define MUSCLE_INSERT_LONG_INT(Key, Value)                      \
+do {                                                            \
+  obstack_fgrow1 (&muscle_obstack, "%ld", Value);               \
+  obstack_1grow (&muscle_obstack, 0);                           \
+  muscle_insert (Key, obstack_finish (&muscle_obstack));        \
 } while(0)
 
 /* Key -> Value, but don't apply escaping to Value. */
-#define MUSCLE_INSERT_STRING_RAW(Key, Value)                   \
-do {                                                           \
-  obstack_sgrow (&muscle_obstack, Value);                      \
-  obstack_1grow (&muscle_obstack, 0);                          \
-  muscle_insert (Key, obstack_finish (&muscle_obstack));       \
+#define MUSCLE_INSERT_STRING_RAW(Key, Value)                    \
+do {                                                            \
+  obstack_sgrow (&muscle_obstack, Value);                       \
+  obstack_1grow (&muscle_obstack, 0);                           \
+  muscle_insert (Key, obstack_finish (&muscle_obstack));        \
 } while(0)
 
 /* Key -> Value, applying M4 escaping to Value. */
-#define MUSCLE_INSERT_STRING(Key, Value)                       \
-do {                                                           \
+#define MUSCLE_INSERT_STRING(Key, Value)                        \
+do {                                                            \
   MUSCLE_OBSTACK_SGROW (&muscle_obstack, Value);                \
-  obstack_1grow (&muscle_obstack, 0);                          \
-  muscle_insert (Key, obstack_finish (&muscle_obstack));       \
+  obstack_1grow (&muscle_obstack, 0);                           \
+  muscle_insert (Key, obstack_finish (&muscle_obstack));        \
 } while(0)
 
 #define MUSCLE_OBSTACK_SGROW(Obstack, Value)            \
@@ -75,21 +76,21 @@ do {                                                    \
   for (p__ = Value; *p__; p__++)                        \
     switch (*p__)                                       \
       {                                                 \
-      case '$':        obstack_sgrow (Obstack, "$]["); break;  \
-      case '@':        obstack_sgrow (Obstack, "@@" ); break;  \
-      case '[':        obstack_sgrow (Obstack, "@{" ); break;  \
-      case ']':        obstack_sgrow (Obstack, "@}" ); break;  \
+      case '$': obstack_sgrow (Obstack, "$]["); break;  \
+      case '@': obstack_sgrow (Obstack, "@@" ); break;  \
+      case '[': obstack_sgrow (Obstack, "@{" ); break;  \
+      case ']': obstack_sgrow (Obstack, "@}" ); break;  \
       default: obstack_1grow (Obstack, *p__); break;    \
       }                                                 \
 } while(0)
 
-#define MUSCLE_INSERT_C_STRING(Key, Value)                     \
-do {                                                           \
-  MUSCLE_OBSTACK_SGROW (&muscle_obstack,                       \
-                       quotearg_style (c_quoting_style,        \
-                                       Value));                \
-  obstack_1grow (&muscle_obstack, 0);                          \
-  muscle_insert (Key, obstack_finish (&muscle_obstack));       \
+#define MUSCLE_INSERT_C_STRING(Key, Value)                      \
+do {                                                            \
+  MUSCLE_OBSTACK_SGROW (&muscle_obstack,                        \
+                        quotearg_style (c_quoting_style,        \
+                                        Value));                \
+  obstack_1grow (&muscle_obstack, 0);                           \
+  muscle_insert (Key, obstack_finish (&muscle_obstack));        \
 } while(0)
 
 /* Append VALUE to the current value of KEY.  If KEY did not already
@@ -110,7 +111,7 @@ void muscle_code_grow (const char *key, const char *value, location loc);
    muscle values are output *double* quoted, one needs to strip the first level
    of quotes to reach the list itself.  */
 void muscle_pair_list_grow (const char *muscle,
-                           const char *a1, const char *a2);
+                            const char *a1, const char *a2);
 
 /* In the format `[[file_name:line.column]], [[file_name:line.column]]', append
    LOC to MUSCLE.  Use digraphs for special characters in each file name.  */
@@ -126,12 +127,25 @@ void muscle_boundary_grow (char const *key, boundary bound);
 void muscle_user_name_list_grow (char const *key, char const *user_name,
                                  location loc);
 
-/* Define the muscle for the %define variable VARIABLE appearing at
-   VARIABLE_LOC with value VALUE.  Warn if VARIABLE is already defined.
-   Record this as a user occurrence of VARIABLE by invoking
+/* Indicates whether a variable's value was specified with -D/--define, with
+   -F/--force-define, or in the grammar file.  */
+typedef enum {
+  MUSCLE_PERCENT_DEFINE_D = 0, MUSCLE_PERCENT_DEFINE_F,
+  MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE
+} muscle_percent_define_how;
+
+/* Define the muscles for %define variable VARIABLE with VALUE specified
+   at VARIABLE_LOC in the manner HOW unless it was specified in the
+   grammar file while the previous definition for VARIABLE was specified
+   with -F/--force-define.  Complain if a previous definition is being
+   overridden and the new definition is specified in the grammar file.
+   (These rules support the documented behavior as long as command-line
+   definitions are processed before grammar file definitions.)  Record
+   this as a user occurrence of VARIABLE by invoking
    muscle_user_name_list_grow.  */
 void muscle_percent_define_insert (char const *variable, location variable_loc,
-                                   char const *value);
+                                   char const *value,
+                                   muscle_percent_define_how how);
 
 /* Make sure that VARIABLE is set to the boolean VALUE.  Warn on mismatches
    only, but accept repeated declaration.  Used for backward compatibility