1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* System-dependent definitions for Bison.
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 2000-2007, 2009-2012 Free Software Foundation, Inc.
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation, either version 3 of the License, or
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This program is distributed in the hope that it will be useful,
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef BISON_SYSTEM_H
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define BISON_SYSTEM_H
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* flex 2.5.31 gratutiously defines macros like INT8_MIN.  But this
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   runs afoul of pre-C99 compilers that have <inttypes.h> or
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   <stdint.h>, which are included below if available.  It also runs
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   afoul of pre-C99 compilers that define these macros in <limits.h>.  */
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ! defined __STDC_VERSION__ || __STDC_VERSION__ < 199901
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef INT8_MIN
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef INT16_MIN
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef INT32_MIN
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef INT8_MAX
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef INT16_MAX
3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef UINT8_MAX
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef INT32_MAX
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef UINT16_MAX
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef UINT32_MAX
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <limits.h>
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <stddef.h>
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <stdlib.h>
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <string.h>
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <unistd.h>
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <inttypes.h>
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define STREQ(L, R)  (strcmp(L, R) == 0)
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define STRNEQ(L, R) (!STREQ(L, R))
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ifndef UINTPTR_MAX
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* This isn't perfect, but it's good enough for Bison, which needs
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   only to hash pointers.  */
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef size_t uintptr_t;
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Version mismatch. */
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define EX_MISMATCH 63
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*---------.
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Gnulib.  |
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang`---------*/
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <unlocked-io.h>
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <verify.h>
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <xalloc.h>
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------------.
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| GCC extensions.  |
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------------*/
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Use PACIFY_CC to indicate that Code is unimportant to the logic of Bison
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   but that it is necessary for suppressing compiler warnings.  For example,
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Code might be a variable initializer that's always overwritten before the
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   variable is used.
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   PACIFY_CC is intended to be useful only as a comment as it does not alter
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Code.  It is tempting to redefine PACIFY_CC so that it will suppress Code
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   when configuring without --enable-gcc-warnings.  However, that would mean
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   that, for maintainers, Bison would compile with potentially less warnings
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   and safer logic than it would for users.  Due to the overhead of M4,
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   suppressing Code is unlikely to offer any significant improvement in
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Bison's performance anyway.  */
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define PACIFY_CC(Code) Code
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ifndef __attribute__
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* This feature is available in gcc versions 2.5 and later.  */
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if (! defined __GNUC__ || __GNUC__ < 2 \
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define __attribute__(Spec) /* empty */
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The __-protected variants of `format' and `printf' attributes
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   are accepted by gcc versions 2.6.4 (effectively 2.7) and later.  */
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define __format__ format
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define __printf__ printf
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ifndef ATTRIBUTE_NORETURN
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ifndef ATTRIBUTE_UNUSED
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------.
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| NLS.  |
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------*/
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <locale.h>
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <gettext.h>
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _(Msgid)  gettext (Msgid)
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define N_(Msgid) (Msgid)
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------.
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Booleans.  |
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------*/
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <stdbool.h>
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*-------------.
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Assertions.  |
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang`-------------*/
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* In the past, Bison defined aver to simply invoke abort in the case of
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   a failed assertion.  The rationale was that <assert.h>'s assertions
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   were too heavyweight and could be disabled too easily.  See
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   discussions at
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   <http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00080.html>
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   <http://lists.gnu.org/archive/html/bison-patches/2006-09/msg00111.html>.
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   However, normal assert output can be helpful during development and
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   in bug reports from users.  Moreover, it's not clear now that
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   <assert.h>'s assertions are significantly heavyweight.  Finally, if
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   users want to experiment with disabling assertions, it's debatable
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   whether it's our responsibility to stop them.  See discussion
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   starting at
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   <http://lists.gnu.org/archive/html/bison-patches/2009-09/msg00013.html>.
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   For now, we use assert but we call it aver throughout Bison in case
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   we later wish to try another scheme.
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang*/
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <assert.h>
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define aver assert
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------.
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Obstacks.  |
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------*/
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_chunk_alloc xmalloc
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_chunk_free  free
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <obstack.h>
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_sgrow(Obs, Str)                \
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_grow (Obs, Str, strlen (Str))
163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Output Str escaped for our postprocessing (i.e., escape M4 special
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   characters).
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   For instance "[foo]" -> "@{foo@}", "$$" -> "$][$][". */
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_escape(Obs, Str)                       \
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  do {                                                  \
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    char const *p;                                      \
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    for (p = Str; *p; p++)                              \
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      switch (*p)                                       \
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {                                               \
17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '$': obstack_sgrow (Obs, "$]["); break;    \
17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '@': obstack_sgrow (Obs, "@@" ); break;    \
17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '[': obstack_sgrow (Obs, "@{" ); break;    \
17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case ']': obstack_sgrow (Obs, "@}" ); break;    \
17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        default:  obstack_1grow (Obs, *p   ); break;    \
18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }                                               \
18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  } while (0)
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Output Str both quoted for M4 (i.e., embed in [[...]]), and escaped
18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   for our postprocessing (i.e., escape M4 special characters).  If
18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Str is empty (or NULL), output "[]" instead of "[[]]" as it make M4
18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   programming easier (m4_ifval can be used).
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   For instance "[foo]" -> "[[@{foo@}]]", "$$" -> "[[$][$][]]". */
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_quote(Obs, Str)                \
19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  do {                                          \
19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    char const* obstack_quote_p = Str;          \
19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if (obstack_quote_p && obstack_quote_p[0])  \
19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      {                                         \
19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        obstack_sgrow (Obs, "[[");              \
19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        obstack_escape (Obs, obstack_quote_p);  \
19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        obstack_sgrow (Obs, "]]");              \
19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      }                                         \
20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    else                                        \
20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      obstack_sgrow (Obs, "[]");                \
20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  } while (0)
20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Append the ending 0, finish Obs, and return the string.  */
20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_finish0(Obs)                           \
20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  (obstack_1grow (Obs, '\0'), (char *) obstack_finish (Obs))
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------------------------------------.
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Extensions to use for the output files.  |
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------------------------------------*/
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ifndef OUTPUT_EXT
21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define OUTPUT_EXT ".output"
21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ifndef TAB_EXT
22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define TAB_EXT ".tab"
22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------.
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Free a linked list.  |
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------*/
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LIST_FREE(Type, List)                  \
23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  do {                                          \
23105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    Type *_node, *_next;                        \
23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    for (_node = List; _node; _node = _next)    \
23305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      {                                         \
23405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        _next = _node->next;                    \
23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        free (_node);                           \
23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      }                                         \
23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  } while (0)
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------------------------------.
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Debugging memory allocation (must be last).  |
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------------------------------*/
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if WITH_DMALLOC
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define DMALLOC_FUNC_CHECK
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  include <dmalloc.h>
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif /* WITH_DMALLOC */
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif  /* ! BISON_SYSTEM_H */
250