1 /* Muscle table manager for Bison, 2 Copyright (C) 2001, 2002, 2003 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 (const char *key, char *value); 28 char *muscle_find (const char *key); 29 void muscle_free (void); 30 31 32 /* An obstack dedicated to receive muscle keys and values. */ 33 extern struct obstack muscle_obstack; 34 35 #define MUSCLE_INSERT_BOOL(Key, Value) \ 36 { \ 37 int v = Value; \ 38 MUSCLE_INSERT_INT (Key, v); \ 39 } 40 41 #define MUSCLE_INSERT_INT(Key, Value) \ 42 { \ 43 obstack_fgrow1 (&muscle_obstack, "%d", Value); \ 44 obstack_1grow (&muscle_obstack, 0); \ 45 muscle_insert (Key, obstack_finish (&muscle_obstack)); \ 46 } 47 48 #define MUSCLE_INSERT_LONG_INT(Key, Value) \ 49 { \ 50 obstack_fgrow1 (&muscle_obstack, "%ld", Value); \ 51 obstack_1grow (&muscle_obstack, 0); \ 52 muscle_insert (Key, obstack_finish (&muscle_obstack)); \ 53 } 54 55 #define MUSCLE_INSERT_STRING(Key, Value) \ 56 { \ 57 obstack_sgrow (&muscle_obstack, Value); \ 58 obstack_1grow (&muscle_obstack, 0); \ 59 muscle_insert (Key, obstack_finish (&muscle_obstack)); \ 60 } 61 62 #define MUSCLE_OBSTACK_SGROW(Obstack, Value) \ 63 { \ 64 char const *p; \ 65 for (p = Value; *p; p++) \ 66 switch (*p) \ 67 { \ 68 case '$': obstack_sgrow (Obstack, "$]["); break; \ 69 case '@': obstack_sgrow (Obstack, "@@" ); break; \ 70 case '[': obstack_sgrow (Obstack, "@{" ); break; \ 71 case ']': obstack_sgrow (Obstack, "@}" ); break; \ 72 default: obstack_1grow (Obstack, *p); break; \ 73 } \ 74 } 75 76 #define MUSCLE_INSERT_C_STRING(Key, Value) \ 77 { \ 78 MUSCLE_OBSTACK_SGROW (&muscle_obstack, \ 79 quotearg_style (c_quoting_style, \ 80 Value)); \ 81 obstack_1grow (&muscle_obstack, 0); \ 82 muscle_insert (Key, obstack_finish (&muscle_obstack)); \ 83 } 84 85 /* Insert (KEY, VALUE). If KEY already existed, overwrite the 86 previous value. Uses MUSCLE_OBSTACK. De-allocates the previously 87 associated value. VALUE and SEPARATOR are copied. */ 88 89 void muscle_grow (const char *key, const char *value, const char *separator); 90 91 92 /* Append VALUE to the current value of KEY, using muscle_grow. But 93 in addition, issue a synchronization line for the location LOC. */ 94 95 void muscle_code_grow (const char *key, const char *value, location loc); 96 97 98 /* MUSCLE is an M4 list of pairs. Create or extend it with the pair 99 (A1, A2). Note that because the muscle values are output *double* 100 quoted, one needs to strip the first level of quotes to reach the 101 list itself. */ 102 103 void muscle_pair_list_grow (const char *muscle, 104 const char *a1, const char *a2); 105 106 void muscles_m4_output (FILE *out); 107 108 #endif /* not MUSCLE_TAB_H_ */ 109