]> git.saurik.com Git - bison.git/blob - src/muscle_tab.h
eb01241fdb6719bc4f231a3075ee5e4e149108e9
[bison.git] / src / muscle_tab.h
1 /* Muscle table manager for Bison,
2 Copyright (C) 2001, 2002, 2003, 2006 Free Software Foundation, Inc.
3
4 This file is part of Bison, the GNU Compiler Compiler.
5
6 Bison is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 Bison is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with Bison; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA. */
20
21 #ifndef MUSCLE_TAB_H_
22 # define MUSCLE_TAB_H_
23
24 # include "location.h"
25
26 void muscle_init (void);
27 void muscle_insert (char const *key, char const *value);
28 char *muscle_find (char const *key);
29 char const *muscle_find_const (char const *key);
30 void muscle_free (void);
31
32
33 /* An obstack dedicated to receive muscle keys and values. */
34 extern struct obstack muscle_obstack;
35
36 #define MUSCLE_INSERT_BOOL(Key, Value) \
37 do { \
38 int v = Value; \
39 MUSCLE_INSERT_INT (Key, v); \
40 } while(0)
41
42 #define MUSCLE_INSERT_INT(Key, Value) \
43 do { \
44 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
45 obstack_1grow (&muscle_obstack, 0); \
46 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
47 } while(0)
48
49 #define MUSCLE_INSERT_LONG_INT(Key, Value) \
50 do { \
51 obstack_fgrow1 (&muscle_obstack, "%ld", Value); \
52 obstack_1grow (&muscle_obstack, 0); \
53 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
54 } while(0)
55
56 #define MUSCLE_INSERT_STRING_RAW(Key, Value) \
57 do { \
58 obstack_sgrow (&muscle_obstack, Value); \
59 obstack_1grow (&muscle_obstack, 0); \
60 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
61 } while(0)
62
63 #define MUSCLE_INSERT_STRING(Key, Value) \
64 do { \
65 MUSCLE_OBSTACK_SGROW (&muscle_obstack, Value); \
66 obstack_1grow (&muscle_obstack, 0); \
67 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
68 } while(0)
69
70 #define MUSCLE_OBSTACK_SGROW(Obstack, Value) \
71 do { \
72 char const *p; \
73 for (p = Value; *p; p++) \
74 switch (*p) \
75 { \
76 case '$': obstack_sgrow (Obstack, "$]["); break; \
77 case '@': obstack_sgrow (Obstack, "@@" ); break; \
78 case '[': obstack_sgrow (Obstack, "@{" ); break; \
79 case ']': obstack_sgrow (Obstack, "@}" ); break; \
80 default: obstack_1grow (Obstack, *p); break; \
81 } \
82 } while(0)
83
84 #define MUSCLE_INSERT_C_STRING(Key, Value) \
85 do { \
86 MUSCLE_OBSTACK_SGROW (&muscle_obstack, \
87 quotearg_style (c_quoting_style, \
88 Value)); \
89 obstack_1grow (&muscle_obstack, 0); \
90 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
91 } while(0)
92
93 /* Append VALUE to the current value of KEY. If KEY did not already
94 exist, create it. Use MUSCLE_OBSTACK. De-allocate the previously
95 associated value. Copy VALUE and SEPARATOR. */
96
97 void muscle_grow (const char *key, const char *value, const char *separator);
98
99
100 /* Append VALUE to the current value of KEY, using muscle_grow. But
101 in addition, issue a synchronization line for the location LOC. */
102
103 void muscle_code_grow (const char *key, const char *value, location loc);
104
105
106 /* MUSCLE is an M4 list of pairs. Create or extend it with the pair
107 (A1, A2) after escaping both values with digraphs. Note that because the
108 muscle values are output *double* quoted, one needs to strip the first level
109 of quotes to reach the list itself. */
110 void muscle_pair_list_grow (const char *muscle,
111 const char *a1, const char *a2);
112
113 void muscles_m4_output (FILE *out);
114
115 /* In the format `file_name:line.column', append BOUND to MUSCLE. Use digraphs
116 for special characters in the file name. */
117 void muscle_boundary_grow (char const *key, boundary bound);
118
119 /* Grow KEY for the occurrence of the name USER_NAME at LOC appropriately for
120 use with b4_check_user_names in ../data/bison.m4. USER_NAME is not escaped
121 with digraphs, so it must not contain `[' or `]'. */
122 void muscle_grow_user_name_list (char const *key, char const *user_name,
123 location loc);
124
125 #endif /* not MUSCLE_TAB_H_ */