]>
git.saurik.com Git - bison.git/blob - src/muscle_tab.h
   1 /* Muscle table manager for Bison, 
   2    Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. 
   4    This file is part of Bison, the GNU Compiler Compiler. 
   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) 
  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. 
  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., 59 Temple Place - Suite 330, 
  19    Boston, MA 02111-1307, USA.  */ 
  22 # define MUSCLE_TAB_H_ 
  24 void muscle_init (void); 
  25 void muscle_insert (const char *key
, char *value
); 
  26 char *muscle_find (const char *key
); 
  27 void muscle_free (void); 
  30 /* An obstack dedicated to receive muscle keys and values.  */ 
  31 extern struct obstack muscle_obstack
; 
  33 #define MUSCLE_INSERT_BOOL(Key, Value)                          \ 
  36   MUSCLE_INSERT_INT (Key, v);                                   \ 
  39 #define MUSCLE_INSERT_INT(Key, Value)                           \ 
  41   obstack_fgrow1 (&muscle_obstack, "%d", Value);                \ 
  42   obstack_1grow (&muscle_obstack, 0);                           \ 
  43   muscle_insert (Key, obstack_finish (&muscle_obstack));        \ 
  46 #define MUSCLE_INSERT_LONG_INT(Key, Value)                      \ 
  48   obstack_fgrow1 (&muscle_obstack, "%ld", Value);               \ 
  49   obstack_1grow (&muscle_obstack, 0);                           \ 
  50   muscle_insert (Key, obstack_finish (&muscle_obstack));        \ 
  53 #define MUSCLE_INSERT_STRING(Key, Value)                        \ 
  55   obstack_sgrow (&muscle_obstack, Value);                       \ 
  56   obstack_1grow (&muscle_obstack, 0);                           \ 
  57   muscle_insert (Key, obstack_finish (&muscle_obstack));        \ 
  60 #define MUSCLE_OBSTACK_SGROW(Obstack, Value)                    \ 
  63   for (p = Value; *p; p++)                                      \ 
  66       case '$': obstack_sgrow (Obstack, "$]["); break;          \ 
  67       case '@': obstack_sgrow (Obstack, "@@" ); break;          \ 
  68       case '[': obstack_sgrow (Obstack, "@{" ); break;          \ 
  69       case ']': obstack_sgrow (Obstack, "@}" ); break;          \ 
  70       default: obstack_1grow (Obstack, *p); break;              \ 
  74 #define MUSCLE_INSERT_C_STRING(Key, Value)                      \ 
  76   MUSCLE_OBSTACK_SGROW (&muscle_obstack,                        \ 
  77                         quotearg_style (c_quoting_style,        \ 
  79   obstack_1grow (&muscle_obstack, 0);                           \ 
  80   muscle_insert (Key, obstack_finish (&muscle_obstack));        \ 
  83 /* Insert (KEY, VALUE).  If KEY already existed, overwrite the 
  84    previous value.  Uses MUSCLE_OBSTACK.  De-allocates the previously 
  85    associated value.  VALUE and SEPARATOR are copied.  */ 
  87 void muscle_grow (const char *key
, const char *value
, const char *separator
); 
  89 /* MUSCLE is an M4 list of pairs.  Create or extend it with the pair 
  90    (A1, A2).  Note that because the muscle values are output *double* 
  91    quoted, one needs to strip the first level of quotes to reach the 
  94 void muscle_pair_list_grow (const char *muscle
, 
  95                             const char *a1
, const char *a2
); 
  97 void muscles_m4_output (FILE *out
); 
  99 #endif /* not MUSCLE_TAB_H_ */