a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/* $Xorg: Xalloca.h,v 1.4 2001/02/09 02:03:22 xorgcvs Exp $ */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncCopyright 1995, 1998 The Open Group
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncPermission to use, copy, modify, distribute, and sell this software and its
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncdocumentation for any purpose is hereby granted without fee, provided that
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncthe above copyright notice appear in all copies and that both that
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsynccopyright notice and this permission notice appear in supporting
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncdocumentation.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncThe above copyright notice and this permission notice shall be
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncincluded in all copies or substantial portions of the Software.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncOTHER DEALINGS IN THE SOFTWARE.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncExcept as contained in this notice, the name of The Open Group shall
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncnot be used in advertising or otherwise to promote the sale, use or
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncother dealings in this Software without prior written authorization
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncfrom The Open Group.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync*/
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/* $XFree86: xc/include/Xalloca.h,v 3.11 2002/12/01 20:08:41 tsi Exp $ */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * The purpose of this header is to define the macros ALLOCATE_LOCAL and
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * DEALLOCATE_LOCAL appropriately for the platform being compiled on.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * These macros are used to make fast, function-local memory allocations.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Their characteristics are as follows:
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * void *ALLOCATE_LOCAL(int size)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Returns a pointer to size bytes of memory, or NULL if the allocation
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * failed. The memory must be freed with DEALLOCATE_LOCAL before the
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * function that made the allocation returns. You should not ask for
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * large blocks of memory with this function, since on many platforms
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * the memory comes from the stack, which may have limited size.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * void DEALLOCATE_LOCAL(void *)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Frees the memory allocated by ALLOCATE_LOCAL. Omission of this
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * step may be harmless on some platforms, but will result in
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * memory leaks or worse on others.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Before including this file, you should define two macros,
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * ALLOCATE_LOCAL_FALLBACK and DEALLOCATE_LOCAL_FALLBACK, that have the
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * same characteristics as ALLOCATE_LOCAL and DEALLOCATE_LOCAL. The
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * header uses the fallbacks if it doesn't know a "better" way to define
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * ALLOCATE_LOCAL and DEALLOCATE_LOCAL. Typical usage would be:
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * #define ALLOCATE_LOCAL_FALLBACK(_size) malloc(_size)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * #define DEALLOCATE_LOCAL_FALLBACK(_ptr) free(_ptr)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * #include "Xalloca.h"
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#ifndef XALLOCA_H
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define XALLOCA_H 1
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#ifdef INCLUDE_ALLOCA_H
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# include <alloca.h>
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#ifndef NO_ALLOCA
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * os-dependent definition of local allocation and deallocation
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * If you want something other than (DE)ALLOCATE_LOCAL_FALLBACK
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * for ALLOCATE/DEALLOCATE_LOCAL then you add that in here.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(__HIGHC__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# ifndef NCR
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync extern char *alloca();
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if HCVERSION < 21003
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ALLOCATE_LOCAL(size) alloca((int)(size))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync pragma on(alloca);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# else /* HCVERSION >= 21003 */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ALLOCATE_LOCAL(size) _Alloca((int)(size))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif /* HCVERSION < 21003 */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# else /* NCR */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ALLOCATE_LOCAL(size) alloca(size)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif /* defined(__HIGHC__) */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# ifdef __GNUC__
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# ifndef alloca
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define alloca __builtin_alloca
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif /* !alloca */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ALLOCATE_LOCAL(size) alloca((int)(size))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# else /* ! __GNUC__ */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * warning: old mips alloca (pre 2.10) is unusable, new one is built in
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Test is easy, the new one is named __builtin_alloca and comes
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * from alloca.h which #defines alloca.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# ifndef NCR
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(vax) || defined(sun) || defined(apollo) || defined(stellar) || defined(alloca)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Some System V boxes extract alloca.o from /lib/libPW.a; if you
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * decide that you don't want to use alloca, you might want to fix it here.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/* alloca might be a macro taking one arg (hi, Sun!), so give it one. */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# ifndef __sgi /* IRIX 5/6 has definition */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# ifndef __QNX__
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define __Xnullarg /* as nothing */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# ifndef X_NOT_STDC_ENV
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync extern void *alloca(__Xnullarg);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# else
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync extern char *alloca(__Xnullarg);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif /* __QNX__ */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif /* __sgi */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ALLOCATE_LOCAL(size) alloca((int)(size))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif /* who does alloca */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif /* NCR */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif /* __GNUC__ */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif /* NO_ALLOCA */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#if !defined(ALLOCATE_LOCAL)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(ALLOCATE_LOCAL_FALLBACK) && defined(DEALLOCATE_LOCAL_FALLBACK)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ALLOCATE_LOCAL(_size) ALLOCATE_LOCAL_FALLBACK(_size)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define DEALLOCATE_LOCAL(_ptr) DEALLOCATE_LOCAL_FALLBACK(_ptr)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# else /* no fallbacks supplied; error */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ALLOCATE_LOCAL(_size) ALLOCATE_LOCAL_FALLBACK undefined!
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define DEALLOCATE_LOCAL(_ptr) DEALLOCATE_LOCAL_FALLBACK undefined!
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif /* defined(ALLOCATE_LOCAL_FALLBACK && DEALLOCATE_LOCAL_FALLBACK) */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#else
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if !defined(DEALLOCATE_LOCAL)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define DEALLOCATE_LOCAL(_ptr) do {} while(0)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif /* defined(ALLOCATE_LOCAL) */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif /* XALLOCA_H */