/* Machine/OS specific configuration information for GNUstep

   Please NOTE - GSConfig.h is generated by the configure script from the
   file GSConfig.h.in - changes/fixes need to be made to the original file,
   not to the GSConfig.h generated from it.

   Copyright (C) 1998,1999 Free Software Foundation, Inc.

   Written by:  Richard frith-Macdonald <richard@brainstorm.co.uk>

   This file is part of the GNUstep Base Library.

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 3 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, write to the Free
   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02111 USA.
   */

#ifndef	included_GSConfig_h
#define	included_GSConfig_h

/*
 * Ensure some standard types are defined.
 */
#include <stdint.h>

#include <machine/endian.h>

/*
 * Definition to specify if your processor stores words with the most
 * significant byte first (like Motorola and SPARC, unlike Intel and VAX).
 */
#define GS_WORDS_BIGENDIAN	(BYTE_ORDER == BIG_ENDIAN)

/*
 *	Size definitions for standard types
 */
#define	GS_SIZEOF_SHORT		@ac_cv_sizeof_short@
#define	GS_SIZEOF_INT		@ac_cv_sizeof_int@
#define	GS_SIZEOF_LONG		@ac_cv_sizeof_long@
#define	GS_SIZEOF_LONG_LONG	@ac_cv_sizeof_long_long@
#define	GS_SIZEOF_FLOAT		@ac_cv_sizeof_float@
#define	GS_SIZEOF_DOUBLE	@ac_cv_sizeof_double@
#define	GS_SIZEOF_VOIDP		@ac_cv_sizeof_voidp@

/*
 *	Size information to be places in bits 5 and 6 of type encoding bytes
 *	in archives (bits 0 to 4 are used for basic type info and bit 7 is
 *	used to mark cross-references to previously encoded objects).
 */
#define	_GSC_S_SHT	_GSC_I16
#define	_GSC_S_INT	_GSC_I32
#if __LP64__
#define _GSC_S_LNG	_GSC_I64
#define	_GSC_S_LNG_LNG	_GSC_I128
#else
#define	_GSC_S_LNG	_GSC_I32
#define	_GSC_S_LNG_LNG	_GSC_I64
#endif

/*
 * Type definitions for types with known sizes.
 */
typedef int8_t gss8;
typedef uint8_t gsu8;
typedef int16_t gss16;
typedef uint16_t gsu16;
typedef int32_t gss32;
typedef uint32_t gsu32;
typedef int64_t gss64;
typedef uint64_t gsu64;
typedef struct { int8_t data[16]; } gss128;
typedef struct { uint8_t data[16]; } gsu128;
typedef float gsf32;
typedef double gsf64;

/*
 * Integer type with same size as a pointer
 */
typedef	uintptr_t gsuaddr;
typedef	intptr_t gssaddr;
typedef	gsuaddr gsaddr;

/*
 *	Do we have real 64-bit and 128-bit integers or are we just pretending.
 */
#define GS_HAVE_I64	0
#define GS_HAVE_I128	0

/*
 *	Do we have zlib for file handle compression?
 */
#define USE_ZLIB	1

/*
 *	Do we have the GNU Multiple-precision library for NSDecimal?
 */
//#define USE_GMP	@USE_GMP@
#define USE_GMP	0

/*
 * Macros to deal with hiding an object from the garbage collector
 * This macro employs the procesor-dependent knowledge that a pointer to an
 * object will always be on an even address boundary.  If we ever port to a
 * system where this is not the case, we will have to find another mechanism.
 */
#ifndef	GS_WITH_GC
#define	GS_WITH_GC	0
#endif
#if	GS_WITH_GC
#define	GS_GC_HIDE(obj)		((id)(((uintptr_t)obj) | 1))
#define	GS_GC_UNHIDE(obj)	((id)(((uintptr_t)obj) & ~1))
#else
#define	GS_GC_HIDE(obj)		((id)obj)
#define	GS_GC_UNHIDE(obj)	((id)obj)
#endif

/*
 * Define to say if we use NXConstantString or NSConstantString
 */
#define NXConstantString	NSConstantString

/*
 * Wide unicode character type.
 */
#ifndef	UTF32Char
#define	UTF32Char	uint32_t
#endif

/*
 * Native character type for use in systemcalls etc.
 */
#if	defined(__MINGW32__)
#define	GSNativeChar	unichar
#else
#define	GSNativeChar	char
#endif

#endif	/* included_GSConfig_h */
