]>
git.saurik.com Git - bison.git/blob - src/system.h
   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 
  42 # include <inttypes.h> 
  45 /* This isn't perfect, but it's good enough for Bison, which needs 
  46    only to hash pointers.  */ 
  47 typedef size_t uintptr_t; 
  51 # define EX_MISMATCH 63 
  57 # include <unlocked-io.h> 
  66 /* Use PACIFY_CC to indicate that Code is unimportant to the logic of Bison 
  67    but that it is necessary for suppressing compiler warnings.  For example, 
  68    Code might be a variable initializer that's always overwritten before the 
  71    PACIFY_CC is intended to be useful only as a comment as it does not alter 
  72    Code.  It is tempting to redefine PACIFY_CC so that it will suppress Code 
  73    when configuring without --enable-gcc-warnings.  However, that would mean 
  74    that, for maintainers, Bison would compile with potentially less warnings 
  75    and safer logic than it would for users.  Due to the overhead of M4, 
  76    suppressing Code is unlikely to offer any significant improvement in 
  77    Bison's performance anyway.  */ 
  78 # define PACIFY_CC(Code) Code 
  80 # ifndef __attribute__ 
  81 /* This feature is available in gcc versions 2.5 and later.  */ 
  82 #  if (! defined __GNUC__ || __GNUC__ < 2 \ 
  83        || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) 
  84 #   define __attribute__(Spec) /* empty */ 
  88 /* The __-protected variants of `format' and `printf' attributes 
  89    are accepted by gcc versions 2.6.4 (effectively 2.7) and later.  */ 
  90 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) 
  91 #  define __format__ format 
  92 #  define __printf__ printf 
  95 # ifndef ATTRIBUTE_NORETURN 
  96 #  define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) 
  99 # ifndef ATTRIBUTE_UNUSED 
 100 #  define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) 
 110 # include <gettext.h> 
 111 # define _(Msgid)  gettext (Msgid) 
 112 # define N_(Msgid) (Msgid) 
 119 # include <stdbool.h> 
 127 /* In the past, Bison defined aver to simply invoke abort in the case of 
 128    a failed assertion.  The rationale was that <assert.h>'s assertions 
 129    were too heavyweight and could be disabled too easily.  See 
 131    <http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00080.html> 
 132    <http://lists.gnu.org/archive/html/bison-patches/2006-09/msg00111.html>. 
 134    However, normal assert output can be helpful during development and 
 135    in bug reports from users.  Moreover, it's not clear now that 
 136    <assert.h>'s assertions are significantly heavyweight.  Finally, if 
 137    users want to experiment with disabling assertions, it's debatable 
 138    whether it's our responsibility to stop them.  See discussion 
 140    <http://lists.gnu.org/archive/html/bison-patches/2009-09/msg00013.html>. 
 142    For now, we use assert but we call it aver throughout Bison in case 
 143    we later wish to try another scheme. 
 153 # define obstack_chunk_alloc xmalloc 
 154 # define obstack_chunk_free  free 
 155 # include <obstack.h> 
 157 # define obstack_sgrow(Obs, Str)                \ 
 158   obstack_grow (Obs, Str, strlen (Str)) 
 160 /* Output Str escaped for our postprocessing (i.e., escape M4 special 
 163    For instance "[foo]" -> "@{foo@}", "$$" -> "$][$][". */ 
 165 # define obstack_escape(Obs, Str)                       \ 
 168     for (p = Str; *p; p++)                              \ 
 171         case '$': obstack_sgrow (Obs, "$]["); break;    \ 
 172         case '@': obstack_sgrow (Obs, "@@" ); break;    \ 
 173         case '[': obstack_sgrow (Obs, "@{" ); break;    \ 
 174         case ']': obstack_sgrow (Obs, "@}" ); break;    \ 
 175         default:  obstack_1grow (Obs, *p   ); break;    \ 
 180 /* Output Str both quoted for M4 (i.e., embed in [[...]]), and escaped 
 181    for our postprocessing (i.e., escape M4 special characters).  If 
 182    Str is empty (or NULL), output "[]" instead of "[[]]" as it make M4 
 183    programming easier (m4_ifval can be used). 
 185    For instance "[foo]" -> "[[@{foo@}]]", "$$" -> "[[$][$][]]". */ 
 187 # define obstack_quote(Obs, Str)                \ 
 189     char const* obstack_quote_p = Str;          \ 
 190     if (obstack_quote_p && obstack_quote_p[0])  \ 
 192         obstack_sgrow (Obs, "[[");              \ 
 193         obstack_escape (Obs, obstack_quote_p);  \ 
 194         obstack_sgrow (Obs, "]]");              \ 
 197       obstack_sgrow (Obs, "[]");                \ 
 204 /*-----------------------------------------. 
 205 | Extensions to use for the output files.  | 
 206 `-----------------------------------------*/ 
 209 #  define OUTPUT_EXT ".output" 
 213 #  define TAB_EXT ".tab" 
 218 /*---------------------. 
 219 | Free a linked list.  | 
 220 `---------------------*/ 
 222 # define LIST_FREE(Type, List)                  \ 
 224     Type *_node, *_next;                        \ 
 225     for (_node = List; _node; _node = _next)    \ 
 227         _next = _node->next;                    \ 
 233 /*---------------------------------------------. 
 234 | Debugging memory allocation (must be last).  | 
 235 `---------------------------------------------*/ 
 238 #  define DMALLOC_FUNC_CHECK 
 239 #  include <dmalloc.h> 
 240 # endif /* WITH_DMALLOC */ 
 242 #endif  /* ! BISON_SYSTEM_H */