/* 
 * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
 * 
 * This software may be freely used, copied, modified, and distributed
 * provided that the above copyright notice is preserved in all copies of the
 * software.
 */


#ifndef _host_LOADED
#define _host_LOADED 1

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>

#ifndef SEEK_SET
#  define SEEK_SET  0
#endif
#ifndef SEEK_CUR
#  define SEEK_CUR  1
#endif
#ifndef SEEK_END
#  define SEEK_END  2
#endif

/* The following for the benefit of compiling on SunOS */
#ifndef offsetof
#  define offsetof(T, member)  ((char *)&(((T *)0)->member) - (char *)0)
#endif

/* If under Cygwin, provide backwards compatibility with older
   Cygwin compilers that don't define the current cpp define. */
#ifdef __CYGWIN32__
#ifndef __CYGWIN__
#define __CYGWIN__
#endif
#endif

#ifdef unix                   /* A temporary sop to older compilers */
#  ifndef __unix              /* (good for long-term portability?)  */
#    define __unix    1
#  endif
#endif

#ifdef __unix
/* Generic unix -- hopefully a split into other variants will not be    */
/* needed.  However, beware the 'bsd' test above and safe_toupper etc.  */
/* which cope with backwards (pre-posix/X/open) unix compatility.       */
#  define COMPILING_ON_UNIX     1
#endif
#if defined(_WIN32)
#  define COMPILING_ON_WIN32    1
#  if !defined(__CYGWIN32__)
#    define COMPILING_ON_WINDOWS  1
#  endif
#endif
#if defined(_CONSOLE)
#  define COMPILING_ON_WINDOWS_CONSOLE 1
#  define COMPILING_ON_WINDOWS 1
#endif
#ifdef _MSC_VER
#  define COMPILING_ON_MSDOS    1
#  define COMPILING_ON_WINDOWS  1
#  if defined(__cplusplus)
#    define IMPLEMENT_BOOL_AS_INT 1 /* VC++ doesn't have 'bool' (yet) */
#  endif
#endif
/* The '(defined(__sparc) && defined(P_tmpdir)                     */
/* && !defined(__svr4__))' is to detect gcc on SunOS.              */
/* C++ compilers don't have to define __STDC__                     */
#if (defined(__sparc) && defined(P_tmpdir))
#  if defined(__svr4__)
#    define COMPILING_ON_SOLARIS
#  else
#    define COMPILING_ON_SUNOS
#  endif
#endif
#ifdef __hppa
#  define COMPILING_ON_HPUX
#endif

/*
 * The following typedefs may need alteration for obscure host machines.
 */
#if defined(__alpha) && defined(__osf__) /* =========================== */
/* Under OSF the alpha has 64-bit pointers and 64-bit longs.            */
typedef                int   int32;
typedef unsigned       int   unsigned32;
/* IPtr and UPtr are 'ints of same size as pointer'.  Do not use in     */
/* new code.  Currently only used within 'ncc'.                         */
typedef          long  int   IPtr;
typedef unsigned long  int   UPtr;

#else /* all hosts except alpha under OSF ============================= */

typedef          long  int   int32;
typedef unsigned long  int   unsigned32;
/* IPtr and UPtr are 'ints of same size as pointer'.  Do not use in     */
/* new code.  Currently only used within 'ncc'.                         */
#define IPtr int32
#define UPtr unsigned32
#endif /* ============================================================= */

typedef          short int   int16;
typedef unsigned short int   unsigned16;
typedef   signed       char  int8;
typedef unsigned       char  unsigned8;

/* The following code defines the 'bool' type to be 'int' under C       */
/* and real 'bool' under C++.  It also avoids warnings such as          */
/* C++ keyword 'bool' used as identifier.  It can be overridden by      */
/* defining IMPLEMENT_BOOL_AS_ENUM or IMPLEMENT_BOOL_AS_INT.            */
#undef _bool

#ifdef IMPLEMENT_BOOL_AS_ENUM
   enum _bool { _false, _true };
#  define _bool enum _bool
#elif defined(IMPLEMENT_BOOL_AS_INT) || !defined(__cplusplus)
#  define _bool int
#  define _false 0
#  define _true 1
#endif

#ifdef _bool
#  if defined(_MFC_VER) || defined(__CC_NORCROFT) /* When using MS Visual C/C++ v4.2 */
#    define bool _bool /* avoids "'bool' is reserved word" warning      */
#  else
     typedef _bool bool;
#  endif
#  define true _true
#  define false _false
#endif

#define YES   true
#define NO    false
#undef TRUE             /* some OSF headers define as 1                 */
#define TRUE  true
#undef FALSE            /* some OSF headers define as 1                 */
#define FALSE false

/* 'uint' conflicts with some Unixen sys/types.h, so we now don't define it */
typedef unsigned8  uint8;
typedef unsigned16 uint16;
typedef unsigned32 uint32;

typedef unsigned   Uint;
typedef unsigned8  Uint8;
typedef unsigned16 Uint16;
typedef unsigned32 Uint32;

#ifdef ALPHA_TASO_SHORT_ON_OSF /* was __alpha && __osf.                 */
/* The following sets ArgvType for 64-bit pointers so that              */
/* DEC Unix (OSF) cc can be used with the -xtaso_short compiler option  */
/* to force pointers to be 32-bit.  Not currently used since most/all   */
/* ARM tools accept 32 or 64 bit pointers transparently.  See IPtr.     */
#pragma pointer_size (save)
#pragma pointer_size (long)
typedef char *ArgvType;
#pragma pointer_size (restore)
#else
typedef char *ArgvType;
#endif

/*
 * Rotate macros
 */
#define ROL_32(val, n) \
((((unsigned32)(val) << (n)) | ((unsigned32)(val) >> (32-(n)))) & 0xFFFFFFFFL)
#define ROR_32(val, n) \
((((unsigned32)(val) >> (n)) | ((unsigned32)(val) << (32-(n)))) & 0xFFFFFFFFL)

#ifdef COMPILING_ON_UNIX
#  define FOPEN_WB     "w"
#  define FOPEN_RB     "r"
#  define FOPEN_RWB    "r+"
#  ifndef __STDC__                     /* caveat RISCiX... */
#    define remove(file) unlink(file)  /* a horrid hack, but probably best? */
#  endif
#else
#  define FOPEN_WB     "wb"
#  define FOPEN_RB     "rb"
#  define FOPEN_RWB    "rb+"
#endif

#ifndef FILENAME_MAX
#  define FILENAME_MAX 256
#endif

#if (!defined(__STDC__) && !defined(__cplusplus) && !defined(_MSC_VER)) || \
    defined(COMPILING_ON_SUNOS)
/* Use bcopy rather than memmove, as memmove is not available.     */
/* There does not seem to be a header for bcopy.                   */
void bcopy(const char *src, char *dst, int length);
#  define memmove(d,s,l) bcopy(s,d,l)

/* BSD/SUN don't have strtoul(), but then strtol() doesn't barf on */
/* overflow as required by ANSI... This bodge is horrid.           */
#  define strtoul(s, ptr, base) strtol(s, ptr, base)

/* strtod is present in the C-library but is not in stdlib.h       */
extern double strtod(const char *str, char **ptr);
#endif

/* For systems that do not define EXIT_SUCCESS and EXIT_FAILURE */
#ifndef EXIT_SUCCESS
#  define EXIT_SUCCESS           0
#endif
#ifndef EXIT_FAILURE
#  define EXIT_FAILURE           1
#endif

#ifndef IGNORE
#define IGNORE(x) (x = x)  /* Silence compiler warnings for unused arguments */
#endif

/* Define endian-ness of host */

#if defined(__acorn) || defined(__mvs) || defined(_WIN32) || \
  (defined(__alpha) && defined(__osf__))
#  define HOST_ENDIAN_LITTLE
#elif defined(__sparc) || defined(macintosh)
#  define HOST_ENDIAN_BIG
#else
#  define HOST_ENDIAN_UNKNOWN
#endif

#endif

/* end of host.h */
