/* Metrowerks Standard Library
 * Copyright  1995-2004 Metrowerks Corporation.  All rights reserved.
 *
 * $Date: 2004/04/16 21:22:49 $
 * $Revision: 1.31.2.1 $
 */

/*
 *  based on the C99 Standard
 */

#ifndef _MSL_CSTDINT
#define _MSL_CSTDINT

#include <ansi_parms.h>

#if !_MSL_USING_MW_C_HEADERS
	#include <stdint.h>
#elif __dest_os == __mac_os_x
	#include <cstdint_mach.h>
#else

#include <climits>


#ifndef RC_INVOKED

_MSL_BEGIN_NAMESPACE_STD
_MSL_BEGIN_EXTERN_C

/*
 * 7.18 Integer types <stdint.h>
 * 
 * 7.18.1 Integer types
 *
 */
 
typedef signed char int8_t;
typedef short int   int16_t;
typedef long int    int32_t;

#if _MSL_LONGLONG
	typedef long long   int64_t;
#endif
 
typedef unsigned char		uint8_t;
typedef unsigned short int  uint16_t;
typedef unsigned long int   uint32_t;

#if _MSL_LONGLONG
	typedef unsigned long long  uint64_t;
#endif

#if (_MSL_C99  || defined(__cplusplus))
/*
 * 7.18.1.2 Minimum-width integer types
 * 
 */

typedef signed char 		int_least8_t;
typedef short int   		int_least16_t;
typedef long int    		int_least32_t;

#if _MSL_LONGLONG
	typedef long long   		int_least64_t;
#endif

typedef unsigned char		uint_least8_t;
typedef unsigned short int  uint_least16_t;
typedef unsigned long int   uint_least32_t;

#if _MSL_LONGLONG
	typedef unsigned long long  uint_least64_t;
#endif

/*
 * 7.18.1.3 Fastest minimum-width integer types
 *
 */

typedef signed char 		int_fast8_t;
typedef short int   		int_fast16_t;
typedef long int    		int_fast32_t;

#if _MSL_LONGLONG
	typedef long long   		int_fast64_t;
#endif

typedef unsigned char		uint_fast8_t;
typedef unsigned short int  uint_fast16_t;
typedef unsigned long int   uint_fast32_t;

#if _MSL_LONGLONG
	typedef unsigned long long  uint_fast64_t;
#endif

/*
 * 7.18.1.4 Integer types capable of holding object pointers
 *
 */

typedef int32_t intptr_t;
typedef uint32_t uintptr_t;

/*
 * 7.18.1.5 Greatest-width integer types
 * 
 */

#if _MSL_LONGLONG
	typedef int64_t intmax_t;
#else											
	typedef int32_t intmax_t;				
#endif
 
#if _MSL_LONGLONG
	typedef uint64_t uintmax_t;
#else											
	typedef uint32_t uintmax_t;
#endif

#endif /* _MSL_C99 */

_MSL_END_EXTERN_C
_MSL_END_NAMESPACE_STD

#endif /* RC_INVOKED */
#endif /* !_MSL_USING_MW_C_HEADERS */

#endif /* _MSL_CSTDINT */

#if _MSL_USING_MW_C_HEADERS && __dest_os != __mac_os_x

/*
 * 7.18.2 Limits of specified-width integer types
 * 
 * 7.18.2.1 Limits of exact-width integer types
 */

#if (!defined(__cplusplus)) || defined(__STDC_LIMIT_MACROS)
#ifndef INT8_MIN

#define INT8_MIN		SCHAR_MIN
#define INT16_MIN		SHRT_MIN
#define INT32_MIN		LONG_MIN
#if _MSL_LONGLONG 
#define INT64_MIN		LLONG_MIN
#endif

#define INT8_MAX		SCHAR_MAX
#define INT16_MAX		SHRT_MAX
#define INT32_MAX		LONG_MAX
#if _MSL_LONGLONG 
#define INT64_MAX		LLONG_MAX
#endif

#define UINT8_MAX		UCHAR_MAX
#define UINT16_MAX		USHRT_MAX
#define UINT32_MAX		ULONG_MAX
#if _MSL_LONGLONG 
#define UINT64_MAX		ULLONG_MAX
#endif
/*
 * 7.18.2.2 Limits of minimum-width integer types
 */

#define INT_LEAST8_MIN		SCHAR_MIN
#define INT_LEAST16_MIN		SHRT_MIN
#define INT_LEAST32_MIN		LONG_MIN
#if _MSL_LONGLONG 
#define INT_LEAST64_MIN		LLONG_MIN
#endif

#define INT_LEAST8_MAX		SCHAR_MAX
#define INT_LEAST16_MAX		SHRT_MAX
#define INT_LEAST32_MAX		LONG_MAX
#if _MSL_LONGLONG 
#define INT_LEAST64_MAX		LLONG_MAX
#endif 
#define UINT_LEAST8_MAX		UCHAR_MAX
#define UINT_LEAST16_MAX	USHRT_MAX
#define UINT_LEAST32_MAX	ULONG_MAX
#if _MSL_LONGLONG 
#define UINT_LEAST64_MAX	ULLONG_MAX
#endif

/*
 * 7.18.2.3 Limits of fastest minimum-width integer types
 */

#define INT_FAST8_MIN		SCHAR_MIN
#define INT_FAST16_MIN		SHRT_MIN
#define INT_FAST32_MIN		LONG_MIN
#if _MSL_LONGLONG 
#define INT_FAST64_MIN		LLONG_MIN
#endif

#define INT_FAST8_MAX		SCHAR_MAX
#define INT_FAST16_MAX		SHRT_MAX
#define INT_FAST32_MAX		LONG_MAX
#if _MSL_LONGLONG 
#define INT_FAST64_MAX		LLONG_MAX
#endif

#define UINT_FAST8_MAX		UCHAR_MAX
#define UINT_FAST16_MAX		USHRT_MAX
#define UINT_FAST32_MAX		ULONG_MAX
#if _MSL_LONGLONG 
#define UINT_FAST64_MAX		ULLONG_MAX
#endif

/*
 * 7.18.2.4 Limits of integer types capable of holding object pointers
 */

#define INTPTR_MIN			LONG_MIN
#define INTPTR_MAX			LONG_MAX
#define UINTPTR_MAX			ULONG_MAX

/*
 * 7.18.2.5 Limits of greatest-width integer types
 */

#if _MSL_LONGLONG 
	#define INTMAX_MIN			LLONG_MIN
	#define INTMAX_MAX			LLONG_MAX
	#define UINTMAX_MAX			ULLONG_MAX
#endif  /* _MSL_LONGLONG */

/*					
 * 7.18.3 Limits of other integer types
 */

#define PTRDIFF_MIN			LONG_MIN
#define PTRDIFF_MAX			LONG_MAX
#define SIG_ATOMIC_MIN		INT_MIN
#define SIG_ATOMIC_MAX		INT_MAX

#if (__dest_os == __win32_os || defined(__MOTO__)  || __dest_os == __wince_os)
	#define SIZE_MAX     		UINT_MAX
#else
	#define SIZE_MAX     		ULONG_MAX
#endif

#if _MSL_WIDE_CHAR
	#include <wchar_t.h>   /* do define WCHAR_MIN and WCHAR_MAX */		
	#define WINT_MIN			WCHAR_MIN
	#define WINT_MAX			WCHAR_MAX
#endif

#endif  /* INT8_MIN */
#endif /* (!defined(__cplusplus)) || defined(__STDC_LIMIT_MACROS) */

/*
 * 7.18.4 Macros for integer constants
 */

#if (!defined(__cplusplus)) || defined(__STDC_CONSTANT_MACROS)
#ifndef INT8_C

#define INT8_C(value) 	value
#define INT16_C(value) 	value
#define INT32_C(value) 	value ## L
#define INT64_C(value) 	value ## LL
#define UINT8_C(value) 	value ## U
#define UINT16_C(value) value ## U
#define UINT32_C(value) value ## UL
#define UINT64_C(value) value ## ULL

/*
 * 7.18.4.2 Macros for greatest-width integer constants
 */

#if _MSL_LONGLONG
	#define INTMAX_C(value)  value ## LL
	#define UINTMAX_C(value) value ## ULL
#endif	

#endif /*INT8_C	*/
#endif   /*(!defined(__cplusplus)) || defined(__STDC_CONSTANT_MACROS)*/
#endif  /*_MSL_USING_MW_C_HEADERS*/

/* Change record:
 * mm  000511 Created.
 * mm  000602 Corrected a pair of guards
 * JWW 001208 Added case for targeting Mach-O
 * cc  010409 updated defines to JWW new namespace macros
 * JWW 011027 Use _MSL_USING_MW_C_HEADERS as generic header test instead of specific Mach-O test
 * mm  020318 Changes to make more useful for C++
 * mm  020321 Removed some comments for reason of copyright
 * JWW 030224 Changed __MSL_LONGLONG_SUPPORT__ flag into the new more configurable _MSL_LONGLONG
 * JWW 030224 Changed __NO_WIDE_CHAR flag into the new more configurable _MSL_WIDE_CHAR
 * mm  o30303 Added _MSL_C99 wrappers for header
 * hh  040416 Moved defines outside of include guards
 */
 