#ifndef MACHDEFS_SEEN
#define MACHDEFS_SEEN

/***********************************************************************/
/* Find hardware, OS and compiler combination                          */
/***********************************************************************/

#if defined(__alpha) || defined(__alpha__) || defined(OSF1) || defined(DECALPHA)
#define MACH_ALPHA
#define OS_OSF1
#endif

#if defined(_AIX) || defined(AIX)
#define MACH_IBMRS
#define OS_AIX
#endif

#if defined(__hpux__) || defined(HPUX)
#define MACH_HP
#define OS_HPUX
#endif

#ifdef __MWERKS__
#define MACH_POWERMAC
#define OS_MACOS
#endif

#if defined(SunOS)  || defined ( sun )
#define MACH_SUN
#define OS_SOLARIS
#endif

#ifdef IRIX64
#define MACH_SGI
#define OS_IRIX64
#endif

#if defined(Linux)  || defined(linux)
#define MACH_INTEL
#define OS_LINUX
#endif


/***********************************************************************/
/* Hardware/OS dependent stuff                                         */
/***********************************************************************/

#if defined(OS_OSF1)

  typedef signed char int_1;
  typedef unsigned char uint_1;
  typedef int int_4;
  typedef unsigned int uint_4;
  typedef short int_2;
  typedef unsigned short uint_2;
  typedef float r_4;
  typedef double r_8;
  typedef long long int_8;
  typedef unsigned long long uint_8;

#define  SWAP 1
#define  SWAPDEFAUT 1

#elif  defined(OS_HPUX)

  typedef signed char int_1;
  typedef unsigned char uint_1;
  typedef int int_4 ;
  typedef unsigned int uint_4;
  typedef short int_2;
  typedef unsigned short uint_2;
  typedef float r_4;
  typedef double r_8;
  typedef long long int_8;
  typedef unsigned long long uint_8;

#define  SWAP 0
#define  SWAPDEFAUT   0


#elif  defined( OS_AIX )

  typedef signed char int_1;
  typedef unsigned char uint_1;
  typedef int int_4;
  typedef unsigned int uint_4;
  typedef short int_2;
  typedef unsigned short uint_2;
  typedef float r_4;
  typedef double r_8;
  typedef long long int_8;
  typedef unsigned long long uint_8;

#define  SWAP 0
#define  SWAPDEFAUT   0

/* Check for solaris on intel... */
#elif  defined( OS_SOLARIS ) && defined( MACH_SUN )

  typedef signed char int_1;
  typedef unsigned char uint_1;
  typedef int int_4;
  typedef unsigned int uint_4;
  typedef short int_2;
  typedef unsigned short uint_2;
  typedef float r_4;
  typedef double r_8;
  typedef long long int_8;
  typedef unsigned long long uint_8;

#define  SWAP 0
#define  SWAPDEFAUT   0

#elif  defined( OS_IRIX64 )

  typedef signed char int_1;
  typedef unsigned char uint_1;
  typedef int int_4;
  typedef unsigned int uint_4;
  typedef short int_2;
  typedef unsigned short uint_2;
  typedef float r_4;
  typedef double r_8;
  typedef long long int_8;
  typedef unsigned long long uint_8;

#define  SWAP 0
#define  SWAPDEFAUT   0

/* Check linux on other machines than Intel */
#elif defined(OS_LINUX)

  typedef signed char int_1;
  typedef unsigned char uint_1;
  typedef int int_4;
  typedef unsigned int uint_4;
  typedef short int_2;
  typedef unsigned short uint_2;
  typedef float r_4;
  typedef double r_8;
  typedef long long int_8;
  typedef unsigned long long uint_8;

#ifdef powerpc
#define SWAP 0
#define SWAPDEFAUT 0
#else
#define  SWAP 1
#define  SWAPDEFAUT   1
#endif

#elif defined(OS_MACOS)

  typedef signed char int_1;
  typedef unsigned char uint_1;
  typedef long int_4;
  typedef unsigned long uint_4;
  typedef short int_2;
  typedef unsigned short uint_2;
  typedef float r_4;
  typedef double r_8;
  typedef long long int_8;
  typedef unsigned long long uint_8;

#define  SWAP 0
#define  SWAPDEFAUT   0

#else
#error  Undefined Machine/OS type in machdefs.h
#endif



#if SWAP==1
#define IS_BIG_ENDIAN 0
#else
#define IS_BIG_ENDIAN 1
#endif


/***********************************************************************/
/* Find Compiler                                                       */
/***********************************************************************/

/*    __MWERKS__   : Metrowerks Codewarrior (>= PRO 4)                 */
/*    __DECCXX     : DEC CXX, version >= 6 is required                 */
/*    __GNUG__     : GNU C++ 2.8.1, egcs ??                            */
/*    __aCC__      : aCC on HP                                         */
/*    __KCC__      : KCC, version >= 3.3 is required                   */
/*    __SGICC__    : SGI (IRIX64) CC compiler                          */

/***********************************************************************/
/* Compiler-specific stuff                                             */
/***********************************************************************/

/* Some features will be *required* for Planck. Which ones ?               */
  
/*   ANSI_TEMPLATES        : use ANSI syntax for explicit templates        */
/*   GNUG_TEMPLATES        : use GNU syntax for explicit templates         */
/*   PRAGMA_TEMPLATES      : use pragma template, a la cxx                 */
/*   COMPILER_EXCEPTIONS   : knows about exceptions  --- required ?        */ 
/*   STREAMPOS_IS_CLASS    : streampos is a real class                     */
/*   ITER_TAG              : use iter_tag for iterator qualifiers in STL   */
/*   NO_STRSTREAM          : does not have strstream                       */
/*   HAS_EXPLICIT          : knows about explicit keyword - constructors   */
/*   HAS_IOS_BIN                                                           */
/*   HAS_IOS_NOCREATE                                                      */
/*   HAS_VEC_NEW           : operator new[]                                */
/*   CC_HAS_RTTI_SUPPORT     has Run Time Type Identification support      */
/*   ANSI_IO               : rdbuf()->pubseekoff rather than seekg         */
/*   HAS_STR_NPOS          : has string::npos and not a global NPOS        */
/*   NO_IOS_COMPLEX        : does not have operator << defined for complex */


/* The following is true for most compilers */

#ifndef HAS_VEC_NEW
#define HAS_VEC_NEW
#endif

#ifndef COMPILER_EXCEPTIONS
#define COMPILER_EXCEPTIONS
#endif

#ifndef  CC_HAS_RTTI_SUPPORT 
#define  CC_HAS_RTTI_SUPPORT 
#endif

/* now the specific things */

#ifdef __MWERKS__
#define ANSI_TEMPLATES
#undef  HAS_VEC_NEW
#define NO_STRSTREAM
#define STREAMPOS_IS_CLASS
#define ITER_TAG
#define HAS_IOS_BIN 
#define HAS_IOS_NOCREATE 
#define HAS_STR_NPOS
#endif

#ifdef __GNUG__
#define ANSI_TEMPLATES
// #define GNU_TEMPLATES
#define HAS_STR_NPOS
#define HAS_EXPLICIT
#define HAS_IOS_BIN
#define HAS_IOS_NOCREATE
#endif

#ifdef __DECCXX
#define HAS_STR_NPOS
#define ITER_TAG
#define __CXX_PRAGMA_TEMPLATES__
#define PRAGMA_TEMPLATES
#endif

#if defined (__aCC__)  
#ifndef ANSI_TEMPLATES
#define ANSI_TEMPLATES
#endif
#endif

#if defined(__KCC__)
/* KCC V 3.2 ne compile pas  i/ostream s ; long p = s.tellg();  OK en  V 3.3 */
#define STREAMPOS_IS_CLASS
#define HAS_STR_NPOS
#ifndef ANSI_TEMPLATES
#define ANSI_TEMPLATES
#endif
/* Standard C++ library classes are in the namespace std  */
#ifdef __cplusplus
namespace std { }
using namespace std;
#endif
#endif

#if defined(__SGICC__)
/* Standard C++ library classes are in the namespace std  */
#define HAS_STR_NPOS
#ifndef ANSI_TEMPLATES
#define ANSI_TEMPLATES
#endif
#ifdef __cplusplus
namespace std { }
using namespace std;
#endif
#endif

/* Get things has homogeneous as possible between compilers */

#ifdef HAS_STR_NPOS
#define NPOS string::npos
#else
#define NPOS (size_t)-1
#endif

#ifndef __GNUG__
#define __PRETTY_FUNCTION__ __FILE__ " __LINE__ "
#ifndef __FUNCTION__
#define __FUNCTION__ __FILE__ " __LINE__ "
#endif
#ifndef __KCC__
#define __attribute__(_x_)
#endif
#endif

#ifndef HAS_EXPLICIT
#define explicit
#endif

#ifdef HAS_IOS_BIN
#define IOS_BIN ios::binary
#else
#define IOS_BIN 0
#endif

#ifdef ANSI_IO
#define seekg(p_, m_) rdbuf()->pubseekoff(p_,m_)
#define seekp(p_, m_) rdbuf()->pubseekoff(p_,m_)
#endif

#ifdef __MWERKS__
//#define hypot(_x_,_y_) sqrt((_x_)*(_x_) + (_y_)*(_y_))
#define random() (rand()*65538.0 + rand()*2. + rand())
#define srandom srand
#define initstate(seed, tab, n) srand(seed)
#define nice(_x)

#ifdef __cplusplus
#include <string.h>
#include <string>
inline bool operator< (string const& s1, string const& s2)
{ return (strcmp(s1.c_str(), s2.c_str()) < 0); }
#endif
#endif


/********************************************************/
/* Outil d'impressions pour debug */
#define PR(_data_)  {cout<<" "<<#_data_<<" "<<_data_;}
#define CR {cout<<"\n"<<flush;}
/* ********************************************************/

/* Compatibilite, avant de migrer tout le code en "PLANCK" */

#ifdef __cplusplus
namespace SOPHYA {}
using namespace SOPHYA;
#define EXPLICIT explicit
#include "pclassids.h"
#endif

#endif
