#pragma once #include // ------------------------------------------------------------------------ // types /* useful aliases */ typedef char byte; typedef signed char schar, sbyte; typedef unsigned char uchar, ubyte; typedef signed short sshort; typedef unsigned short ushort; typedef signed int sint; typedef unsigned int uint; typedef signed long slong; typedef unsigned long ulong; typedef long long vlong; typedef unsigned long long uvlong; typedef signed long long svlong; typedef _Bool bool; /* fixed width */ typedef signed INT8 int8; typedef signed INT16 int16; typedef signed INT32 int32; typedef signed INT64 int64; typedef unsigned INT8 uint8; typedef unsigned INT16 uint16; typedef unsigned INT32 uint32; typedef unsigned INT64 uint64; typedef uint32 rune; /* pointer address */ typedef ADDR intptr; typedef unsigned ADDR uintptr; typedef ADDR address_t; typedef REG register_t; typedef unsigned REG uregister_t; /* variable length list */ typedef __builtin_va_list va_list; #undef INT8 #undef INT16 #undef INT32 #undef INT64 #undef ADDR #undef REG // ------------------------------------------------------------------ // global constants #define true 1 #define false 0 #define nil ((void*)0) /* limits */ #define CHAR_BIT 8 #define SCHAR_MIN (-128) #define SCHAR_MAX 127 #define UCHAR_MAX 255 #if '\xff' > 0 # define CHAR_MIN 0 # define CHAR_MAX UCHAR_MAX #else # define CHAR_MIN SCHAR_MIN # define CHAR_MAX SCHAR_MAX #endif #define SHRT_MIN (-1-0x7fff) #define SHRT_MAX 0x7fff #define USHRT_MAX 0xffff #define INT_MIN (-1-0x7fffffff) #define INT_MAX 0x7fffffff #define UINT_MAX 0xffffffffU #define LONG_MIN (-LONG_MAX-1) #define ULONG_MAX (2UL*LONG_MAX+1) #define LLONG_MIN (-LLONG_MAX-1) #define LLONG_MAX 0x7fffffffffffffffLL #define ULLONG_MAX (2ULL*LLONG_MAX+1) #define INT8_MIN (-1-0x7f) #define INT16_MIN (-1-0x7fff) #define INT32_MIN (-1-0x7fffffff) #define INT64_MIN (-1-0x7fffffffffffffff) #define INT8_MAX (0x7f) #define INT16_MAX (0x7fff) #define INT32_MAX (0x7fffffff) #define INT64_MAX (0x7fffffffffffffff) #define UINT8_MAX (0xff) #define UINT16_MAX (0xffff) #define UINT32_MAX (0xffffffffu) #define UINT64_MAX (0xffffffffffffffffu) #define PATH_MAX 4096 // ------------------------------------------------------------------ // global macros /* weak aliasing */ #define noreturn _Noreturn #define hidden __attribute__((__visibility__("hidden"))) #define weakalias(old, new) extern __typeof(old) new __attribute__((weak, alias(#old))) /* offsets */ #define offsetof(t, d) __builtin_offsetof(t, d) /* variable arguments */ #define va_start(v,a) __builtin_va_start(v,a) #define va_end(v) __builtin_va_end(v) #define va_arg(v,t) __builtin_va_arg(v,t) #define va_copy(d,s) __builtin_va_copy(d,s) /* array helpers */ #define arrlen(Array) (sizeof(Array) / sizeof((Array)[0])) #define arrend(Array) ((Array) + arrlen(Array)) /* simple thresholding */ #define MAX(x, y) (((x) > (y)) ? (x) : (y)) #define MIN(x, y) (((x) < (y)) ? (x) : (y)) #define CLAMP(x, lo, hi) (((x) < (lo)) ? (lo) : (((x) > (hi)) ? (hi) : (x)))