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