/* machine.h                       Copyright (C) 1990-2007 Codemist Ltd */

/*
 * This was ONCE a place where all system-specific options were detected
 * and mapped onto tidy macros that could guide subsequent compilation. Now
 * all that is handled in "config.h", which is manufactured on a per-target
 * basis by a configure-script created by autoconf.
 *
 * Now it us used for just a few tests based on what comes out of
 * config.h to set up really major further bits of configuration, where
 * the characteristic of what is done here is that it will vary from
 * target to target and it is truly pervasive in consequences.
 */

/*
 * This code may be used and modified, and redistributed in binary
 * or source form, subject to the "CCL Public License", which should
 * accompany it. This license is a variant on the BSD license, and thus
 * permits use of code derived from this in either open and commercial
 * projects: but it does require that updates to this code be made
 * available back to the originators of the package.
 * Before merging other code in with this or linking this code
 * with other packages or libraries please check that the license terms
 * of the other material are compatible with those of this.
 */

/* Signature: 6c63e427 19-Jun-2007 */


#ifndef header_machine_h
#define header_machine_h 1


/*
 * I will decode information that config.h has given me and define a simple
 * symbol SOCKETS if I can use sockets...
 * 
 */
#if !defined UNDER_CE && ((defined HAVE_SOCKET && defined HAVE_SYS_SOCKET_H) || defined WIN32)
#define SOCKETS                  1
#endif


#ifndef MS_CDECL
#ifdef _MSC_VER
#  define MS_CDECL __cdecl
#else
#  define MS_CDECL
#endif
#endif


#ifdef WIN32
#  ifdef WIN64
#     define OPSYS           "win64"
#     define IMPNAME         "win64"
#  else
#     define OPSYS           "win32"
#     define IMPNAME         "win32"
#  endif
#else
#  ifdef HOST_OS
#     define OPSYS           HOST_OS
#     ifdef HOST_CPU
#        define IMPNAME      HOST_OS ":" HOST_CPU
#     else
#        define IMPNAME      HOST_OS
#     endif
#  else
#     define OPSYS           "Unknown"
#     define IMPNAME         "Generic"
#  endif
#endif

#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif

/*
 * #ifdef __APPLE__
 *
 * Apple and MacOS provide a special challenge for me. It is possible to
 * compile code with a command such as
 *    gcc -arch ppc -archppc64 -archi386 ...
 * and by so doing create a two or three-way fat binary. This situation is
 * excellent, HOWEVER it causes real trouble for autoconf in any cases
 * where the results could be system-sensitive! A case where this is
 * unambiguously true relates to the size of data. So I put in some
 * old-fashioned manual treatment that will, I hope, override any values
 * found by autoconf in the relevent areas.
 *
 * Well ACTUALLY I hope and believe that Apple provides <stdint.h> and
 * so the macros set up where will never get inspected!
 *
 * Well these days they seem to have stdint.h in the kit, and so I will
 * comment this out!
 *
 *
 * #undef SIZEOF_SHORT_INT
 * #undef SIZEOF_INT
 * #undef SIZEOF_LONG
 * #undef SIZEOF_LONG_LONG
 * #undef SIZEOF_VOID_P
 * 
 * #if defined __x86_64__ || defined __ppc64__
 * #define SIZEOF_SHORT_INT  2
 * #define SIZEOF_INT        4
 * #define SIZEOF_LONG       4
 * #define SIZEOF_LONG_LONG  8
 * #define SIZEOF_VOID_P     8
 * #elif defined __i386__ ||  defined __ppc__
 * #undef SIZEOF_SHORT_INT   2
 * #undef SIZEOF_INT         4
 * #undef SIZEOF_LONG        4
 * #undef SIZEOF_LONG_LONG   8
 * #undef SIZEOF_VOID_P      4
 * #else
 * #error "Unknown architecture on a machine that says it is __APPLE__"
 * #endif
 *
 * #endif  __APPLE__
 */

/*
 * Now it appears that some systems provide types with names like
 * u_int32_t where I count uint32_t as more standard. I will adapt
 * around that here. As C compilers become more standardised this
 * will become increasingly irrelevant.
 */

#ifndef HAVE_UINT32_T
#ifdef  HAVE_U_INT32_T
typedef u_int32_t uint32_t;
#define HAVE_UINT32_T 1
#endif
#endif

#ifndef HAVE_UINT64_T
#ifdef  HAVE_U_INT64_T
typedef u_int64_t uint64_t;
#define HAVE_UINT64_T 1
#endif
#endif

#ifndef HAVE_UINTPTR_T
#ifdef  HAVE_U_INTPTR_T
typedef u_intptr_t uintptr_t;
#define HAVE_UINTPTR_T 1
#endif
#endif

/*
 * Finally if those abstract widths have not been provided I will fall
 * back on information worked out at configure-time. Note that that could
 * be delicate in the context of cross-compilation and other odd cases.
 */

#if !defined HAVE_INT32_T && defined SIZEOF_INT && (SIZEOF_INT == 4)
typedef int int32_t;
#define HAVE_INT32_T 1
#endif

#if !defined HAVE_UINT32_T && defined SIZEOF_INT && (SIZEOF_INT == 4)
typedef unsigned int uint32_t;
#define HAVE_UINT32_T 1
#endif

#if !defined HAVE_INT32_T && defined SIZEOF_SHORT_INT && (SIZEOF_SHORT_INT == 4)
typedef short int int32_t;
#define HAVE_INT32_T 1
#endif

#if !defined HAVE_UINT32_T && defined SIZEOF_SHORT_INT && (SIZEOF_SHORT_INT == 4)
typedef unsigned short int uint32_t;
#define HAVE_UINT32_T 1
#endif

#if !defined HAVE_INT64_T && defined SIZEOF_LONG && (SIZEOF_LONG == 8)
typedef long int64_t;
#define HAVE_INT64_T 1
#endif

#if !defined HAVE_UINT64_T && defined SIZEOF_LONG && (SIZEOF_LONG == 8)
typedef unsigned long uint64_t;
#define HAVE_UINT64_T 1
#endif

#if !defined HAVE_INT64_T && defined SIZEOF_LONG_LONG && (SIZEOF_LONG_LONG == 8)
typedef long long int64_t;
#define HAVE_INT64_T 1
#endif

#if !defined HAVE_UINT64_T && defined SIZEOF_LONG_LONG && (SIZEOF_LONG_LONG == 8)
typedef unsigned long long uint64_t;
#define HAVE_UINT64_T 1
#endif

#if !defined HAVE_INTPTR_T && defined SIZEOF_VOID_P && (SIZEOF_VOID_P == 4) && defined HAVE_INT32_T
typedef int32_t intptr_t;
#define HAVE_INTPTR_T 1
#endif

#if !defined HAVE_INTPTR_T && defined SIZEOF_VOID_P && (SIZEOF_VOID_P == 8) && defined HAVE_INT64_T
typedef int64_t intptr_t;
#define HAVE_INTPTR_T 1
#endif

#if !defined HAVE_UINTPTR_T && defined SIZEOF_VOID_P && (SIZEOF_VOID_P == 4) && defined HAVE_UINT32_T
typedef uint32_t uintptr_t;
#define HAVE_UINTPTR_T 1
#endif

#if !defined HAVE_UINTPTR_T && defined SIZEOF_VOID_P && (SIZEOF_VOID_P == 8) && defined HAVE_UINT64_T
typedef uint64_t uintptr_t;
#define HAVE_UINTPTR_T 1
#endif

/*
 * With luck that will have regularised the situation with regard to
 * integer types!
 */

#endif /* header_machine_h */

/* end machine.h */

