diff --git a/include/cia-def.h b/include/cia-def.h index 9d67464..750005b 100644 --- a/include/cia-def.h +++ b/include/cia-def.h @@ -14,39 +14,8 @@ #define NULL ((void *)0) // Assert commonly-accepted platform-invariant sizes -static_assert(sizeof(char) == 1, "Char isn't 1 bytes long"); -static_assert(sizeof(short) == 2, "Short isn't 2 bytes long"); -static_assert(sizeof(int) == 4, "Int isn't 4 bytes long"); -static_assert(sizeof(long long int) == 8, "Long long isn't 8 bytes long"); -#if defined(_CIA_OS_LINUX) - static_assert(sizeof(long) == 8, "Long on linux isn't 8 bytes"); -#elif defined(_CIA_OS_WINDOWS) - static_assert(sizeof(long) == 4, "Long on windows isn't 4 bytes"); -#endif - -// stdint.h type definitions -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; -#if defined(_CIA_OS_LINUX) - typedef signed long int64_t; - typedef unsigned long uint64_t; -#elif defined(_CIA_OS_WINDOWS) - typedef signed long long int64_t; - typedef unsigned long long uint64_t; -#else - #error "Platform not implemented" -#endif - -// stdbool.h -#if !defined(__bool_true_false_are_defined) - typedef _Bool bool; - #define true ((bool)1) - #define false ((bool)0) -#endif +#include +#include // Short type definitions typedef int8_t i8; diff --git a/include/stdbool.h b/include/stdbool.h new file mode 100644 index 0000000..029f912 --- /dev/null +++ b/include/stdbool.h @@ -0,0 +1,9 @@ + +#pragma once + +#if !defined(__bool_true_false_are_defined) + typedef _Bool bool; + #define true ((bool)1) + #define false ((bool)0) + #define __bool_true_false_are_defined +#endif diff --git a/include/stdint.h b/include/stdint.h new file mode 100644 index 0000000..f17d3de --- /dev/null +++ b/include/stdint.h @@ -0,0 +1,168 @@ + +#pragma once + +static_assert(sizeof(char) == 1, "Char isn't 1 bytes long"); +static_assert(sizeof(short) == 2, "Short isn't 2 bytes long"); +static_assert(sizeof(int) == 4, "Int isn't 4 bytes long"); +static_assert(sizeof(long long int) == 8, "Long long isn't 8 bytes long"); +#if defined(_CIA_OS_LINUX) + static_assert(sizeof(long) == 8, "Long on linux isn't 8 bytes"); +#elif defined(_CIA_OS_WINDOWS) + static_assert(sizeof(long) == 4, "Long on windows isn't 4 bytes"); +#endif + +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; +#if defined(_CIA_OS_LINUX) + typedef signed long int64_t; + typedef unsigned long uint64_t; +#elif defined(_CIA_OS_WINDOWS) + typedef signed long long int64_t; + typedef unsigned long long uint64_t; +#else + #error "Platform not implemented" +#endif + +typedef int8_t int_fast8_t, int_least8_t; +typedef int16_t int_fast16_t, int_least16_t; +typedef int32_t int_fast32_t, int_least32_t; +typedef int64_t int_fast64_t, int_least64_t; +typedef uint8_t uint_fast8_t, uint_least8_t; +typedef uint16_t uint_fast16_t, uint_least16_t; +typedef uint32_t uint_fast32_t, uint_least32_t; +typedef uint64_t uint_fast64_t, uint_least64_t; + +// TODO: verify what size it is (on windows and linux) +typedef intmax_t int64_t; +typedef intptr_t int64_t; +typedef uintmax_t uint64_t; +typedef uintptr_t uint64_t; + +// Constant expandors +#define INT8_C(n) (n) +#define INT16_C(n) (n) +#define INT32_C(n) (n) +#define UINT8_C(n) (n) +#define UINT16_C(n) (n) +#define UINT32_C(n) (n) + +#if defined(_CIA_OS_LINUX) + #define INT64_C(n) (n ## L) + #define INTMAX_C(n) (n ## L) + #define UINT64_C(n) (n ## UL) + #define UINTMAX_C(n) (n ## UL) +#elif defined(_CIA_OS_WINDOWS) + #define INT64_C(n) (n ## LL) + #define INTMAX_C(n) (n ## LL) + #define UINT64_C(n) (n ## ULL) + #define UINTMAX_C(n) (n ## ULL) +#else + #error "Platform functionality not defined" +#endif + +#define INT8_WIDTH 8 +#define INT16_WIDTH 16 +#define INT32_WIDTH 32 +#define INT64_WIDTH 64 +#define UINT8_WIDTH 8 +#define UINT16_WIDTH 16 +#define UINT32_WIDTH 32 +#define UINT64_WIDTH 64 +#define INT_FAST8_WIDTH 8 +#define INT_FAST16_WIDTH 16 +#define INT_FAST32_WIDTH 32 +#define INT_FAST64_WIDTH 64 +#define UINT_FAST8_WIDTH 8 +#define UINT_FAST16_WIDTH 16 +#define UINT_FAST32_WIDTH 32 +#define UINT_FAST64_WIDTH 64 +#define INT_LEAST8_WIDTH 8 +#define INT_LEAST16_WIDTH 16 +#define INT_LEAST32_WIDTH 32 +#define INT_LEAST64_WIDTH 64 +#define UINT_LEAST8_WIDTH 8 +#define UINT_LEAST16_WIDTH 16 +#define UINT_LEAST32_WIDTH 32 +#define UINT_LEAST64_WIDTH 64 +#define INTPTR_WIDTH 64 +#define INTMAX_WIDTH 64 +#define UINTPTR_WIDTH 64 +#define UINTMAX_WIDTH 64 + +// Temporary defines +#define _s8_min -0x80 +#define _s8_max 0x7f +#define _u8_max 0xff +#define _s16_min -0x8000 +#define _s16_max 0x7fff +#define _u16_max 0xffff +#define _s32_min -0x80000000 +#define _s32_max 0x7fffffff +#define _u32_max 0xffffffff +#define _s64_min INT64_C(-0x8000000000000000) +#define _s64_max INT64_C(0x7fffffffffffffff) +#define _u64_max UINT64_C(0xffffffffffffffff) + +// Min/max for all integer types +#define INT8_MIN _s8_min +#define INT_FAST8_MIN _s8_min +#define INT_LEAST8_MIN _s8_min +#define INT16_MIN _s16_min +#define INT_FAST16_MIN _s16_min +#define INT_LEAST16_MIN _s16_min +#define INT32_MIN _s32_min +#define INT_FAST32_MIN _s32_min +#define INT_LEAST32_MIN _s32_min +#define INT64_MIN _s64_min +#define INT_FAST64_MIN _s64_min +#define INT_LEAST64_MIN _s64_min +#define INTPTR_MIN _s64_min +#define INTMAX_MIN _s64_min + +#define INT8_MAX _s8_max +#define INT_FAST8_MAX _s8_max +#define INT_LEAST8_MAX _s8_max +#define INT16_MAX _s16_max +#define INT_FAST16_MAX _s16_max +#define INT_LEAST16_MAX _s16_max +#define INT32_MAX _s32_max +#define INT_FAST32_MAX _s32_max +#define INT_LEAST32_MAX _s32_max +#define INT64_MAX _s64_max +#define INT_FAST64_MAX _s64_max +#define INT_LEAST64_MAX _s64_max +#define INTPTR_MAX _s64_max +#define INTMAX_MAX _s64_max + +#define UINT8_MAX _u8_max +#define UINT_FAST8_MAX _u8_max +#define UINT_LEAST8_MAX _u8_max +#define UINT16_MAX _u16_max +#define UINT_FAST16_MAX _u16_max +#define UINT_LEAST16_MAX _u16_max +#define UINT32_MAX _u32_max +#define UINT_FAST32_MAX _u32_max +#define UINT_LEAST32_MAX _u32_max +#define UINT64_MAX _u64_max +#define UINT_FAST64_MAX _u64_max +#define UINT_LEAST64_MAX _u64_max +#define UINTPTR_MAX _u64_max +#define UINTMAX_MAX _u64_max + +// Undo temporary defines +#undef _s8_max +#undef _s8_min +#undef _u8_max +#undef _s16_max +#undef _s16_min +#undef _u16_max +#undef _s32_max +#undef _s32_min +#undef _u32_max +#undef _s64_max +#undef _s64_min +#undef _u64_max \ No newline at end of file