/*
 * This file is part of the coreboot project.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#ifndef STDINT_H
#define STDINT_H

/* romcc does not support long long, _Static_assert, or _Bool, so we must ifdef that code out.
   Also, GCC can provide its own implementation of stdint.h, so in theory we could use that
   instead of this custom file once romcc is no more. */

/* Fixed width integer types */
typedef signed char        int8_t;
typedef unsigned char      uint8_t;

typedef signed short       int16_t;
typedef unsigned short     uint16_t;

typedef signed int         int32_t;
typedef unsigned int       uint32_t;

#ifndef __ROMCC__
typedef signed long long   int64_t;
typedef unsigned long long uint64_t;
#endif

/* Types for 'void *' pointers */
typedef signed long        intptr_t;
typedef unsigned long      uintptr_t;

/* Ensure that the widths are all correct */
#ifndef __ROMCC__
_Static_assert(sizeof(int8_t) == 1, "Size of int8_t is incorrect");
_Static_assert(sizeof(uint8_t) == 1, "Size of uint8_t is incorrect");

_Static_assert(sizeof(int16_t) == 2, "Size of int16_t is incorrect");
_Static_assert(sizeof(uint16_t) == 2, "Size of uint16_t is incorrect");

_Static_assert(sizeof(int32_t) == 4, "Size of int32_t is incorrect");
_Static_assert(sizeof(uint32_t) == 4, "Size of uint32_t is incorrect");

_Static_assert(sizeof(int64_t) == 8, "Size of int64_t is incorrect");
_Static_assert(sizeof(uint64_t) == 8, "Size of uint64_t is incorrect");

_Static_assert(sizeof(intptr_t) == sizeof(void *), "Size of intptr_t is incorrect");
_Static_assert(sizeof(uintptr_t) == sizeof(void *), "Size of uintptr_t is incorrect");
#endif

/* Maximum width integer types */
#ifndef __ROMCC__
typedef int64_t  intmax_t;
typedef uint64_t uintmax_t;
#endif

/* Convenient typedefs */
typedef int8_t   s8;
typedef uint8_t  u8;

typedef int16_t  s16;
typedef uint16_t u16;

typedef int32_t  s32;
typedef uint32_t u32;

#ifndef __ROMCC__
typedef int64_t  s64;
typedef uint64_t u64;
#endif

/* Limits of integer types */
#define INT8_MIN   ((int8_t)0x80)
#define INT8_MAX   ((int8_t)0x7F)
#define UINT8_MAX  ((uint8_t)0xFF)

#define INT16_MIN  ((int16_t)0x8000)
#define INT16_MAX  ((int16_t)0x7FFF)
#define UINT16_MAX ((uint16_t)0xFFFF)

#define INT32_MIN  ((int32_t)0x80000000)
#define INT32_MAX  ((int32_t)0x7FFFFFFF)
#define UINT32_MAX ((uint32_t)0xFFFFFFFF)

#ifndef __ROMCC__
#define INT64_MIN  ((int64_t)0x8000000000000000)
#define INT64_MAX  ((int64_t)0x7FFFFFFFFFFFFFFF)
#define UINT64_MAX ((uint64_t)0xFFFFFFFFFFFFFFFF)
#endif

#ifndef __ROMCC__
#define INTMAX_MIN  INT64_MIN
#define INTMAX_MAX  INT64_MAX
#define UINTMAX_MAX UINT64_MAX
#endif

/* TODO: move into stdbool.h */
#ifdef __ROMCC__
typedef uint8_t bool;
#else
typedef _Bool   bool;
#endif
#define true    1
#define false   0

#endif /* STDINT_H */
