#ifndef MACHDEFS_SEEN
#define MACHDEFS_SEEN

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

#if defined(OSF1) 
#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

#ifdef __APPLE__
#ifdef __MACH__
#ifdef __POWERPC__
#define MACH_POWERPC
#else
#define MACH_INTEL
#endif
#define OS_MACOSX
#endif
#endif

#if defined(Linux)  || defined(linux)
#if defined(__alpha__)
#define MACH_ALPHA
#elif defined(powerpc)
#define MACH_POWERPC
#elif defined(__i386__)
#define MACH_INTEL
#else
#error Undefined Platform (machine) type with linux in machdefs.h
#endif
#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)
/* Sizes OK for PowerPC, Alpha, Intel    */
/* On Alpha, long is 8 bytes             */
  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;

#if defined(powerpc) || (__alpha__)
#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

#elif defined(OS_MACOSX)

  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 MACH_POWERPC
#define  SWAP 0
#define  SWAPDEFAUT   0
#else
#define  SWAP 1
#define  SWAPDEFAUT   1
#endif

#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                          */
/*    __INTEL_COMPILER :   : INTEL compiler                            */
/*    __IBMCPP__   : AIX (IBM) xlC c++ compiler                        */

/***********************************************************************/
/* Compiler-specific stuff                                             */
/***********************************************************************/
  
/*   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                       */
/*   NO_EXPLICIT           : does not know about explicit keyword          */
/*   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 */
/*   DECL_TEMP_SPEC        : Template specialization declaration           */
/*   TSNMLUPG4             : Two stage name look-up scheme (g++>3.4)       */


/* (STREAMPOS_IS_CLASS non-active: ca compile sans sur gcc3.2 et cxx)
   rz+cmv 11/02/03 */

/* 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


#ifndef DECL_TEMP_SPEC
#define DECL_TEMP_SPEC
#endif

/* Most compilers dot not implement two level name lookup for templates 
   introduced by gcc >= 3.4 
*/
#ifdef TSNMLUPG4
#undef TSNMLUPG4
#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 GCC_VERSION (__GNUC__ * 10000 \
                               + __GNUC_MINOR__ * 100 \
                               + __GNUC_PATCHLEVEL__)
#define ANSI_TEMPLATES
/*
if (__GNUC__ >= 3) 
define STREAMPOS_IS_CLASS
endif
*/
#define GNU_TEMPLATES
#define HAS_STR_NPOS
#define HAS_IOS_BIN
#define HAS_IOS_NOCREATE
#if ( GCC_VERSION >= 30000 ) 
#undef  DECL_TEMP_SPEC
#define DECL_TEMP_SPEC template <>
#endif
#if ( GCC_VERSION >= 34000 )
/* Two level name look-up scheme for templates introduced from gcc 3.4 */
#define TSNMLUPG4
#endif

#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 HAS_STR_NPOS
#ifndef ANSI_TEMPLATES
#define ANSI_TEMPLATES
#endif
#endif

#if defined(__SGICC__)
#define HAS_STR_NPOS
#ifndef ANSI_TEMPLATES
#define ANSI_TEMPLATES
#endif
#undef  DECL_TEMP_SPEC
#define DECL_TEMP_SPEC template <>
#endif

#if defined(__IBMCPP__)
/* IBM xlC compiler support Added : dec 2005 */
#ifndef ANSI_TEMPLATES
#define ANSI_TEMPLATES
#endif
#undef  DECL_TEMP_SPEC
#define DECL_TEMP_SPEC template <>
#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

#ifdef NO_EXPLICIT
#define explicit
#endif

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

/* Commente par Reza+CMV - Fev 2003 
 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

#ifdef OS_MACOSX
#define NO_VALUES_H
#include "osx_values.h"
#endif


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

/* ---- Activation des flags de debug/bound checking  ----- */
#ifdef SOPHYA_DEBUG
#define SO_BOUNDCHECKING
#endif

/* ---- La taille et les index des tableaux ---- */
#ifdef SGI_ARCH64
typedef int_8 sa_size_t ;
#else
typedef int_4 sa_size_t ;
#endif

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

#ifdef __cplusplus
/* Standard C++ library classes are in the namespace std  */
namespace std { }
using namespace std;
/*******************************************/
/* SOPHYA classes are in namespace SOPHYA  */
/* namespace SOPHYA {}                     */
/* using namespace SOPHYA;                 */
/* Please use instead: sopnamsp.h          */
/*******************************************/
#define EXPLICIT explicit
#endif

#endif
