]>
git.saurik.com Git - bison.git/blob - src/system.h
06224596b283af564c85167142886184a65f5091
   1 /* System-dependent definitions for Bison. 
   3    Copyright (C) 2000-2007, 2009-2012 Free Software Foundation, Inc. 
   5    This program is free software: you can redistribute it and/or modify 
   6    it under the terms of the GNU General Public License as published by 
   7    the Free Software Foundation, either version 3 of the License, or 
   8    (at your option) any later version. 
  10    This program is distributed in the hope that it will be useful, 
  11    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  13    GNU General Public License for more details. 
  15    You should have received a copy of the GNU General Public License 
  16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ 
  18 #ifndef BISON_SYSTEM_H 
  19 # define BISON_SYSTEM_H 
  21 /* flex 2.5.31 gratutiously defines macros like INT8_MIN.  But this 
  22    runs afoul of pre-C99 compilers that have <inttypes.h> or 
  23    <stdint.h>, which are included below if available.  It also runs 
  24    afoul of pre-C99 compilers that define these macros in <limits.h>.  */ 
  25 # if ! defined __STDC_VERSION__ || __STDC_VERSION__ < 199901 
  43 #  include <sys/types.h> 
  47 # include <inttypes.h> 
  50 /* This isn't perfect, but it's good enough for Bison, which needs 
  51    only to hash pointers.  */ 
  52 typedef size_t uintptr_t; 
  56 # define EX_MISMATCH 63 
  62 # include <unlocked-io.h> 
  71 /* Use PACIFY_CC to indicate that Code is unimportant to the logic of Bison 
  72    but that it is necessary for suppressing compiler warnings.  For example, 
  73    Code might be a variable initializer that's always overwritten before the 
  76    PACIFY_CC is intended to be useful only as a comment as it does not alter 
  77    Code.  It is tempting to redefine PACIFY_CC so that it will suppress Code 
  78    when configuring without --enable-gcc-warnings.  However, that would mean 
  79    that, for maintainers, Bison would compile with potentially less warnings 
  80    and safer logic than it would for users.  Due to the overhead of M4, 
  81    suppressing Code is unlikely to offer any significant improvement in 
  82    Bison's performance anyway.  */ 
  83 # define PACIFY_CC(Code) Code 
  85 # ifndef __attribute__ 
  86 /* This feature is available in gcc versions 2.5 and later.  */ 
  87 #  if (! defined __GNUC__ || __GNUC__ < 2 \ 
  88        || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) 
  89 #   define __attribute__(Spec) /* empty */ 
  93 /* The __-protected variants of `format' and `printf' attributes 
  94    are accepted by gcc versions 2.6.4 (effectively 2.7) and later.  */ 
  95 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) 
  96 #  define __format__ format 
  97 #  define __printf__ printf 
 100 # ifndef ATTRIBUTE_NORETURN 
 101 #  define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) 
 104 # ifndef ATTRIBUTE_UNUSED 
 105 #  define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) 
 108 # define FUNCTION_PRINT() fprintf (stderr, "%s: ", __func__) 
 116 # include <gettext.h> 
 117 # define _(Msgid)  gettext (Msgid) 
 118 # define N_(Msgid) (Msgid) 
 125 # include <stdbool.h> 
 133 /* In the past, Bison defined aver to simply invoke abort in the case of 
 134    a failed assertion.  The rationale was that <assert.h>'s assertions 
 135    were too heavyweight and could be disabled too easily.  See 
 137    <http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00080.html> 
 138    <http://lists.gnu.org/archive/html/bison-patches/2006-09/msg00111.html>. 
 140    However, normal assert output can be helpful during development and 
 141    in bug reports from users.  Moreover, it's not clear now that 
 142    <assert.h>'s assertions are significantly heavyweight.  Finally, if 
 143    users want to experiment with disabling assertions, it's debatable 
 144    whether it's our responsibility to stop them.  See discussion 
 146    <http://lists.gnu.org/archive/html/bison-patches/2009-09/msg00013.html>. 
 148    For now, we use assert but we call it aver throughout Bison in case 
 149    we later wish to try another scheme. 
 159 # define obstack_chunk_alloc xmalloc 
 160 # define obstack_chunk_free  free 
 161 # include <obstack.h> 
 163 # define obstack_sgrow(Obs, Str)                \ 
 164   obstack_grow (Obs, Str, strlen (Str)) 
 166 # define obstack_fgrow1(Obs, Format, Arg1)      \ 
 169     sprintf (buf, Format, Arg1);                \ 
 170     obstack_grow (Obs, buf, strlen (buf));      \ 
 173 # define obstack_fgrow2(Obs, Format, Arg1, Arg2)        \ 
 176     sprintf (buf, Format, Arg1, Arg2);                  \ 
 177     obstack_grow (Obs, buf, strlen (buf));              \ 
 180 # define obstack_fgrow3(Obs, Format, Arg1, Arg2, Arg3)  \ 
 183     sprintf (buf, Format, Arg1, Arg2, Arg3);            \ 
 184     obstack_grow (Obs, buf, strlen (buf));              \ 
 187 # define obstack_fgrow4(Obs, Format, Arg1, Arg2, Arg3, Arg4)    \ 
 190     sprintf (buf, Format, Arg1, Arg2, Arg3, Arg4);              \ 
 191     obstack_grow (Obs, buf, strlen (buf));                      \ 
 195 /* Output Str escaped for our postprocessing (i.e., escape M4 special 
 198    For instance "[foo]" -> "@{foo@}", "$$" -> "$][$][". */ 
 200 # define obstack_escape(Obs, Str)                       \ 
 203     for (p = Str; *p; p++)                              \ 
 206         case '$': obstack_sgrow (Obs, "$]["); break;    \ 
 207         case '@': obstack_sgrow (Obs, "@@" ); break;    \ 
 208         case '[': obstack_sgrow (Obs, "@{" ); break;    \ 
 209         case ']': obstack_sgrow (Obs, "@}" ); break;    \ 
 210         default:  obstack_1grow (Obs, *p   ); break;    \ 
 217 /*-----------------------------------------. 
 218 | Extensions to use for the output files.  | 
 219 `-----------------------------------------*/ 
 222 #  define OUTPUT_EXT ".output" 
 226 #  define TAB_EXT ".tab" 
 231 /*---------------------. 
 232 | Free a linked list.  | 
 233 `---------------------*/ 
 235 # define LIST_FREE(Type, List)                  \ 
 237     Type *_node, *_next;                        \ 
 238     for (_node = List; _node; _node = _next)    \ 
 240         _next = _node->next;                    \ 
 246 /*---------------------------------------------. 
 247 | Debugging memory allocation (must be last).  | 
 248 `---------------------------------------------*/ 
 251 #  define DMALLOC_FUNC_CHECK 
 252 #  include <dmalloc.h> 
 253 # endif /* WITH_DMALLOC */ 
 255 #endif  /* ! BISON_SYSTEM_H */