diff --git a/bake-cl.cmd b/bake-cl.cmd new file mode 100644 index 0000000..310bb61 --- /dev/null +++ b/bake-cl.cmd @@ -0,0 +1,4 @@ + +nasm src\_win\chkstk.asm -ochkstk.o -fwin64 +cl src\ciabatta.c -c -DCIABATTA_WIN -I inc -I src\_win /Z7 /showIncludes /arch:sse2 +lib /nologo /out:ciabatta.lib chkstk.o ciabatta.obj src\fdec64\fdec64.lib src\unicope\unicope.lib diff --git a/inc/assert.h b/inc/assert.h index c3dce26..893cd39 100644 --- a/inc/assert.h +++ b/inc/assert.h @@ -5,6 +5,10 @@ #define __func__ __FUNCTION__ #endif +#if defined (_MSC_VER) + #define _Noreturn +#endif + void _Noreturn _assert( char const *cond, char const *func, diff --git a/inc/errno.h b/inc/errno.h index 648071e..d1eb6bd 100644 --- a/inc/errno.h +++ b/inc/errno.h @@ -1,9 +1,12 @@ #pragma once +#if defined (_MSC_VER) + #define _Thread_local __declspec(thread) +#endif + #define EDOM 1 #define EILSEQ 2 #define ERANGE 3 -#define EIO 4 extern _Thread_local int errno; diff --git a/inc/float.h b/inc/float.h new file mode 100644 index 0000000..21bc7ef --- /dev/null +++ b/inc/float.h @@ -0,0 +1,43 @@ + +#pragma once + +#define DECIMAL_DIG 10 +#define FLT_ROUNDS 1 +#define FLT_EVAL_METHOD 0 + +#define FLT_RADIX 2 +#define FLT_DECIMAL_DIG 6 +#define FLT_MIN 0x1.000000p-126 +#define FLT_MAX 0x1.7ffffep+127 +#define FLT_TRUE_MIN 0x1.000000p-149 +#define FLT_EPSILON 0x1.000002p+0 +#define FLT_MANT_DIG 23 +#define FLT_MIN_EXP -125 +#define FLT_MAX_EXP +128 +#define FLT_MIN_10_EXP -37 +#define FLT_MAX_10_EXP +38 +#define FLT_HAS_SUBNORM 1 + +#define DBL_DECIMAL_DIG 10 +#define DBL_MIN 0x1.0000000000000p-1021 +#define DBL_MAX 0x1.fffffffffffffp+1023 +#define DBL_TRUE_MIN 0x1.0000000000000p-1074 +#define DBL_EPSILON 0x1.0000000000001p+0 +#define DBL_MANT_DIG 11 +#define DBL_MIN_EXP -1022 +#define DBL_MAX_EXP +1024 +#define DBL_MIN_10_EXP -307 +#define DBL_MAX_10_EXP +308 +#define DBL_HAS_SUBNORM 1 + +#define LDBL_DECIMAL_DIG DBL_DECIMAL_DIG +#define LDBL_MIN DBL_MIN +#define LDBL_MAX DBL_MAX +#define LDBL_TRUE_MIN DBL_TRUE_MIN +#define LDBL_EPSILON DBL_EPSILON +#define LDBL_MANT_DIG DBL_MANT_DIG +#define LDBL_MIN_EXP DBL_MIN_EXP +#define LDBL_MIN_10_EXP DBL_MIN_10_EXP +#define LDBL_MAX_EXP DBL_MAX_EXP +#define LDBL_MAX_10_EXP DBL_MAX_10_EXP +#define LDBL_HAS_SUBNORM DBL_HAS_SUBNORM diff --git a/inc/inttypes.h b/inc/inttypes.h index a60e0fc..d8eb89c 100644 --- a/inc/inttypes.h +++ b/inc/inttypes.h @@ -1,241 +1,176 @@ #pragma once -#include +#include #include +#include -// typedef struct imaxdiv_t imaxdiv_t -// It's C's fault not mine +#define PRId8 "hhd" +#define PRId16 "hd" +#define PRId32 "d" +#define PRId64 "lld" +#define PRIdFAST8 "d" +#define PRIdFAST16 "d" +#define PRIdFAST32 "d" +#define PRIdFAST64 "lld" +#define PRIdLEAST8 "hhd" +#define PRIdLEAST16 "hd" +#define PRIdLEAST32 "d" +#define PRIdLEAST64 "lld" +#define PRIdPTR "lld" +#define PRIdMAX "lld" +#define PRIi8 "hhi" +#define PRIi16 "hi" +#define PRIi32 "i" +#define PRIi64 "lli" +#define PRIiFAST8 "i" +#define PRIiFAST16 "i" +#define PRIiFAST32 "i" +#define PRIiFAST64 "lli" +#define PRIiLEAST8 "hhi" +#define PRIiLEAST16 "hi" +#define PRIiLEAST32 "i" +#define PRIiLEAST64 "lli" +#define PRIiPTR "lli" +#define PRIiMAX "lli" +#define PRIo8 "hho" +#define PRIo16 "ho" +#define PRIo32 "o" +#define PRIo64 "llo" +#define PRIoLEAST8 "hho" +#define PRIoLEAST16 "ho" +#define PRIoLEAST32 "o" +#define PRIoLEAST64 "llo" +#define PRIoFAST8 "o" +#define PRIoFAST16 "o" +#define PRIoFAST32 "o" +#define PRIoFAST64 "llo" +#define PRIoPTR "llo" +#define PRIoMAX "llo" +#define PRIu8 "hhu" +#define PRIu16 "hu" +#define PRIu32 "u" +#define PRIu64 "llu" +#define PRIuLEAST8 "hhu" +#define PRIuLEAST16 "hu" +#define PRIuLEAST32 "u" +#define PRIuLEAST64 "llu" +#define PRIuFAST8 "u" +#define PRIuFAST16 "u" +#define PRIuFAST32 "u" +#define PRIuFAST64 "llu" +#define PRIuPTR "llu" +#define PRIuMAX "llu" +#define PRIx8 "hhx" +#define PRIx16 "hx" +#define PRIx32 "x" +#define PRIx64 "llx" +#define PRIxLEAST8 "hhx" +#define PRIxLEAST16 "hx" +#define PRIxLEAST32 "x" +#define PRIxLEAST64 "llx" +#define PRIxFAST8 "x" +#define PRIxFAST16 "x" +#define PRIxFAST32 "x" +#define PRIxFAST64 "llx" +#define PRIxPTR "llx" +#define PRIxMAX "llx" +#define PRIX8 "hhX" +#define PRIX16 "hX" +#define PRIX32 "X" +#define PRIX64 "llX" +#define PRIXLEAST8 "hhX" +#define PRIXLEAST16 "hX" +#define PRIXLEAST32 "X" +#define PRIXLEAST64 "llX" +#define PRIXFAST8 "X" +#define PRIXFAST16 "X" +#define PRIXFAST32 "X" +#define PRIXFAST64 "llX" +#define PRIXPTR "llX" +#define PRIXMAX "llX" -#define _spec8 "hh" -#define _spec16 "" -#define _spec32 "" +#define SCNd8 "hhd" +#define SCNd16 "hd" +#define SCNd32 "d" +#define SCNd64 "lld" +#define SCNdFAST8 "d" +#define SCNdFAST16 "d" +#define SCNdFAST32 "d" +#define SCNdFAST64 "lld" +#define SCNdLEAST8 "hhd" +#define SCNdLEAST16 "hd" +#define SCNdLEAST32 "d" +#define SCNdLEAST64 "lld" +#define SCNdPTR "lld" +#define SCNdMAX "lld" +#define SCNi8 "hhi" +#define SCNi16 "hi" +#define SCNi32 "i" +#define SCNi64 "lli" +#define SCNiFAST8 "i" +#define SCNiFAST16 "i" +#define SCNiFAST32 "i" +#define SCNiFAST64 "lli" +#define SCNiLEAST8 "hhi" +#define SCNiLEAST16 "hi" +#define SCNiLEAST32 "i" +#define SCNiLEAST64 "lli" +#define SCNiPTR "lli" +#define SCNiMAX "lli" +#define SCNo8 "hho" +#define SCNo16 "ho" +#define SCNo32 "o" +#define SCNo64 "llo" +#define SCNoLEAST8 "hho" +#define SCNoLEAST16 "ho" +#define SCNoLEAST32 "o" +#define SCNoLEAST64 "llo" +#define SCNoFAST8 "o" +#define SCNoFAST16 "o" +#define SCNoFAST32 "o" +#define SCNoFAST64 "llo" +#define SCNoPTR "llo" +#define SCNoMAX "llo" +#define SCNu8 "hhu" +#define SCNu16 "hu" +#define SCNu32 "u" +#define SCNu64 "llu" +#define SCNuLEAST8 "hhu" +#define SCNuLEAST16 "hu" +#define SCNuLEAST32 "u" +#define SCNuLEAST64 "llu" +#define SCNuFAST8 "u" +#define SCNuFAST16 "u" +#define SCNuFAST32 "u" +#define SCNuFAST64 "llu" +#define SCNuPTR "llu" +#define SCNuMAX "llu" +#define SCNx8 "hhx" +#define SCNx16 "hx" +#define SCNx32 "x" +#define SCNx64 "llx" +#define SCNxLEAST8 "hhx" +#define SCNxLEAST16 "hx" +#define SCNxLEAST32 "x" +#define SCNxLEAST64 "llx" +#define SCNxFAST8 "x" +#define SCNxFAST16 "x" +#define SCNxFAST32 "x" +#define SCNxFAST64 "llx" +#define SCNxPTR "llx" +#define SCNxMAX "llx" -#if INT64_MAX == LONG_MAX - #define _spec64 "l" -#elif INT64_MAX == LLONG_MAX - #define _spec64 "ll" -#endif +typedef struct imaxdiv_t imaxdiv_t; +struct imaxdiv_t { + intmax_t quot; + intmax_t rem; +}; -#if INT8_LEAST_MAX == CHAR_MAX - #define _spec8l "hh" -#elif INT8_LEAST_MAX == SHORT_MAX || INT8_LEAST_MAX==INT_MAX - #define _spec8l "" -#elif INT8_LEAST_MAX == LONG_MAX - #define _spec8l "l" -#elif INT8_LEAST_MAX == LLONG_MAX - #define _spec8l "ll" -#endif +intmax_t imaxabs(intmax_t j); +imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom); +intmax_t strtoimax(const char *restrict s, char **restrict end, int base); +uintmax_t strtoumax(const char *restrict s, char ** restrict end, int base); +intmax_t wcstoimax(const wchar_t *restrict s, wchar_t **restrict end, int base); +uintmax_t wcstoumax(const wchar_t *restrict s, wchar_t **restrict end, int base); -#if INT16_LEAST_MAX == SHORT_MAX || INT16_LEAST_MAX==INT_MAX - #define _spec16l "" -#elif INT16_LEAST_MAX == LONG_MAX - #define _spec16l "l" -#elif INT16_LEAST_MAX == LLONG_MAX - #define _spec16l "ll" -#endif - -#if INT32_LEAST_MAX==INT_MAX - #define _spec32l "" -#elif INT32_LEAST_MAX == LONG_MAX - #define _spec32l "l" -#elif INT32_LEAST_MAX == LLONG_MAX - #define _spec32l "ll" -#endif - -#if INT64_LEAST_MAX == LONG_MAX - #define _spec64l "l" -#elif INT64_LEAST_MAX == LLONG_MAX - #define _spec64l "ll" -#endif - - -#if INT8_FAST_MAX == CHAR_MAX - #define _spec8f "hh" -#elif INT8_FAST_MAX == SHORT_MAX || INT8_FAST_MAX==INT_MAX - #define _spec8f "" -#elif INT8_FAST_MAX == LONG_MAX - #define _spec8f "l" -#elif INT8_FAST_MAX == LLONG_MAX - #define _spec8f "ll" -#endif - -#if INT16_FAST_MAX == SHORT_MAX || INT16_FAST_MAX==INT_MAX - #define _spec16f "" -#elif INT16_FAST_MAX == LONG_MAX - #define _spec16f "l" -#elif INT16_FAST_MAX == LLONG_MAX - #define _spec16f "ll" -#endif - -#if INT32_FAST_MAX==INT_MAX - #define _spec32f "" -#elif INT32_FAST_MAX == LONG_MAX - #define _spec32f "l" -#elif INT32_FAST_MAX == LLONG_MAX - #define _spec32f "ll" -#endif - -#if INT64_FAST_MAX == LONG_MAX - #define _spec64f "l" -#elif INT64_FAST_MAX == LLONG_MAX - #define _spec64f "ll" -#endif - -#define _specmax "j" - -#define PRId8 _spec8 "d" -#define PRId16 _spec16 "d" -#define PRId32 _spec32 "d" -#define PRId64 _spec64 "d" -#define PRIdFAST8 _spec8f "d" -#define PRIdFAST16 _spec16f "d" -#define PRIdFAST32 _spec32f "d" -#define PRIdFAST64 _spec64f "d" -#define PRIdLEAST8 _spec8l "d" -#define PRIdLEAST16 _spec16l "d" -#define PRIdLEAST32 _spec32l "d" -#define PRIdLEAST64 _spec64l "d" -#define PRIdPTR _specptr "d" -#define PRIdMAX _specmax "d" -#define PRIi8 _spec8 "i" -#define PRIi16 _spec16 "i" -#define PRIi32 _spec32 "i" -#define PRIi64 _spec64 "i" -#define PRIiFAST8 _spec8f "i" -#define PRIiFAST16 _spec16f "i" -#define PRIiFAST32 _spec32f "i" -#define PRIiFAST64 _spec64f "i" -#define PRIiLEAST8 _spec8l "i" -#define PRIiLEAST16 _spec16l "i" -#define PRIiLEAST32 _spec32l "i" -#define PRIiLEAST64 _spec64l "i" -#define PRIiPTR _specptr "i" -#define PRIiMAX _specmax "i" -#define PRIo8 _spec8 "o" -#define PRIo16 _spec16 "o" -#define PRIo32 _spec16 "o" -#define PRIo64 _spec64 "o" -#define PRIoLEAST8 _spec8l "o" -#define PRIoLEAST16 _spec16l "o" -#define PRIoLEAST32 _spec32l "o" -#define PRIoLEAST64 _spec64l "o" -#define PRIoFAST8 _spec8f "o" -#define PRIoFAST16 _spec16f "o" -#define PRIoFAST32 _spec32f "o" -#define PRIoFAST64 _spec64f "o" -#define PRIoPTR _specptr "o" -#define PRIoMAX _specmax "o" -#define PRIu8 _spec8 "u" -#define PRIu16 _spec16 "u" -#define PRIu32 _spec16 "u" -#define PRIu64 _spec64 "u" -#define PRIuLEAST8 _spec8l "u" -#define PRIuLEAST16 _spec16l "u" -#define PRIuLEAST32 _spec32l "u" -#define PRIuLEAST64 _spec64l "u" -#define PRIuFAST8 _spec8f "u" -#define PRIuFAST16 _spec16f "u" -#define PRIuFAST32 _spec32f "u" -#define PRIuFAST64 _spec64f "u" -#define PRIuPTR _specptr "u" -#define PRIuMAX _specmax "u" -#define PRIx8 _spec8 "x" -#define PRIx16 _spec16 "x" -#define PRIx32 _spec32 "x" -#define PRIx64 _spec64 "x" -#define PRIxLEAST8 _spec8l "x" -#define PRIxLEAST16 _spec16l "x" -#define PRIxLEAST32 _spec32l "x" -#define PRIxLEAST64 _spec64l "x" -#define PRIxFAST8 _spec8f "x" -#define PRIxFAST16 _spec16f "x" -#define PRIxFAST32 _spec32f "x" -#define PRIxFAST64 _spec64f "x" -#define PRIxPTR _specptr "x" -#define PRIxMAX _specmax "x" -#define PRIX8 _spec8 "X" -#define PRIX16 _spec16 "X" -#define PRIX32 _spec32 "X" -#define PRIX64 _spec64 "X" -#define PRIXLEAST8 _spec8l "X" -#define PRIXLEAST16 _spec16l "X" -#define PRIXLEAST32 _spec32l "X" -#define PRIXLEAST64 _spec64l "X" -#define PRIXFAST8 _spec8f "X" -#define PRIXFAST16 _spec16f "X" -#define PRIXFAST32 _spec32f "X" -#define PRIXFAST64 _spec64f "X" -#define PRIXPTR _specptr "X" -#define PRIXMAX _specmax "X" - -#define SCNd8 _spec8 "d" -#define SCNd16 _spec16 "d" -#define SCNd32 _spec32 "d" -#define SCNd64 _spec64 "d" -#define SCNdFAST8 _spec8f "d" -#define SCNdFAST16 _spec16f "d" -#define SCNdFAST32 _spec32f "d" -#define SCNdFAST64 _spec64f "d" -#define SCNdLEAST8 _spec8l "d" -#define SCNdLEAST16 _spec16l "d" -#define SCNdLEAST32 _spec32l "d" -#define SCNdLEAST64 _spec64l "d" -#define SCNdPTR _specptr "d" -#define SCNdMAX _specmax "d" -#define SCNi8 _spec8 "i" -#define SCNi16 _spec16 "i" -#define SCNi32 _spec32 "i" -#define SCNi64 _spec64 "i" -#define SCNiFAST8 _spec8f "i" -#define SCNiFAST16 _spec16f "i" -#define SCNiFAST32 _spec32f "i" -#define SCNiFAST64 _spec64f "i" -#define SCNiLEAST8 _spec8l "i" -#define SCNiLEAST16 _spec16l "i" -#define SCNiLEAST32 _spec32l "i" -#define SCNiLEAST64 _spec64l "i" -#define SCNiPTR _specptr "i" -#define SCNiMAX _specmax "i" -#define SCNo8 _spec8 "o" -#define SCNo16 _spec16 "o" -#define SCNo32 _spec16 "o" -#define SCNo64 _spec64 "o" -#define SCNoLEAST8 _spec8l "o" -#define SCNoLEAST16 _spec16l "o" -#define SCNoLEAST32 _spec32l "o" -#define SCNoLEAST64 _spec64l "o" -#define SCNoFAST8 _spec8f "o" -#define SCNoFAST16 _spec16f "o" -#define SCNoFAST32 _spec32f "o" -#define SCNoFAST64 _spec64f "o" -#define SCNoPTR _specptr "o" -#define SCNoMAX _specmax "o" -#define SCNu8 _spec8 "u" -#define SCNu16 _spec16 "u" -#define SCNu32 _spec16 "u" -#define SCNu64 _spec64 "u" -#define SCNuLEAST8 _spec8l "u" -#define SCNuLEAST16 _spec16l "u" -#define SCNuLEAST32 _spec32l "u" -#define SCNuLEAST64 _spec64l "u" -#define SCNuFAST8 _spec8f "u" -#define SCNuFAST16 _spec16f "u" -#define SCNuFAST32 _spec32f "u" -#define SCNuFAST64 _spec64f "u" -#define SCNuPTR _specptr "u" -#define SCNuMAX _specmax "u" -#define SCNx8 _spec8 "x" -#define SCNx16 _spec16 "x" -#define SCNx32 _spec32 "x" -#define SCNx64 _spec64 "x" -#define SCNxLEAST8 _spec8l "x" -#define SCNxLEAST16 _spec16l "x" -#define SCNxLEAST32 _spec32l "x" -#define SCNxLEAST64 _spec64l "x" -#define SCNxFAST8 _spec8f "x" -#define SCNxFAST16 _spec16f "x" -#define SCNxFAST32 _spec32f "x" -#define SCNxFAST64 _spec64f "x" -#define SCNxPTR _specptr "x" -#define SCNxMAX _specmax "x" diff --git a/inc/iso646.h b/inc/iso646.h new file mode 100644 index 0000000..db811b9 --- /dev/null +++ b/inc/iso646.h @@ -0,0 +1,14 @@ + +#pragma once + +#define and && +#define and_eq &= +#define bitand & +#define bitor | +#define compl ~ +#define not ! +#define not_eq != +#define or || +#define or_eq |= +#define xor ^ +#define xor_eq ^= \ No newline at end of file diff --git a/inc/limits.h b/inc/limits.h new file mode 100644 index 0000000..3940eae --- /dev/null +++ b/inc/limits.h @@ -0,0 +1,86 @@ + +#pragma once + +#define _ILP32 0 +#define _LLP64 1 +#define _LP64 2 +#define _ILP64 3 +#define _SILP64 4 + +#if defined(__linux__) + #define _DATA_MODEL _LP64 +#elif defined(_WIN64) + #define _DATA_MODEL _LLP64 +#else + #error "Could not determine target OS" +#endif + +#define MB_LEN_MAX 5 + +#define CHAR_BIT 8 +#define BOOL_WIDTH 8 + +#define UCHAR_WIDTH 8 +#define SCHAR_WIDTH 8 +#define UCHAR_MAX 0xff +#define SCHAR_MIN -0x80 +#define SCHAR_MAX +0x7f + +#if defined(__CHAR_UNSIGNED__) || defined(_CHAR_UNSIGNED) + #define CHAR_MIN UCHAR_MIN + #define CHAR_MAX UCHAR_MAX +#else + #define CHAR_MIN SCHAR_MIN + #define CHAR_MAX SCHAR_MAX +#endif + +#define USHRT_WIDTH 16 +#define SHRT_WIDTH 16 +#define USHRT_MAX 0xffff +#define SHRT_MIN -0x8000 +#define SHRT_MAX +0x7fff + +#define UINT_WIDTH 32 +#define INT_WIDTH 32 +#define UINT_MAX 0xffffffffu +#define INT_MIN -0x80000000 +#define INT_MAX +0x7fffffff + +#if _DATA_MODEL == _LP64 + #define ULONG_WIDTH 64 + #define LONG_WIDTH 64 + #define ULONG_MAX 0xffffffffffffffffull + #define LONG_MIN -0x8000000000000000ll + #define LONG_MAX +0x7fffffffffffffffll +#elif _DATA_MODEL == _LLP64 + #define ULONG_WIDTH 32 + #define LONG_WIDTH 32 + #define ULONG_MAX +0xffffffff + #define LONG_MIN -0x80000000 + #define LONG_MAX +0x7fffffff +#endif + +#define ULLONG_WIDTH 64 +#define LLONG_WIDTH 64 +#define ULLONG_MAX 0xffffffffffffffffull +#define LLONG_MIN -0x8000000000000000ll +#define LLONG_MAX +0x7fffffffffffffffll + +#define PTRDIFF_WIDTH LLONG_WIDTH +#define PTRDIFF_MIN LLONG_MIN +#define PTRDIFF_MAX LLONG_MAX + +#define SIZE_WIDTH ULLONG_WIDTH +#define SIZE_MAX ULLONG_MAX + +#define SIG_ATOMIC_WIDTH LLONG_WIDTH +#define SIG_ATOMIC_MIN LLONG_MIN +#define SIG_ATOMIC_MAX LLONG_MAX + +#define WINT_WIDTH INT_WIDTH +#define WINT_MIN INT_MIN +#define WINT_MAX INT_MAX + +#define WCHAR_WIDTH USHORT_WIDTH +#define WCHAR_MIN USHORT_WIDTH +#define WCHAR_MAX USHORT_WIDTH diff --git a/inc/stdatomic.h b/inc/stdatomic.h new file mode 100644 index 0000000..84f60d3 --- /dev/null +++ b/inc/stdatomic.h @@ -0,0 +1,13 @@ + +#pragma once + +enum memory_order { + memory_order_relaxed, + memory_order_consume, + memory_order_acquire, + memory_order_release, + memory_order_acq_rel, + memory_order_seq_cst +}; + +typedef int atomic_int; diff --git a/inc/stddef.h b/inc/stddef.h new file mode 100644 index 0000000..6da91db --- /dev/null +++ b/inc/stddef.h @@ -0,0 +1,27 @@ + +#pragma once + +#define __bool_true_false_are_defined 1 +#define __alignas_is_defined 1 +#define __alignof_is_defined 1 + +#define NULL ((void *)0) +#define offsetof(st, m) ((size_t)((char *)&((st *)0)->m - (char *)0)) + +typedef unsigned long long size_t; +typedef long long ptrdiff_t; +typedef long long max_align_t; +typedef unsigned short wchar_t; // + +#define bool _Bool +#define true 1 +#define false 0 + +#define alignas _Alignas +#define alignof _Alignof + +#if !defined(_MSC_VER) + #define noreturn _Noreturn +#else + #define noreturn declspec(noreturn) +#endif diff --git a/inc/stdint.h b/inc/stdint.h new file mode 100644 index 0000000..42d4b88 --- /dev/null +++ b/inc/stdint.h @@ -0,0 +1,132 @@ + +#pragma once + +typedef signed char int8_t; +typedef short int16_t; +typedef int int32_t; +typedef long long int64_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +typedef int32_t int_fast8_t; +typedef int32_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint32_t uint_fast8_t; +typedef uint32_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +typedef int64_t intptr_t; +typedef uint64_t uintptr_t; + +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + +#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 INT8_MIN -0x80 +#define INT16_MIN -0x8000 +#define INT32_MIN -0x80000000 +#define INT64_MIN -0x8000000000000000ll + +#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 +0xffffffffffffffffull + +#define INT_LEAST8_WIDTH INT8_WIDTH +#define INT_LEAST16_WIDTH INT16_WIDTH +#define INT_LEAST32_WIDTH INT32_WIDTH +#define INT_LEAST64_WIDTH INT64_WIDTH + +#define UINT_LEAST8_WIDTH INT8_WIDTH +#define UINT_LEAST16_WIDTH INT16_WIDTH +#define UINT_LEAST32_WIDTH INT32_WIDTH +#define UINT_LEAST64_WIDTH INT64_WIDTH + +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST64_MIN INT64_MIN + +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MAX INT64_MAX + +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +#define INT_FAST8_WIDTH INT32_WIDTH +#define INT_FAST16_WIDTH INT32_WIDTH +#define INT_FAST32_WIDTH INT32_WIDTH +#define INT_FAST64_WIDTH INT64_WIDTH + +#define UINT_FAST8_WIDTH INT32_WIDTH +#define UINT_FAST16_WIDTH INT32_WIDTH +#define UINT_FAST32_WIDTH INT32_WIDTH +#define UINT_FAST64_WIDTH INT64_WIDTH + +#define INT_FAST8_MIN INT32_MIN +#define INT_FAST16_MIN INT32_MIN +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST64_MIN INT64_MIN + +#define INT_FAST8_MAX INT32_MAX +#define INT_FAST16_MAX INT32_MAX +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MAX INT64_MAX + +#define UINT_FAST8_MAX UINT32_MAX +#define UINT_FAST16_MAX UINT32_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +#define INTPTR_WIDTH INT64_WIDTH +#define UINTPTR_WIDTH UINT64_WIDTH +#define INTPTR_MIN INT64_MIN +#define INTPTR_MAX INT64_MAX +#define UINTPTR_MAX UINT64_MAX + +#define INTMAX_WIDTH INT64_WIDTH +#define UINTMAX_WIDTH UINT64_WIDTH +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +#define INT8_C(lit) lit +#define INT16_C(lit) lit +#define INT32_C(lit) lit +#define INT64_C(lit) lit ## ll + +#define UINT8_C(lit) lit +#define UINT16_C(lit) lit +#define UINT32_C(lit) lit +#define UINT64_C(lit) lit ## ull diff --git a/inc/stdio.h b/inc/stdio.h index 46cfbb4..cd15be8 100644 --- a/inc/stdio.h +++ b/inc/stdio.h @@ -1,3 +1,4 @@ + #pragma once #include diff --git a/inc/threads.h b/inc/threads.h index 30cf91b..f50274b 100644 --- a/inc/threads.h +++ b/inc/threads.h @@ -4,7 +4,12 @@ #include #include -#define thread_local _Thread_local +#if defined(_WIN32) + #define _Thread_local __declspec(thread) +#endif + +#define thread_local _Thread_local + #define ONCE_FLAG_INIT 1 #define TSS_DTOR_ITERATIONS 32 diff --git a/inc/_mbstate.h b/inc/types/mbstate.h similarity index 56% rename from inc/_mbstate.h rename to inc/types/mbstate.h index cd0d9bc..85494c3 100644 --- a/inc/_mbstate.h +++ b/inc/types/mbstate.h @@ -4,8 +4,8 @@ typedef struct mbstate_t mbstate_t; struct mbstate_t { union { - char16_t leftover; - char16_t high_surrogate; + unsigned short leftover; + unsigned short high_surrogate; }; }; diff --git a/inc/types/size.c b/inc/types/size.c new file mode 100644 index 0000000..befa3c6 --- /dev/null +++ b/inc/types/size.c @@ -0,0 +1,8 @@ + +#pragma once + +#if defined(_MSC_VER) + typedef unsigned long long size_t; +#else + typedef unsigned long size_t; +#endif diff --git a/inc/uchar.h b/inc/uchar.h index 7d108d9..29dbcd4 100644 --- a/inc/uchar.h +++ b/inc/uchar.h @@ -1,14 +1,14 @@ #pragma once +#include + #include #include typedef uint_least16_t char16_t; typedef uint_least32_t char32_t; -#include "_mbstate.h" - size_t mbrtoc16( char16_t *restrict pc16, char const *restrict s, diff --git a/inc/wchar.h b/inc/wchar.h index 722f44f..c10c627 100644 --- a/inc/wchar.h +++ b/inc/wchar.h @@ -1,14 +1,17 @@ #pragma once +#include +#include #include +#include +#include +#include typedef int wint_t; -#include "_mbstate.h" - -#define WCHAR_MIN 0x0000 -#define WCHAR_MAX 0xffff +// #define WCHAR_MIN 0x0000 +// #define WCHAR_MAX 0xffff #ifndef WEOF #define WEOF -1 diff --git a/src/_win/environment.c b/src/_win/environment.c index 4571a06..3674666 100644 --- a/src/_win/environment.c +++ b/src/_win/environment.c @@ -42,11 +42,20 @@ void mainCRTStartup() { } +_Noreturn void _Exit(int status) { + ExitProcess(status); + #if defined(_MSC_VER) + __assume(0); + #elif defined(__GNUC__) + __builtin_unreachable(); + #endif +} + _Noreturn void quick_exit(int status) { while(atqexit_func_count--) { atqexit_funcs[atqexit_func_count](); } - ExitProcess(status); + _Exit(status); } _Noreturn void exit(int status) { @@ -54,16 +63,12 @@ _Noreturn void exit(int status) { atexit_funcs[atqexit_func_count](); } _close_io(); - ExitProcess(status); -} - -_Noreturn void _Exit(int status) { - ExitProcess(status); + _Exit(status); } _Noreturn void abort(void) { raise(SIGABRT); - ExitProcess(-69); + _Exit(-69); } int atexit(void (*func)(void)) { @@ -126,7 +131,7 @@ int system(const char* string) { .hStdError = GetStdHandle(STD_ERROR_HANDLE), .hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE) }; - PROCESS_INFORMATION pi = {}; + PROCESS_INFORMATION pi = {0}; if (!CreateProcessW(NULL, cmd_line, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) { goto error; diff --git a/src/_win/stdio.c b/src/_win/stdio.c index 3d4aa4f..d3aeff9 100644 --- a/src/_win/stdio.c +++ b/src/_win/stdio.c @@ -130,8 +130,8 @@ void _setup_io() { int win_parse_mode( char const *mode, - int *pio_mode, - int *pbt_mode, + stream_io_mode_t *pio_mode, + stream_bt_mode_t *pbt_mode, DWORD *paccess, DWORD *pshare, DWORD *pdisp diff --git a/src/ciabatta.c b/src/ciabatta.c index ac37e40..2f99cb1 100644 --- a/src/ciabatta.c +++ b/src/ciabatta.c @@ -23,7 +23,9 @@ // Intrinsics #if !defined(__FMA__) - #error "Get a better CPU (the kind that supports FMA) or enable -mfma" + #if !defined(_MSC_VER) + #error "Get a better CPU (the kind that supports FMA) or enable -mfma" + #endif #endif // xmmintrin.h depends on mm_malloc.h, which itself includes other CRT headers // Which introduces compiler errors. Actually does it really matter? I would diff --git a/src/string.c b/src/string.c index 008e579..ea80729 100644 --- a/src/string.c +++ b/src/string.c @@ -209,7 +209,6 @@ char *strerror(int errnum) { case EDOM: return "Value is out of domain of the function"; case EILSEQ: return "Illegal byte sequence"; case ERANGE: return "Value is out of range"; - case EIO: return "I/O error"; } return "Unkown error"; } diff --git a/todo b/todo index adcc669..6dd64ab 100644 --- a/todo +++ b/todo @@ -4,6 +4,7 @@ general: behaviours of the library. * Ok I just realised that I assumed that wchar_t is a 16-bit string in a bunch of places. +* Decide what the heck I want to do with wchar_t math.h: * exp