#ifndef EXEC_TYPES_H
#define EXEC_TYPES_H

/*
    Copyright © 1995-2025, The AROS Development Team. All rights reserved.
    $Id$

    Desc: Data typing - must be included before any other file.
    Lang: english

    This version of exec/types.h does not contain any of the definitions
    of obsolete types (eg SHORT, CPTR, ...). If your code contains any
    of these they should have been changed a long time ago.
*/

#ifndef AROS_SYSTEM_H
#   include <aros/system.h>
#endif

/*************************************
 ***** Basic Data types          *****
 *************************************/

#ifndef __typedef_APTR
#   define __typedef_APTR
    typedef void *                              APTR;       /* memory pointer */
#endif

#ifndef __typedef_CONST_APTR
#   define __typedef_CONST_APTR
    typedef const void *                        CONST_APTR; /* const memory pointer */
#endif

/* Distinguish between 64 and 32bit systems */
#ifndef __typedef_LONG
#   define __typedef_LONG
#   define __typedef_ULONG
    typedef   signed AROS_32BIT_TYPE            LONG;       /* signed 32-bit value */
    typedef unsigned AROS_32BIT_TYPE            ULONG;      /* unsigned 32-bit value */
#else
#ifndef __typedef_ULONG
#   define __typedef_ULONG
    typedef unsigned AROS_32BIT_TYPE            ULONG;
#endif
#endif

#ifndef __typedef_QUAD
#   define __typedef_QUAD
#   ifdef AROS_64BIT_TYPE
    typedef   signed AROS_64BIT_TYPE            QUAD;       /* signed 64-bit value */
    typedef unsigned AROS_64BIT_TYPE            UQUAD;      /* unsigned 64-bit-value */
#   else
    typedef struct {  LONG high, low; }         QUAD;       /* signed 64-bit value */
    typedef struct { ULONG high, low; }         UQUAD;      /* unsigned 64-bit value */
#   endif /* AROS_64BIT_TYPE */
#endif

#ifndef __typedef_WORD
#   define __typedef_WORD
#   define __typedef_UWORD
    typedef   signed AROS_16BIT_TYPE            WORD;       /* signed 16-bit value */
    typedef unsigned AROS_16BIT_TYPE            UWORD;      /* unsigned 16-bit-value */
#else
#ifndef __typedef_UWORD
#   define __typedef_UWORD
    typedef unsigned AROS_16BIT_TYPE            UWORD;
#endif
#endif

#ifndef __typedef_BYTE
#   define __typedef_BYTE
#   define __typedef_UBYTE
    typedef signed char                         BYTE;       /* signed 8-bit value */
    typedef unsigned char                       UBYTE;      /* unsigned 8-bit value */
#else
#ifndef __typedef_UBYTE
#   define __typedef_UBYTE
    typedef unsigned char                       UBYTE;
#endif
#endif

/* An unsigned integer which can store a pointer */
#ifndef __typedef_IPTR
#   define __typedef_IPTR
    typedef unsigned AROS_INTPTR_TYPE           IPTR;
#endif

/* A signed type that can store a pointer */
#ifndef __typedef_SIPTR
#   define __typedef_SIPTR
    typedef signed AROS_INTPTR_TYPE             SIPTR;
#endif

/* An integer on the stack which can store a pointer */
#ifndef __typedef_STACKIPTR
#   define __typedef_STACKIPTR
    typedef unsigned AROS_INTPTR_STACKTYPE      STACKIPTR;
#endif

/* Distinguish between 64 and 32bit systems on the stack */
#ifndef __typedef_STACKLONG
#   define __typedef_STACKLONG
    typedef   signed AROS_32BIT_STACKTYPE       STACKLONG;  /* signed 32-bit value */
    typedef unsigned AROS_32BIT_STACKTYPE       STACKULONG; /* unsigned 32-bit value */
#endif

#ifndef __typedef_STACKQUAD
#   define __typedef_STACKQUAD
#   ifdef AROS_64BIT_STACKTYPE
    typedef   signed AROS_64BIT_STACKTYPE       STACKQUAD;  /* signed 64-bit value */
    typedef unsigned AROS_64BIT_STACKTYPE       STACKUQUAD; /* unsigned 64-bit-value */
#   else
    typedef struct {  LONG high, low; }         STACKQUAD;  /* signed 64-bit value */
    typedef struct { ULONG high, low; }         STACKUQUAD; /* unsigned 64-bit value */
#   endif /* AROS_64BIT_STACKTYPE */
#endif

#ifndef __typedef_STACKWORD
#   define __typedef_STACKWORD
    typedef   signed AROS_16BIT_STACKTYPE       STACKWORD;  /* signed 16-bit value */
    typedef unsigned AROS_16BIT_STACKTYPE       STACKUWORD; /* unsigned 16-bit-value */
#endif

#ifndef __typedef_STACKBYTE
#   define __typedef_STACKBYTE
    typedef   signed AROS_8BIT_STACKTYPE        STACKBYTE;  /* signed 8-bit value */
    typedef unsigned AROS_8BIT_STACKTYPE        STACKUBYTE; /* unsigned 8-bit value */
#endif

#ifndef __typedef_STACKFLOAT
#   define __typedef_STACKFLOAT
    typedef AROS_FLOAT_STACKTYPE                STACKFLOAT; /* signed 32-bit floating point value */
#endif

#ifndef __typedef_STACKDOUBLE
#   define __typedef_STACKDOUBLE
    typedef AROS_DOUBLE_STACKTYPE               STACKDOUBLE;/* signed 64-bit floating point value */
#endif

/*************************************
 ***** Other interesting types	 *****
 *************************************/
 /* C++ doesn't like strings being treated nor as signed nor as unsigned char's arrays,
    it wants them to be simply "char" arrays. This is because
    the char type has undefined sign, unless explicitely specified.  */
#ifdef __cplusplus
#    define __AROS_CPP_BYTE char
#else
#    define __AROS_CPP_BYTE UBYTE
#endif

#ifndef __typedef_STRPTR
#   define __typedef_STRPTR
    typedef __AROS_CPP_BYTE                     *STRPTR;    /* Pointer to string (NULL terminated) */
#endif

#ifndef __typedef_WSTRPTR
#   define __typedef_WSTRPTR
    typedef unsigned AROS_32BIT_TYPE            *WSTRPTR;    /* Pointer to a wide string (NULL terminated) */
#endif

#ifndef __typedef_CONST_STRPTR
#   define __typedef_CONST_STRPTR
    typedef const __AROS_CPP_BYTE               *CONST_STRPTR;/* Pointer to constant string (NULL terminated) */
#endif

#ifndef __typedef_CONST_WSTRPTR
#   define __typedef_CONST_WSTRPTR
    typedef unsigned AROS_32BIT_TYPE            *CONST_WSTRPTR;/* Pointer to constant wide string (NULL terminated) */
#endif

#undef __AROS_CPP_BYTE

#ifndef __typedef_TEXT
#   define __typedef_TEXT
    typedef unsigned char                       TEXT;
#endif

#ifndef __typedef_BOOL
#   define __typedef_BOOL
    typedef short                               BOOL;       /* A Boolean value */
#endif

#ifndef __typedef_FLOAT
#   define __typedef_FLOAT
    typedef float                               FLOAT;      /* 32bit IEEE floating point value */
#endif

#ifndef __typedef_DOUBLE
#   define __typedef_DOUBLE
    typedef double                              DOUBLE;     /* 64bit IEEE floating point value */
#endif

#ifndef __typedef_LONGBITS
#   define __typedef_LONGBITS
    typedef ULONG                               LONGBITS;
#endif

#ifndef __typedef_WORDBITS
#   define __typedef_WORDBITS
    typedef UWORD                               WORDBITS;
#endif

#ifndef __typedef_BYTEBITS
#   define __typedef_BYTEBITS
    typedef UBYTE                               BYTEBITS;
#endif

#ifndef __typedef_RAWARG
#   define __typedef_RAWARG
    typedef struct RAWARG_s { }                 *RAWARG;    /* Type of 'datastream' of RawDoFmt */
#endif

/*************************************
 ***** Some useful definitions	 *****
 *************************************/

#ifndef FALSE
#   define FALSE                                0L
#endif

#ifndef TRUE
#   define TRUE                                 1L
#endif

#ifndef NULL
#   define NULL                                 0L
#endif

#ifndef VOID
#   define VOID                                 void
#endif

#ifndef NO_AMIGA_LINKAGE_TYPES
#define GLOBAL                                  extern
#define IMPORT                                  extern
#define STATIC                                  static
#endif
#define REGISTER                                register

#ifndef CONST
#if __STDC__
#define CONST                                   const
#else
#define CONST
#endif
#endif

#ifndef VOLATILE
#if __STDC__
#define VOLATILE                                volatile
#else
#define VOLATILE
#endif
#endif

#ifndef RESTRICT
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
#define RESTRICT                                restrict
#else
#define RESTRICT
#endif
#endif

/*
    Provide a workaround for non-ANSI compilers that do not understand
    prototypes in function pointer members of structure/union types.

    From NDK3.9.
*/
#if defined(__STDC__)
#   define __CLIB_PROTOTYPE(a)                  a
#else
#   define __CLIB_PROTOTYPE(a)
#endif

/*
    Minimum support library version. AROS doesn't have system libraries
    below V40
*/
#define LIBRARY_MINIMUM                         40

/*
    The current version of the includes. Do not use this value in calls
    to OpenLibrary(). Some system libraries may not be at this version. */
#define INCLUDE_VERSION                         40

#endif /* exec/types.h */
