From 6091eac82024383941532239c28e396967aa6ab0 Mon Sep 17 00:00:00 2001 From: jun <83899451+zeichensystem@users.noreply.github.com> Date: Tue, 13 May 2025 14:56:21 +0200 Subject: [PATCH] Add guf_math_ckdint IMPL_STATIC etc. --- src/guf_math.h | 9 +- src/guf_math_ckdint.h | 436 ++++++++++++++++++++++++++++++------------ src/guf_rand.h | 1 + src/guf_str.h | 1 + tools/ckdint-gen.py | 119 +++++++++--- 5 files changed, 411 insertions(+), 155 deletions(-) diff --git a/src/guf_math.h b/src/guf_math.h index 8ee87e0..b9e68f2 100644 --- a/src/guf_math.h +++ b/src/guf_math.h @@ -1,9 +1,6 @@ -// #if defined(GUF_MATH_IMPL_STATIC) -// #define GUF_MATH_KWRDS static -// #else -// #define GUF_MATH_KWRDS -// #endif - +/* + is parametrized: no +*/ #ifndef GUF_MATH_H #define GUF_MATH_H #include "guf_common.h" diff --git a/src/guf_math_ckdint.h b/src/guf_math_ckdint.h index 30d21d7..5f0fbc2 100644 --- a/src/guf_math_ckdint.h +++ b/src/guf_math_ckdint.h @@ -1,7 +1,15 @@ +/* + is parametrized: no +*/ +#if defined(GUF_MATH_CKDINT_IMPL_STATIC) + #define GUF_MATH_CKDINT_KWRDS static inline +#else + #define GUF_MATH_CKDINT_KWRDS +#endif + #ifndef GUF_MATH_CKDINT_H #define GUF_MATH_CKDINT_H #include "guf_common.h" -#include "guf_assert.h" typedef enum guf_math_ckd_result {GUF_MATH_CKD_SUCCESS = 0, GUF_MATH_CKD_OVERFLOW, GUF_MATH_CKD_UNDERFLOW} guf_math_ckd_result; @@ -70,10 +78,189 @@ typedef enum guf_math_ckd_result {GUF_MATH_CKD_SUCCESS = 0, GUF_MATH_CKD_OVERFLO cf. https://stackoverflow.com/questions/29808397/how-to-portably-find-out-minint-max-absint-min (last-retrieved 2025-05-11) */ +// Signed integer arithmetic checks (generated with libguf/tools/ckdint-gen.py) -// Signed integer add/sub checks (generated with libguf/tools/ckdint-gen.py) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_int(int a, int b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_int(int a, int b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_int(int a, int b); -static inline guf_math_ckd_result guf_ckd_add_int(int a, int b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_i8(int8_t a, int8_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_i8(int8_t a, int8_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_i8(int8_t a, int8_t b); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_i16(int16_t a, int16_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_i16(int16_t a, int16_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_i16(int16_t a, int16_t b); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_i32(int32_t a, int32_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_i32(int32_t a, int32_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_i32(int32_t a, int32_t b); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_i64(int64_t a, int64_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_i64(int64_t a, int64_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_i64(int64_t a, int64_t b); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_ptrdiff_t(ptrdiff_t a, ptrdiff_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_ptrdiff_t(ptrdiff_t a, ptrdiff_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_ptrdiff_t(ptrdiff_t a, ptrdiff_t b); + +// Unsigned integer arithmetic checks (generated with libguf/tools/ckdint-gen.py) + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_uchar(unsigned char a, unsigned char b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_uchar(unsigned char a, unsigned char b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_uchar(unsigned char a, unsigned char b); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_unsigned(unsigned a, unsigned b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_unsigned(unsigned a, unsigned b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_unsigned(unsigned a, unsigned b); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_u8(uint8_t a, uint8_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_u8(uint8_t a, uint8_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_u8(uint8_t a, uint8_t b); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_u16(uint16_t a, uint16_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_u16(uint16_t a, uint16_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_u16(uint16_t a, uint16_t b); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_u32(uint32_t a, uint32_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_u32(uint32_t a, uint32_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_u32(uint32_t a, uint32_t b); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_u64(uint64_t a, uint64_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_u64(uint64_t a, uint64_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_u64(uint64_t a, uint64_t b); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_size_t(size_t a, size_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_size_t(size_t a, size_t b); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_size_t(size_t a, size_t b); + + +// Signed saturating/wrapping arithmetic (generated with libguf/tools/ckdint-gen.py) + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_int(int a, int b, int *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_int(int a, int b, int *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_int(int a, int b, int *result); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_int(int a, int b, int *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_int(int a, int b, int *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_int(int a, int b, int *result); + + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_i8(int8_t a, int8_t b, int8_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_i8(int8_t a, int8_t b, int8_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_i8(int8_t a, int8_t b, int8_t *result); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_i8(int8_t a, int8_t b, int8_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_i8(int8_t a, int8_t b, int8_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_i8(int8_t a, int8_t b, int8_t *result); + + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_i16(int16_t a, int16_t b, int16_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_i16(int16_t a, int16_t b, int16_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_i16(int16_t a, int16_t b, int16_t *result); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_i16(int16_t a, int16_t b, int16_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_i16(int16_t a, int16_t b, int16_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_i16(int16_t a, int16_t b, int16_t *result); + + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_i32(int32_t a, int32_t b, int32_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_i32(int32_t a, int32_t b, int32_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_i32(int32_t a, int32_t b, int32_t *result); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_i32(int32_t a, int32_t b, int32_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_i32(int32_t a, int32_t b, int32_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_i32(int32_t a, int32_t b, int32_t *result); + + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_i64(int64_t a, int64_t b, int64_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_i64(int64_t a, int64_t b, int64_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_i64(int64_t a, int64_t b, int64_t *result); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_i64(int64_t a, int64_t b, int64_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_i64(int64_t a, int64_t b, int64_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_i64(int64_t a, int64_t b, int64_t *result); + + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result); + +// Unsigned saturating/wrapping arithmetic (generated with libguf/tools/ckdint-gen.py) + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_uchar(unsigned char a, unsigned char b, unsigned char *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_uchar(unsigned char a, unsigned char b, unsigned char *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_uchar(unsigned char a, unsigned char b, unsigned char *result); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_uchar(unsigned char a, unsigned char b, unsigned char *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_uchar(unsigned char a, unsigned char b, unsigned char *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_uchar(unsigned char a, unsigned char b, unsigned char *result); + + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_unsigned(unsigned a, unsigned b, unsigned *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_unsigned(unsigned a, unsigned b, unsigned *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_unsigned(unsigned a, unsigned b, unsigned *result); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_unsigned(unsigned a, unsigned b, unsigned *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_unsigned(unsigned a, unsigned b, unsigned *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_unsigned(unsigned a, unsigned b, unsigned *result); + + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_u8(uint8_t a, uint8_t b, uint8_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_u8(uint8_t a, uint8_t b, uint8_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_u8(uint8_t a, uint8_t b, uint8_t *result); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_u8(uint8_t a, uint8_t b, uint8_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_u8(uint8_t a, uint8_t b, uint8_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_u8(uint8_t a, uint8_t b, uint8_t *result); + + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_u16(uint16_t a, uint16_t b, uint16_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_u16(uint16_t a, uint16_t b, uint16_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_u16(uint16_t a, uint16_t b, uint16_t *result); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_u16(uint16_t a, uint16_t b, uint16_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_u16(uint16_t a, uint16_t b, uint16_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_u16(uint16_t a, uint16_t b, uint16_t *result); + + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_u32(uint32_t a, uint32_t b, uint32_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_u32(uint32_t a, uint32_t b, uint32_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_u32(uint32_t a, uint32_t b, uint32_t *result); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_u32(uint32_t a, uint32_t b, uint32_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_u32(uint32_t a, uint32_t b, uint32_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_u32(uint32_t a, uint32_t b, uint32_t *result); + + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_u64(uint64_t a, uint64_t b, uint64_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_u64(uint64_t a, uint64_t b, uint64_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_u64(uint64_t a, uint64_t b, uint64_t *result); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_u64(uint64_t a, uint64_t b, uint64_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_u64(uint64_t a, uint64_t b, uint64_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_u64(uint64_t a, uint64_t b, uint64_t *result); + + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_size_t(size_t a, size_t b, size_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_size_t(size_t a, size_t b, size_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_size_t(size_t a, size_t b, size_t *result); + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_size_t(size_t a, size_t b, size_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_size_t(size_t a, size_t b, size_t *result); +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_size_t(size_t a, size_t b, size_t *result); + + +#if defined(GUF_MATH_CKDINT_IMPL) || defined(GUF_MATH_CKDINT_IMPL_STATIC) +#include "guf_assert.h" + +// Signed integer arithmetic checks (generated with libguf/tools/ckdint-gen.py) + +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_int(int a, int b) { if (b > 0 && a > INT_MAX - b) { return GUF_MATH_CKD_OVERFLOW; @@ -83,7 +270,7 @@ static inline guf_math_ckd_result guf_ckd_add_int(int a, int b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_sub_int(int a, int b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_int(int a, int b) { if (b < 0 && a > INT_MAX + b) { return GUF_MATH_CKD_OVERFLOW; @@ -93,7 +280,7 @@ static inline guf_math_ckd_result guf_ckd_sub_int(int a, int b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_mul_int(int a, int b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_int(int a, int b) { if (b > 0) { if (a > INT_MAX / b) { @@ -118,7 +305,7 @@ static inline guf_math_ckd_result guf_ckd_mul_int(int a, int b) } } -static inline guf_math_ckd_result guf_ckd_add_i8(int8_t a, int8_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_i8(int8_t a, int8_t b) { if (b > 0 && a > INT8_MAX - b) { return GUF_MATH_CKD_OVERFLOW; @@ -128,7 +315,7 @@ static inline guf_math_ckd_result guf_ckd_add_i8(int8_t a, int8_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_sub_i8(int8_t a, int8_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_i8(int8_t a, int8_t b) { if (b < 0 && a > INT8_MAX + b) { return GUF_MATH_CKD_OVERFLOW; @@ -138,7 +325,7 @@ static inline guf_math_ckd_result guf_ckd_sub_i8(int8_t a, int8_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_mul_i8(int8_t a, int8_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_i8(int8_t a, int8_t b) { if (b > 0) { if (a > INT8_MAX / b) { @@ -163,7 +350,7 @@ static inline guf_math_ckd_result guf_ckd_mul_i8(int8_t a, int8_t b) } } -static inline guf_math_ckd_result guf_ckd_add_i16(int16_t a, int16_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_i16(int16_t a, int16_t b) { if (b > 0 && a > INT16_MAX - b) { return GUF_MATH_CKD_OVERFLOW; @@ -173,7 +360,7 @@ static inline guf_math_ckd_result guf_ckd_add_i16(int16_t a, int16_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_sub_i16(int16_t a, int16_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_i16(int16_t a, int16_t b) { if (b < 0 && a > INT16_MAX + b) { return GUF_MATH_CKD_OVERFLOW; @@ -183,7 +370,7 @@ static inline guf_math_ckd_result guf_ckd_sub_i16(int16_t a, int16_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_mul_i16(int16_t a, int16_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_i16(int16_t a, int16_t b) { if (b > 0) { if (a > INT16_MAX / b) { @@ -208,7 +395,7 @@ static inline guf_math_ckd_result guf_ckd_mul_i16(int16_t a, int16_t b) } } -static inline guf_math_ckd_result guf_ckd_add_i32(int32_t a, int32_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_i32(int32_t a, int32_t b) { if (b > 0 && a > INT32_MAX - b) { return GUF_MATH_CKD_OVERFLOW; @@ -218,7 +405,7 @@ static inline guf_math_ckd_result guf_ckd_add_i32(int32_t a, int32_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_sub_i32(int32_t a, int32_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_i32(int32_t a, int32_t b) { if (b < 0 && a > INT32_MAX + b) { return GUF_MATH_CKD_OVERFLOW; @@ -228,7 +415,7 @@ static inline guf_math_ckd_result guf_ckd_sub_i32(int32_t a, int32_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_mul_i32(int32_t a, int32_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_i32(int32_t a, int32_t b) { if (b > 0) { if (a > INT32_MAX / b) { @@ -253,7 +440,7 @@ static inline guf_math_ckd_result guf_ckd_mul_i32(int32_t a, int32_t b) } } -static inline guf_math_ckd_result guf_ckd_add_i64(int64_t a, int64_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_i64(int64_t a, int64_t b) { if (b > 0 && a > INT64_MAX - b) { return GUF_MATH_CKD_OVERFLOW; @@ -263,7 +450,7 @@ static inline guf_math_ckd_result guf_ckd_add_i64(int64_t a, int64_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_sub_i64(int64_t a, int64_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_i64(int64_t a, int64_t b) { if (b < 0 && a > INT64_MAX + b) { return GUF_MATH_CKD_OVERFLOW; @@ -273,7 +460,7 @@ static inline guf_math_ckd_result guf_ckd_sub_i64(int64_t a, int64_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_mul_i64(int64_t a, int64_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_i64(int64_t a, int64_t b) { if (b > 0) { if (a > INT64_MAX / b) { @@ -298,7 +485,7 @@ static inline guf_math_ckd_result guf_ckd_mul_i64(int64_t a, int64_t b) } } -static inline guf_math_ckd_result guf_ckd_add_ptrdiff_t(ptrdiff_t a, ptrdiff_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_ptrdiff_t(ptrdiff_t a, ptrdiff_t b) { if (b > 0 && a > PTRDIFF_MAX - b) { return GUF_MATH_CKD_OVERFLOW; @@ -308,7 +495,7 @@ static inline guf_math_ckd_result guf_ckd_add_ptrdiff_t(ptrdiff_t a, ptrdiff_t b return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_sub_ptrdiff_t(ptrdiff_t a, ptrdiff_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_ptrdiff_t(ptrdiff_t a, ptrdiff_t b) { if (b < 0 && a > PTRDIFF_MAX + b) { return GUF_MATH_CKD_OVERFLOW; @@ -318,7 +505,7 @@ static inline guf_math_ckd_result guf_ckd_sub_ptrdiff_t(ptrdiff_t a, ptrdiff_t b return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_mul_ptrdiff_t(ptrdiff_t a, ptrdiff_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_ptrdiff_t(ptrdiff_t a, ptrdiff_t b) { if (b > 0) { if (a > PTRDIFF_MAX / b) { @@ -343,9 +530,9 @@ static inline guf_math_ckd_result guf_ckd_mul_ptrdiff_t(ptrdiff_t a, ptrdiff_t b } } -// Unsigned integer add/sub checks (generated with libguf/tools/ckdint-gen.py) +// Unsigned integer arithmetic checks (generated with libguf/tools/ckdint-gen.py) -static inline guf_math_ckd_result guf_ckd_add_uchar(unsigned char a, unsigned char b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_uchar(unsigned char a, unsigned char b) { if (b > 0 && a > UCHAR_MAX - b) { return GUF_MATH_CKD_OVERFLOW; @@ -353,7 +540,7 @@ static inline guf_math_ckd_result guf_ckd_add_uchar(unsigned char a, unsigned ch return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_sub_uchar(unsigned char a, unsigned char b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_uchar(unsigned char a, unsigned char b) { if (b > a) { return GUF_MATH_CKD_UNDERFLOW; @@ -361,13 +548,13 @@ static inline guf_math_ckd_result guf_ckd_sub_uchar(unsigned char a, unsigned ch return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_mul_uchar(unsigned char a, unsigned char b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_uchar(unsigned char a, unsigned char b) { const unsigned char c = a * b; return a != 0 && ((c / a) != b) ? GUF_MATH_CKD_OVERFLOW : GUF_MATH_CKD_SUCCESS; } -static inline guf_math_ckd_result guf_ckd_add_unsigned(unsigned a, unsigned b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_unsigned(unsigned a, unsigned b) { if (b > 0 && a > UINT_MAX - b) { return GUF_MATH_CKD_OVERFLOW; @@ -375,7 +562,7 @@ static inline guf_math_ckd_result guf_ckd_add_unsigned(unsigned a, unsigned b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_sub_unsigned(unsigned a, unsigned b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_unsigned(unsigned a, unsigned b) { if (b > a) { return GUF_MATH_CKD_UNDERFLOW; @@ -383,13 +570,13 @@ static inline guf_math_ckd_result guf_ckd_sub_unsigned(unsigned a, unsigned b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_mul_unsigned(unsigned a, unsigned b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_unsigned(unsigned a, unsigned b) { const unsigned c = a * b; return a != 0 && ((c / a) != b) ? GUF_MATH_CKD_OVERFLOW : GUF_MATH_CKD_SUCCESS; } -static inline guf_math_ckd_result guf_ckd_add_u8(uint8_t a, uint8_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_u8(uint8_t a, uint8_t b) { if (b > 0 && a > UINT8_MAX - b) { return GUF_MATH_CKD_OVERFLOW; @@ -397,7 +584,7 @@ static inline guf_math_ckd_result guf_ckd_add_u8(uint8_t a, uint8_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_sub_u8(uint8_t a, uint8_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_u8(uint8_t a, uint8_t b) { if (b > a) { return GUF_MATH_CKD_UNDERFLOW; @@ -405,13 +592,13 @@ static inline guf_math_ckd_result guf_ckd_sub_u8(uint8_t a, uint8_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_mul_u8(uint8_t a, uint8_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_u8(uint8_t a, uint8_t b) { const uint8_t c = a * b; return a != 0 && ((c / a) != b) ? GUF_MATH_CKD_OVERFLOW : GUF_MATH_CKD_SUCCESS; } -static inline guf_math_ckd_result guf_ckd_add_u16(uint16_t a, uint16_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_u16(uint16_t a, uint16_t b) { if (b > 0 && a > UINT16_MAX - b) { return GUF_MATH_CKD_OVERFLOW; @@ -419,7 +606,7 @@ static inline guf_math_ckd_result guf_ckd_add_u16(uint16_t a, uint16_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_sub_u16(uint16_t a, uint16_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_u16(uint16_t a, uint16_t b) { if (b > a) { return GUF_MATH_CKD_UNDERFLOW; @@ -427,13 +614,13 @@ static inline guf_math_ckd_result guf_ckd_sub_u16(uint16_t a, uint16_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_mul_u16(uint16_t a, uint16_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_u16(uint16_t a, uint16_t b) { const uint16_t c = a * b; return a != 0 && ((c / a) != b) ? GUF_MATH_CKD_OVERFLOW : GUF_MATH_CKD_SUCCESS; } -static inline guf_math_ckd_result guf_ckd_add_u32(uint32_t a, uint32_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_u32(uint32_t a, uint32_t b) { if (b > 0 && a > UINT32_MAX - b) { return GUF_MATH_CKD_OVERFLOW; @@ -441,7 +628,7 @@ static inline guf_math_ckd_result guf_ckd_add_u32(uint32_t a, uint32_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_sub_u32(uint32_t a, uint32_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_u32(uint32_t a, uint32_t b) { if (b > a) { return GUF_MATH_CKD_UNDERFLOW; @@ -449,13 +636,13 @@ static inline guf_math_ckd_result guf_ckd_sub_u32(uint32_t a, uint32_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_mul_u32(uint32_t a, uint32_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_u32(uint32_t a, uint32_t b) { const uint32_t c = a * b; return a != 0 && ((c / a) != b) ? GUF_MATH_CKD_OVERFLOW : GUF_MATH_CKD_SUCCESS; } -static inline guf_math_ckd_result guf_ckd_add_u64(uint64_t a, uint64_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_u64(uint64_t a, uint64_t b) { if (b > 0 && a > UINT64_MAX - b) { return GUF_MATH_CKD_OVERFLOW; @@ -463,7 +650,7 @@ static inline guf_math_ckd_result guf_ckd_add_u64(uint64_t a, uint64_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_sub_u64(uint64_t a, uint64_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_u64(uint64_t a, uint64_t b) { if (b > a) { return GUF_MATH_CKD_UNDERFLOW; @@ -471,13 +658,13 @@ static inline guf_math_ckd_result guf_ckd_sub_u64(uint64_t a, uint64_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_mul_u64(uint64_t a, uint64_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_u64(uint64_t a, uint64_t b) { const uint64_t c = a * b; return a != 0 && ((c / a) != b) ? GUF_MATH_CKD_OVERFLOW : GUF_MATH_CKD_SUCCESS; } -static inline guf_math_ckd_result guf_ckd_add_size_t(size_t a, size_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_size_t(size_t a, size_t b) { if (b > 0 && a > SIZE_MAX - b) { return GUF_MATH_CKD_OVERFLOW; @@ -485,7 +672,7 @@ static inline guf_math_ckd_result guf_ckd_add_size_t(size_t a, size_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_sub_size_t(size_t a, size_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_size_t(size_t a, size_t b) { if (b > a) { return GUF_MATH_CKD_UNDERFLOW; @@ -493,16 +680,16 @@ static inline guf_math_ckd_result guf_ckd_sub_size_t(size_t a, size_t b) return GUF_MATH_CKD_SUCCESS; } } -static inline guf_math_ckd_result guf_ckd_mul_size_t(size_t a, size_t b) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_size_t(size_t a, size_t b) { const size_t c = a * b; return a != 0 && ((c / a) != b) ? GUF_MATH_CKD_OVERFLOW : GUF_MATH_CKD_SUCCESS; } -// Signed saturating/wrapping add/sub (generated with libguf/tools/ckdint-gen.py) +// Signed saturating/wrapping arithmetic (generated with libguf/tools/ckdint-gen.py) -static inline guf_math_ckd_result guf_saturating_add_int(int a, int b, int *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_int(int a, int b, int *result) { const guf_math_ckd_result check = guf_ckd_add_int(a, b); if (result) { @@ -522,7 +709,7 @@ static inline guf_math_ckd_result guf_saturating_add_int(int a, int b, int *resu } return check; } -static inline guf_math_ckd_result guf_saturating_sub_int(int a, int b, int *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_int(int a, int b, int *result) { const guf_math_ckd_result check = guf_ckd_sub_int(a, b); if (result) { @@ -542,7 +729,7 @@ static inline guf_math_ckd_result guf_saturating_sub_int(int a, int b, int *resu } return check; } -static inline guf_math_ckd_result guf_saturating_mul_int(int a, int b, int *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_int(int a, int b, int *result) { const guf_math_ckd_result check = guf_ckd_mul_int(a, b); if (result) { @@ -563,7 +750,7 @@ static inline guf_math_ckd_result guf_saturating_mul_int(int a, int b, int *resu return check; } -static inline guf_math_ckd_result guf_wrapping_add_int(int a, int b, int *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_int(int a, int b, int *result) { const guf_math_ckd_result check = guf_ckd_add_int(a, b); if (result) { @@ -583,7 +770,7 @@ static inline guf_math_ckd_result guf_wrapping_add_int(int a, int b, int *result } return check; } -static inline guf_math_ckd_result guf_wrapping_sub_int(int a, int b, int *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_int(int a, int b, int *result) { const guf_math_ckd_result check = guf_ckd_sub_int(a, b); if (result) { @@ -605,7 +792,7 @@ static inline guf_math_ckd_result guf_wrapping_sub_int(int a, int b, int *result } return check; } -static inline guf_math_ckd_result guf_wrapping_mul_int(int a, int b, int *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_int(int a, int b, int *result) { const guf_math_ckd_result check = guf_ckd_mul_int(a, b); if (result) { @@ -625,7 +812,7 @@ static inline guf_math_ckd_result guf_wrapping_mul_int(int a, int b, int *result } -static inline guf_math_ckd_result guf_saturating_add_i8(int8_t a, int8_t b, int8_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_i8(int8_t a, int8_t b, int8_t *result) { const guf_math_ckd_result check = guf_ckd_add_i8(a, b); if (result) { @@ -645,7 +832,7 @@ static inline guf_math_ckd_result guf_saturating_add_i8(int8_t a, int8_t b, int8 } return check; } -static inline guf_math_ckd_result guf_saturating_sub_i8(int8_t a, int8_t b, int8_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_i8(int8_t a, int8_t b, int8_t *result) { const guf_math_ckd_result check = guf_ckd_sub_i8(a, b); if (result) { @@ -665,7 +852,7 @@ static inline guf_math_ckd_result guf_saturating_sub_i8(int8_t a, int8_t b, int8 } return check; } -static inline guf_math_ckd_result guf_saturating_mul_i8(int8_t a, int8_t b, int8_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_i8(int8_t a, int8_t b, int8_t *result) { const guf_math_ckd_result check = guf_ckd_mul_i8(a, b); if (result) { @@ -686,7 +873,7 @@ static inline guf_math_ckd_result guf_saturating_mul_i8(int8_t a, int8_t b, int8 return check; } -static inline guf_math_ckd_result guf_wrapping_add_i8(int8_t a, int8_t b, int8_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_i8(int8_t a, int8_t b, int8_t *result) { const guf_math_ckd_result check = guf_ckd_add_i8(a, b); if (result) { @@ -706,7 +893,7 @@ static inline guf_math_ckd_result guf_wrapping_add_i8(int8_t a, int8_t b, int8_t } return check; } -static inline guf_math_ckd_result guf_wrapping_sub_i8(int8_t a, int8_t b, int8_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_i8(int8_t a, int8_t b, int8_t *result) { const guf_math_ckd_result check = guf_ckd_sub_i8(a, b); if (result) { @@ -728,7 +915,7 @@ static inline guf_math_ckd_result guf_wrapping_sub_i8(int8_t a, int8_t b, int8_t } return check; } -static inline guf_math_ckd_result guf_wrapping_mul_i8(int8_t a, int8_t b, int8_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_i8(int8_t a, int8_t b, int8_t *result) { const guf_math_ckd_result check = guf_ckd_mul_i8(a, b); if (result) { @@ -748,7 +935,7 @@ static inline guf_math_ckd_result guf_wrapping_mul_i8(int8_t a, int8_t b, int8_t } -static inline guf_math_ckd_result guf_saturating_add_i16(int16_t a, int16_t b, int16_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_i16(int16_t a, int16_t b, int16_t *result) { const guf_math_ckd_result check = guf_ckd_add_i16(a, b); if (result) { @@ -768,7 +955,7 @@ static inline guf_math_ckd_result guf_saturating_add_i16(int16_t a, int16_t b, i } return check; } -static inline guf_math_ckd_result guf_saturating_sub_i16(int16_t a, int16_t b, int16_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_i16(int16_t a, int16_t b, int16_t *result) { const guf_math_ckd_result check = guf_ckd_sub_i16(a, b); if (result) { @@ -788,7 +975,7 @@ static inline guf_math_ckd_result guf_saturating_sub_i16(int16_t a, int16_t b, i } return check; } -static inline guf_math_ckd_result guf_saturating_mul_i16(int16_t a, int16_t b, int16_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_i16(int16_t a, int16_t b, int16_t *result) { const guf_math_ckd_result check = guf_ckd_mul_i16(a, b); if (result) { @@ -809,7 +996,7 @@ static inline guf_math_ckd_result guf_saturating_mul_i16(int16_t a, int16_t b, i return check; } -static inline guf_math_ckd_result guf_wrapping_add_i16(int16_t a, int16_t b, int16_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_i16(int16_t a, int16_t b, int16_t *result) { const guf_math_ckd_result check = guf_ckd_add_i16(a, b); if (result) { @@ -829,7 +1016,7 @@ static inline guf_math_ckd_result guf_wrapping_add_i16(int16_t a, int16_t b, int } return check; } -static inline guf_math_ckd_result guf_wrapping_sub_i16(int16_t a, int16_t b, int16_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_i16(int16_t a, int16_t b, int16_t *result) { const guf_math_ckd_result check = guf_ckd_sub_i16(a, b); if (result) { @@ -851,7 +1038,7 @@ static inline guf_math_ckd_result guf_wrapping_sub_i16(int16_t a, int16_t b, int } return check; } -static inline guf_math_ckd_result guf_wrapping_mul_i16(int16_t a, int16_t b, int16_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_i16(int16_t a, int16_t b, int16_t *result) { const guf_math_ckd_result check = guf_ckd_mul_i16(a, b); if (result) { @@ -871,7 +1058,7 @@ static inline guf_math_ckd_result guf_wrapping_mul_i16(int16_t a, int16_t b, int } -static inline guf_math_ckd_result guf_saturating_add_i32(int32_t a, int32_t b, int32_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_i32(int32_t a, int32_t b, int32_t *result) { const guf_math_ckd_result check = guf_ckd_add_i32(a, b); if (result) { @@ -891,7 +1078,7 @@ static inline guf_math_ckd_result guf_saturating_add_i32(int32_t a, int32_t b, i } return check; } -static inline guf_math_ckd_result guf_saturating_sub_i32(int32_t a, int32_t b, int32_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_i32(int32_t a, int32_t b, int32_t *result) { const guf_math_ckd_result check = guf_ckd_sub_i32(a, b); if (result) { @@ -911,7 +1098,7 @@ static inline guf_math_ckd_result guf_saturating_sub_i32(int32_t a, int32_t b, i } return check; } -static inline guf_math_ckd_result guf_saturating_mul_i32(int32_t a, int32_t b, int32_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_i32(int32_t a, int32_t b, int32_t *result) { const guf_math_ckd_result check = guf_ckd_mul_i32(a, b); if (result) { @@ -932,7 +1119,7 @@ static inline guf_math_ckd_result guf_saturating_mul_i32(int32_t a, int32_t b, i return check; } -static inline guf_math_ckd_result guf_wrapping_add_i32(int32_t a, int32_t b, int32_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_i32(int32_t a, int32_t b, int32_t *result) { const guf_math_ckd_result check = guf_ckd_add_i32(a, b); if (result) { @@ -952,7 +1139,7 @@ static inline guf_math_ckd_result guf_wrapping_add_i32(int32_t a, int32_t b, int } return check; } -static inline guf_math_ckd_result guf_wrapping_sub_i32(int32_t a, int32_t b, int32_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_i32(int32_t a, int32_t b, int32_t *result) { const guf_math_ckd_result check = guf_ckd_sub_i32(a, b); if (result) { @@ -974,7 +1161,7 @@ static inline guf_math_ckd_result guf_wrapping_sub_i32(int32_t a, int32_t b, int } return check; } -static inline guf_math_ckd_result guf_wrapping_mul_i32(int32_t a, int32_t b, int32_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_i32(int32_t a, int32_t b, int32_t *result) { const guf_math_ckd_result check = guf_ckd_mul_i32(a, b); if (result) { @@ -994,7 +1181,7 @@ static inline guf_math_ckd_result guf_wrapping_mul_i32(int32_t a, int32_t b, int } -static inline guf_math_ckd_result guf_saturating_add_i64(int64_t a, int64_t b, int64_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_i64(int64_t a, int64_t b, int64_t *result) { const guf_math_ckd_result check = guf_ckd_add_i64(a, b); if (result) { @@ -1014,7 +1201,7 @@ static inline guf_math_ckd_result guf_saturating_add_i64(int64_t a, int64_t b, i } return check; } -static inline guf_math_ckd_result guf_saturating_sub_i64(int64_t a, int64_t b, int64_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_i64(int64_t a, int64_t b, int64_t *result) { const guf_math_ckd_result check = guf_ckd_sub_i64(a, b); if (result) { @@ -1034,7 +1221,7 @@ static inline guf_math_ckd_result guf_saturating_sub_i64(int64_t a, int64_t b, i } return check; } -static inline guf_math_ckd_result guf_saturating_mul_i64(int64_t a, int64_t b, int64_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_i64(int64_t a, int64_t b, int64_t *result) { const guf_math_ckd_result check = guf_ckd_mul_i64(a, b); if (result) { @@ -1055,7 +1242,7 @@ static inline guf_math_ckd_result guf_saturating_mul_i64(int64_t a, int64_t b, i return check; } -static inline guf_math_ckd_result guf_wrapping_add_i64(int64_t a, int64_t b, int64_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_i64(int64_t a, int64_t b, int64_t *result) { const guf_math_ckd_result check = guf_ckd_add_i64(a, b); if (result) { @@ -1075,7 +1262,7 @@ static inline guf_math_ckd_result guf_wrapping_add_i64(int64_t a, int64_t b, int } return check; } -static inline guf_math_ckd_result guf_wrapping_sub_i64(int64_t a, int64_t b, int64_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_i64(int64_t a, int64_t b, int64_t *result) { const guf_math_ckd_result check = guf_ckd_sub_i64(a, b); if (result) { @@ -1097,7 +1284,7 @@ static inline guf_math_ckd_result guf_wrapping_sub_i64(int64_t a, int64_t b, int } return check; } -static inline guf_math_ckd_result guf_wrapping_mul_i64(int64_t a, int64_t b, int64_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_i64(int64_t a, int64_t b, int64_t *result) { const guf_math_ckd_result check = guf_ckd_mul_i64(a, b); if (result) { @@ -1117,7 +1304,7 @@ static inline guf_math_ckd_result guf_wrapping_mul_i64(int64_t a, int64_t b, int } -static inline guf_math_ckd_result guf_saturating_add_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result) { const guf_math_ckd_result check = guf_ckd_add_ptrdiff_t(a, b); if (result) { @@ -1137,7 +1324,7 @@ static inline guf_math_ckd_result guf_saturating_add_ptrdiff_t(ptrdiff_t a, ptrd } return check; } -static inline guf_math_ckd_result guf_saturating_sub_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result) { const guf_math_ckd_result check = guf_ckd_sub_ptrdiff_t(a, b); if (result) { @@ -1157,7 +1344,7 @@ static inline guf_math_ckd_result guf_saturating_sub_ptrdiff_t(ptrdiff_t a, ptrd } return check; } -static inline guf_math_ckd_result guf_saturating_mul_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result) { const guf_math_ckd_result check = guf_ckd_mul_ptrdiff_t(a, b); if (result) { @@ -1178,7 +1365,7 @@ static inline guf_math_ckd_result guf_saturating_mul_ptrdiff_t(ptrdiff_t a, ptrd return check; } -static inline guf_math_ckd_result guf_wrapping_add_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result) { const guf_math_ckd_result check = guf_ckd_add_ptrdiff_t(a, b); if (result) { @@ -1198,7 +1385,7 @@ static inline guf_math_ckd_result guf_wrapping_add_ptrdiff_t(ptrdiff_t a, ptrdif } return check; } -static inline guf_math_ckd_result guf_wrapping_sub_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result) { const guf_math_ckd_result check = guf_ckd_sub_ptrdiff_t(a, b); if (result) { @@ -1220,7 +1407,7 @@ static inline guf_math_ckd_result guf_wrapping_sub_ptrdiff_t(ptrdiff_t a, ptrdif } return check; } -static inline guf_math_ckd_result guf_wrapping_mul_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_ptrdiff_t(ptrdiff_t a, ptrdiff_t b, ptrdiff_t *result) { const guf_math_ckd_result check = guf_ckd_mul_ptrdiff_t(a, b); if (result) { @@ -1240,9 +1427,9 @@ static inline guf_math_ckd_result guf_wrapping_mul_ptrdiff_t(ptrdiff_t a, ptrdif } -// Unsigned saturating/wrapping add/sub (generated with libguf/tools/ckdint-gen.py) +// Unsigned saturating/wrapping arithmetic (generated with libguf/tools/ckdint-gen.py) -static inline guf_math_ckd_result guf_saturating_add_uchar(unsigned char a, unsigned char b, unsigned char *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_uchar(unsigned char a, unsigned char b, unsigned char *result) { const guf_math_ckd_result check = guf_ckd_add_uchar(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1260,7 +1447,7 @@ static inline guf_math_ckd_result guf_saturating_add_uchar(unsigned char a, unsi } return check; } -static inline guf_math_ckd_result guf_saturating_sub_uchar(unsigned char a, unsigned char b, unsigned char *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_uchar(unsigned char a, unsigned char b, unsigned char *result) { const guf_math_ckd_result check = guf_ckd_sub_uchar(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_UNDERFLOW); @@ -1278,7 +1465,7 @@ static inline guf_math_ckd_result guf_saturating_sub_uchar(unsigned char a, unsi } return check; } -static inline guf_math_ckd_result guf_saturating_mul_uchar(unsigned char a, unsigned char b, unsigned char *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_uchar(unsigned char a, unsigned char b, unsigned char *result) { const guf_math_ckd_result check = guf_ckd_mul_uchar(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1297,7 +1484,7 @@ static inline guf_math_ckd_result guf_saturating_mul_uchar(unsigned char a, unsi return check; } -static inline guf_math_ckd_result guf_wrapping_add_uchar(unsigned char a, unsigned char b, unsigned char *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_uchar(unsigned char a, unsigned char b, unsigned char *result) { const guf_math_ckd_result check = guf_ckd_add_uchar(a, b); if (result) { @@ -1305,7 +1492,7 @@ static inline guf_math_ckd_result guf_wrapping_add_uchar(unsigned char a, unsign } return check; } -static inline guf_math_ckd_result guf_wrapping_sub_uchar(unsigned char a, unsigned char b, unsigned char *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_uchar(unsigned char a, unsigned char b, unsigned char *result) { const guf_math_ckd_result check = guf_ckd_sub_uchar(a, b); if (result) { @@ -1313,7 +1500,7 @@ static inline guf_math_ckd_result guf_wrapping_sub_uchar(unsigned char a, unsign } return check; } -static inline guf_math_ckd_result guf_wrapping_mul_uchar(unsigned char a, unsigned char b, unsigned char *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_uchar(unsigned char a, unsigned char b, unsigned char *result) { const guf_math_ckd_result check = guf_ckd_mul_uchar(a, b); if (result) { @@ -1323,7 +1510,7 @@ static inline guf_math_ckd_result guf_wrapping_mul_uchar(unsigned char a, unsign } -static inline guf_math_ckd_result guf_saturating_add_unsigned(unsigned a, unsigned b, unsigned *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_unsigned(unsigned a, unsigned b, unsigned *result) { const guf_math_ckd_result check = guf_ckd_add_unsigned(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1341,7 +1528,7 @@ static inline guf_math_ckd_result guf_saturating_add_unsigned(unsigned a, unsign } return check; } -static inline guf_math_ckd_result guf_saturating_sub_unsigned(unsigned a, unsigned b, unsigned *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_unsigned(unsigned a, unsigned b, unsigned *result) { const guf_math_ckd_result check = guf_ckd_sub_unsigned(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_UNDERFLOW); @@ -1359,7 +1546,7 @@ static inline guf_math_ckd_result guf_saturating_sub_unsigned(unsigned a, unsign } return check; } -static inline guf_math_ckd_result guf_saturating_mul_unsigned(unsigned a, unsigned b, unsigned *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_unsigned(unsigned a, unsigned b, unsigned *result) { const guf_math_ckd_result check = guf_ckd_mul_unsigned(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1378,7 +1565,7 @@ static inline guf_math_ckd_result guf_saturating_mul_unsigned(unsigned a, unsign return check; } -static inline guf_math_ckd_result guf_wrapping_add_unsigned(unsigned a, unsigned b, unsigned *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_unsigned(unsigned a, unsigned b, unsigned *result) { const guf_math_ckd_result check = guf_ckd_add_unsigned(a, b); if (result) { @@ -1386,7 +1573,7 @@ static inline guf_math_ckd_result guf_wrapping_add_unsigned(unsigned a, unsigned } return check; } -static inline guf_math_ckd_result guf_wrapping_sub_unsigned(unsigned a, unsigned b, unsigned *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_unsigned(unsigned a, unsigned b, unsigned *result) { const guf_math_ckd_result check = guf_ckd_sub_unsigned(a, b); if (result) { @@ -1394,7 +1581,7 @@ static inline guf_math_ckd_result guf_wrapping_sub_unsigned(unsigned a, unsigned } return check; } -static inline guf_math_ckd_result guf_wrapping_mul_unsigned(unsigned a, unsigned b, unsigned *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_unsigned(unsigned a, unsigned b, unsigned *result) { const guf_math_ckd_result check = guf_ckd_mul_unsigned(a, b); if (result) { @@ -1404,7 +1591,7 @@ static inline guf_math_ckd_result guf_wrapping_mul_unsigned(unsigned a, unsigned } -static inline guf_math_ckd_result guf_saturating_add_u8(uint8_t a, uint8_t b, uint8_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_u8(uint8_t a, uint8_t b, uint8_t *result) { const guf_math_ckd_result check = guf_ckd_add_u8(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1422,7 +1609,7 @@ static inline guf_math_ckd_result guf_saturating_add_u8(uint8_t a, uint8_t b, ui } return check; } -static inline guf_math_ckd_result guf_saturating_sub_u8(uint8_t a, uint8_t b, uint8_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_u8(uint8_t a, uint8_t b, uint8_t *result) { const guf_math_ckd_result check = guf_ckd_sub_u8(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_UNDERFLOW); @@ -1440,7 +1627,7 @@ static inline guf_math_ckd_result guf_saturating_sub_u8(uint8_t a, uint8_t b, ui } return check; } -static inline guf_math_ckd_result guf_saturating_mul_u8(uint8_t a, uint8_t b, uint8_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_u8(uint8_t a, uint8_t b, uint8_t *result) { const guf_math_ckd_result check = guf_ckd_mul_u8(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1459,7 +1646,7 @@ static inline guf_math_ckd_result guf_saturating_mul_u8(uint8_t a, uint8_t b, ui return check; } -static inline guf_math_ckd_result guf_wrapping_add_u8(uint8_t a, uint8_t b, uint8_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_u8(uint8_t a, uint8_t b, uint8_t *result) { const guf_math_ckd_result check = guf_ckd_add_u8(a, b); if (result) { @@ -1467,7 +1654,7 @@ static inline guf_math_ckd_result guf_wrapping_add_u8(uint8_t a, uint8_t b, uint } return check; } -static inline guf_math_ckd_result guf_wrapping_sub_u8(uint8_t a, uint8_t b, uint8_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_u8(uint8_t a, uint8_t b, uint8_t *result) { const guf_math_ckd_result check = guf_ckd_sub_u8(a, b); if (result) { @@ -1475,7 +1662,7 @@ static inline guf_math_ckd_result guf_wrapping_sub_u8(uint8_t a, uint8_t b, uint } return check; } -static inline guf_math_ckd_result guf_wrapping_mul_u8(uint8_t a, uint8_t b, uint8_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_u8(uint8_t a, uint8_t b, uint8_t *result) { const guf_math_ckd_result check = guf_ckd_mul_u8(a, b); if (result) { @@ -1485,7 +1672,7 @@ static inline guf_math_ckd_result guf_wrapping_mul_u8(uint8_t a, uint8_t b, uint } -static inline guf_math_ckd_result guf_saturating_add_u16(uint16_t a, uint16_t b, uint16_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_u16(uint16_t a, uint16_t b, uint16_t *result) { const guf_math_ckd_result check = guf_ckd_add_u16(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1503,7 +1690,7 @@ static inline guf_math_ckd_result guf_saturating_add_u16(uint16_t a, uint16_t b, } return check; } -static inline guf_math_ckd_result guf_saturating_sub_u16(uint16_t a, uint16_t b, uint16_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_u16(uint16_t a, uint16_t b, uint16_t *result) { const guf_math_ckd_result check = guf_ckd_sub_u16(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_UNDERFLOW); @@ -1521,7 +1708,7 @@ static inline guf_math_ckd_result guf_saturating_sub_u16(uint16_t a, uint16_t b, } return check; } -static inline guf_math_ckd_result guf_saturating_mul_u16(uint16_t a, uint16_t b, uint16_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_u16(uint16_t a, uint16_t b, uint16_t *result) { const guf_math_ckd_result check = guf_ckd_mul_u16(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1540,7 +1727,7 @@ static inline guf_math_ckd_result guf_saturating_mul_u16(uint16_t a, uint16_t b, return check; } -static inline guf_math_ckd_result guf_wrapping_add_u16(uint16_t a, uint16_t b, uint16_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_u16(uint16_t a, uint16_t b, uint16_t *result) { const guf_math_ckd_result check = guf_ckd_add_u16(a, b); if (result) { @@ -1548,7 +1735,7 @@ static inline guf_math_ckd_result guf_wrapping_add_u16(uint16_t a, uint16_t b, u } return check; } -static inline guf_math_ckd_result guf_wrapping_sub_u16(uint16_t a, uint16_t b, uint16_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_u16(uint16_t a, uint16_t b, uint16_t *result) { const guf_math_ckd_result check = guf_ckd_sub_u16(a, b); if (result) { @@ -1556,7 +1743,7 @@ static inline guf_math_ckd_result guf_wrapping_sub_u16(uint16_t a, uint16_t b, u } return check; } -static inline guf_math_ckd_result guf_wrapping_mul_u16(uint16_t a, uint16_t b, uint16_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_u16(uint16_t a, uint16_t b, uint16_t *result) { const guf_math_ckd_result check = guf_ckd_mul_u16(a, b); if (result) { @@ -1566,7 +1753,7 @@ static inline guf_math_ckd_result guf_wrapping_mul_u16(uint16_t a, uint16_t b, u } -static inline guf_math_ckd_result guf_saturating_add_u32(uint32_t a, uint32_t b, uint32_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_u32(uint32_t a, uint32_t b, uint32_t *result) { const guf_math_ckd_result check = guf_ckd_add_u32(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1584,7 +1771,7 @@ static inline guf_math_ckd_result guf_saturating_add_u32(uint32_t a, uint32_t b, } return check; } -static inline guf_math_ckd_result guf_saturating_sub_u32(uint32_t a, uint32_t b, uint32_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_u32(uint32_t a, uint32_t b, uint32_t *result) { const guf_math_ckd_result check = guf_ckd_sub_u32(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_UNDERFLOW); @@ -1602,7 +1789,7 @@ static inline guf_math_ckd_result guf_saturating_sub_u32(uint32_t a, uint32_t b, } return check; } -static inline guf_math_ckd_result guf_saturating_mul_u32(uint32_t a, uint32_t b, uint32_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_u32(uint32_t a, uint32_t b, uint32_t *result) { const guf_math_ckd_result check = guf_ckd_mul_u32(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1621,7 +1808,7 @@ static inline guf_math_ckd_result guf_saturating_mul_u32(uint32_t a, uint32_t b, return check; } -static inline guf_math_ckd_result guf_wrapping_add_u32(uint32_t a, uint32_t b, uint32_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_u32(uint32_t a, uint32_t b, uint32_t *result) { const guf_math_ckd_result check = guf_ckd_add_u32(a, b); if (result) { @@ -1629,7 +1816,7 @@ static inline guf_math_ckd_result guf_wrapping_add_u32(uint32_t a, uint32_t b, u } return check; } -static inline guf_math_ckd_result guf_wrapping_sub_u32(uint32_t a, uint32_t b, uint32_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_u32(uint32_t a, uint32_t b, uint32_t *result) { const guf_math_ckd_result check = guf_ckd_sub_u32(a, b); if (result) { @@ -1637,7 +1824,7 @@ static inline guf_math_ckd_result guf_wrapping_sub_u32(uint32_t a, uint32_t b, u } return check; } -static inline guf_math_ckd_result guf_wrapping_mul_u32(uint32_t a, uint32_t b, uint32_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_u32(uint32_t a, uint32_t b, uint32_t *result) { const guf_math_ckd_result check = guf_ckd_mul_u32(a, b); if (result) { @@ -1647,7 +1834,7 @@ static inline guf_math_ckd_result guf_wrapping_mul_u32(uint32_t a, uint32_t b, u } -static inline guf_math_ckd_result guf_saturating_add_u64(uint64_t a, uint64_t b, uint64_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_u64(uint64_t a, uint64_t b, uint64_t *result) { const guf_math_ckd_result check = guf_ckd_add_u64(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1665,7 +1852,7 @@ static inline guf_math_ckd_result guf_saturating_add_u64(uint64_t a, uint64_t b, } return check; } -static inline guf_math_ckd_result guf_saturating_sub_u64(uint64_t a, uint64_t b, uint64_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_u64(uint64_t a, uint64_t b, uint64_t *result) { const guf_math_ckd_result check = guf_ckd_sub_u64(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_UNDERFLOW); @@ -1683,7 +1870,7 @@ static inline guf_math_ckd_result guf_saturating_sub_u64(uint64_t a, uint64_t b, } return check; } -static inline guf_math_ckd_result guf_saturating_mul_u64(uint64_t a, uint64_t b, uint64_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_u64(uint64_t a, uint64_t b, uint64_t *result) { const guf_math_ckd_result check = guf_ckd_mul_u64(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1702,7 +1889,7 @@ static inline guf_math_ckd_result guf_saturating_mul_u64(uint64_t a, uint64_t b, return check; } -static inline guf_math_ckd_result guf_wrapping_add_u64(uint64_t a, uint64_t b, uint64_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_u64(uint64_t a, uint64_t b, uint64_t *result) { const guf_math_ckd_result check = guf_ckd_add_u64(a, b); if (result) { @@ -1710,7 +1897,7 @@ static inline guf_math_ckd_result guf_wrapping_add_u64(uint64_t a, uint64_t b, u } return check; } -static inline guf_math_ckd_result guf_wrapping_sub_u64(uint64_t a, uint64_t b, uint64_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_u64(uint64_t a, uint64_t b, uint64_t *result) { const guf_math_ckd_result check = guf_ckd_sub_u64(a, b); if (result) { @@ -1718,7 +1905,7 @@ static inline guf_math_ckd_result guf_wrapping_sub_u64(uint64_t a, uint64_t b, u } return check; } -static inline guf_math_ckd_result guf_wrapping_mul_u64(uint64_t a, uint64_t b, uint64_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_u64(uint64_t a, uint64_t b, uint64_t *result) { const guf_math_ckd_result check = guf_ckd_mul_u64(a, b); if (result) { @@ -1728,7 +1915,7 @@ static inline guf_math_ckd_result guf_wrapping_mul_u64(uint64_t a, uint64_t b, u } -static inline guf_math_ckd_result guf_saturating_add_size_t(size_t a, size_t b, size_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_size_t(size_t a, size_t b, size_t *result) { const guf_math_ckd_result check = guf_ckd_add_size_t(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1746,7 +1933,7 @@ static inline guf_math_ckd_result guf_saturating_add_size_t(size_t a, size_t b, } return check; } -static inline guf_math_ckd_result guf_saturating_sub_size_t(size_t a, size_t b, size_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_size_t(size_t a, size_t b, size_t *result) { const guf_math_ckd_result check = guf_ckd_sub_size_t(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_UNDERFLOW); @@ -1764,7 +1951,7 @@ static inline guf_math_ckd_result guf_saturating_sub_size_t(size_t a, size_t b, } return check; } -static inline guf_math_ckd_result guf_saturating_mul_size_t(size_t a, size_t b, size_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_size_t(size_t a, size_t b, size_t *result) { const guf_math_ckd_result check = guf_ckd_mul_size_t(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -1783,7 +1970,7 @@ static inline guf_math_ckd_result guf_saturating_mul_size_t(size_t a, size_t b, return check; } -static inline guf_math_ckd_result guf_wrapping_add_size_t(size_t a, size_t b, size_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_size_t(size_t a, size_t b, size_t *result) { const guf_math_ckd_result check = guf_ckd_add_size_t(a, b); if (result) { @@ -1791,7 +1978,7 @@ static inline guf_math_ckd_result guf_wrapping_add_size_t(size_t a, size_t b, si } return check; } -static inline guf_math_ckd_result guf_wrapping_sub_size_t(size_t a, size_t b, size_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_size_t(size_t a, size_t b, size_t *result) { const guf_math_ckd_result check = guf_ckd_sub_size_t(a, b); if (result) { @@ -1799,7 +1986,7 @@ static inline guf_math_ckd_result guf_wrapping_sub_size_t(size_t a, size_t b, si } return check; } -static inline guf_math_ckd_result guf_wrapping_mul_size_t(size_t a, size_t b, size_t *result) +GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_size_t(size_t a, size_t b, size_t *result) { const guf_math_ckd_result check = guf_ckd_mul_size_t(a, b); if (result) { @@ -1809,3 +1996,8 @@ static inline guf_math_ckd_result guf_wrapping_mul_size_t(size_t a, size_t b, si } #endif + +#endif + +#undef GUF_MATH_CKDINT_IMPL +#undef GUF_MATH_CKDINT_IMPL_STATIC diff --git a/src/guf_rand.h b/src/guf_rand.h index 453819a..2935e25 100644 --- a/src/guf_rand.h +++ b/src/guf_rand.h @@ -228,6 +228,7 @@ GUF_RAND_KWRDS double guf_rand32_normal_sample_one_f64(guf_rand32_state *state, #include "guf_common.h" #include "guf_assert.h" #include "guf_math.h" +#define GUF_MATH_CKDINT_IMPL_STATIC #include "guf_math_ckdint.h" #ifdef UINT64_MAX diff --git a/src/guf_str.h b/src/guf_str.h index bb79b0d..a386ad9 100644 --- a/src/guf_str.h +++ b/src/guf_str.h @@ -238,6 +238,7 @@ GUF_STR_KWRDS bool guf_str_is_valid(const guf_str *str); #include "guf_common.h" #include "guf_math.h" +#define GUF_MATH_CKDINT_IMPL_STATIC #include "guf_math_ckdint.h" #include diff --git a/tools/ckdint-gen.py b/tools/ckdint-gen.py index 49bf71a..72ddb9a 100644 --- a/tools/ckdint-gen.py +++ b/tools/ckdint-gen.py @@ -3,6 +3,7 @@ """ from dataclasses import dataclass +from typing import Tuple import textwrap @dataclass @@ -20,10 +21,15 @@ class UintType: INT_MIN: str INT_MAX: str -def generate_ckdint_functions(int_types: list, uint_types: list) -> str: +def generate_ckdint_functions(int_types: list, uint_types: list) -> Tuple[str, str]: + ckd_add_sub_uint_header = textwrap.dedent(""" + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_{type_abbr}({type} a, {type} b); + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_{type_abbr}({type} a, {type} b); + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_{type_abbr}({type} a, {type} b); + """) ckd_add_sub_uint = textwrap.dedent(""" - static inline guf_math_ckd_result guf_ckd_add_{type_abbr}({type} a, {type} b) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_{type_abbr}({type} a, {type} b) {{ if (b > 0 && a > {int_max} - b) {{ return GUF_MATH_CKD_OVERFLOW; @@ -31,7 +37,7 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: return GUF_MATH_CKD_SUCCESS; }} }} - static inline guf_math_ckd_result guf_ckd_sub_{type_abbr}({type} a, {type} b) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_{type_abbr}({type} a, {type} b) {{ if (b > a) {{ return GUF_MATH_CKD_UNDERFLOW; @@ -39,15 +45,21 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: return GUF_MATH_CKD_SUCCESS; }} }} - static inline guf_math_ckd_result guf_ckd_mul_{type_abbr}({type} a, {type} b) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_{type_abbr}({type} a, {type} b) {{ const {type} c = a * b; return a != 0 && ((c / a) != b) ? GUF_MATH_CKD_OVERFLOW : GUF_MATH_CKD_SUCCESS; }} """) + + ckd_add_sub_int_header = textwrap.dedent(""" + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_{type_abbr}({type} a, {type} b); + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_{type_abbr}({type} a, {type} b); + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_{type_abbr}({type} a, {type} b); + """) ckd_add_sub_int = textwrap.dedent(""" - static inline guf_math_ckd_result guf_ckd_add_{type_abbr}({type} a, {type} b) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_add_{type_abbr}({type} a, {type} b) {{ if (b > 0 && a > {int_max} - b) {{ return GUF_MATH_CKD_OVERFLOW; @@ -57,7 +69,7 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: return GUF_MATH_CKD_SUCCESS; }} }} - static inline guf_math_ckd_result guf_ckd_sub_{type_abbr}({type} a, {type} b) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_sub_{type_abbr}({type} a, {type} b) {{ if (b < 0 && a > {int_max} + b) {{ return GUF_MATH_CKD_OVERFLOW; @@ -67,7 +79,7 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: return GUF_MATH_CKD_SUCCESS; }} }} - static inline guf_math_ckd_result guf_ckd_mul_{type_abbr}({type} a, {type} b) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_ckd_mul_{type_abbr}({type} a, {type} b) {{ if (b > 0) {{ if (a > {int_max} / b) {{ @@ -93,8 +105,19 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: }} """) + + + saturating_wrapping_int_header = textwrap.dedent(""" + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_{type_abbr}({type} a, {type} b, {type} *result); + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_{type_abbr}({type} a, {type} b, {type} *result); + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_{type_abbr}({type} a, {type} b, {type} *result); + + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_{type_abbr}({type} a, {type} b, {type} *result); + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_{type_abbr}({type} a, {type} b, {type} *result); + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_{type_abbr}({type} a, {type} b, {type} *result); + """) saturating_wrapping_int = textwrap.dedent(""" - static inline guf_math_ckd_result guf_saturating_add_{type_abbr}({type} a, {type} b, {type} *result) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_{type_abbr}({type} a, {type} b, {type} *result) {{ const guf_math_ckd_result check = guf_ckd_add_{type_abbr}(a, b); if (result) {{ @@ -114,7 +137,7 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: }} return check; }} - static inline guf_math_ckd_result guf_saturating_sub_{type_abbr}({type} a, {type} b, {type} *result) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_{type_abbr}({type} a, {type} b, {type} *result) {{ const guf_math_ckd_result check = guf_ckd_sub_{type_abbr}(a, b); if (result) {{ @@ -134,7 +157,7 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: }} return check; }} - static inline guf_math_ckd_result guf_saturating_mul_{type_abbr}({type} a, {type} b, {type} *result) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_{type_abbr}({type} a, {type} b, {type} *result) {{ const guf_math_ckd_result check = guf_ckd_mul_{type_abbr}(a, b); if (result) {{ @@ -155,7 +178,7 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: return check; }} - static inline guf_math_ckd_result guf_wrapping_add_{type_abbr}({type} a, {type} b, {type} *result) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_{type_abbr}({type} a, {type} b, {type} *result) {{ const guf_math_ckd_result check = guf_ckd_add_{type_abbr}(a, b); if (result) {{ @@ -175,7 +198,7 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: }} return check; }} - static inline guf_math_ckd_result guf_wrapping_sub_{type_abbr}({type} a, {type} b, {type} *result) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_{type_abbr}({type} a, {type} b, {type} *result) {{ const guf_math_ckd_result check = guf_ckd_sub_{type_abbr}(a, b); if (result) {{ @@ -197,7 +220,7 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: }} return check; }} - static inline guf_math_ckd_result guf_wrapping_mul_{type_abbr}({type} a, {type} b, {type} *result) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_{type_abbr}({type} a, {type} b, {type} *result) {{ const guf_math_ckd_result check = guf_ckd_mul_{type_abbr}(a, b); if (result) {{ @@ -217,8 +240,18 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: }} """) + saturating_wrapping_uint_header = textwrap.dedent(""" + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_{type_abbr}({type} a, {type} b, {type} *result); + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_{type_abbr}({type} a, {type} b, {type} *result); + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_{type_abbr}({type} a, {type} b, {type} *result); + + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_{type_abbr}({type} a, {type} b, {type} *result); + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_{type_abbr}({type} a, {type} b, {type} *result); + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_{type_abbr}({type} a, {type} b, {type} *result); + """) + saturating_wrapping_uint = textwrap.dedent(""" - static inline guf_math_ckd_result guf_saturating_add_{type_abbr}({type} a, {type} b, {type} *result) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_add_{type_abbr}({type} a, {type} b, {type} *result) {{ const guf_math_ckd_result check = guf_ckd_add_{type_abbr}(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -236,7 +269,7 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: }} return check; }} - static inline guf_math_ckd_result guf_saturating_sub_{type_abbr}({type} a, {type} b, {type} *result) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_sub_{type_abbr}({type} a, {type} b, {type} *result) {{ const guf_math_ckd_result check = guf_ckd_sub_{type_abbr}(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_UNDERFLOW); @@ -254,7 +287,7 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: }} return check; }} - static inline guf_math_ckd_result guf_saturating_mul_{type_abbr}({type} a, {type} b, {type} *result) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_saturating_mul_{type_abbr}({type} a, {type} b, {type} *result) {{ const guf_math_ckd_result check = guf_ckd_mul_{type_abbr}(a, b); GUF_ASSERT(check == GUF_MATH_CKD_SUCCESS || check == GUF_MATH_CKD_OVERFLOW); @@ -273,7 +306,7 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: return check; }} - static inline guf_math_ckd_result guf_wrapping_add_{type_abbr}({type} a, {type} b, {type} *result) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_add_{type_abbr}({type} a, {type} b, {type} *result) {{ const guf_math_ckd_result check = guf_ckd_add_{type_abbr}(a, b); if (result) {{ @@ -281,7 +314,7 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: }} return check; }} - static inline guf_math_ckd_result guf_wrapping_sub_{type_abbr}({type} a, {type} b, {type} *result) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_sub_{type_abbr}({type} a, {type} b, {type} *result) {{ const guf_math_ckd_result check = guf_ckd_sub_{type_abbr}(a, b); if (result) {{ @@ -289,7 +322,7 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: }} return check; }} - static inline guf_math_ckd_result guf_wrapping_mul_{type_abbr}({type} a, {type} b, {type} *result) + GUF_MATH_CKDINT_KWRDS guf_math_ckd_result guf_wrapping_mul_{type_abbr}({type} a, {type} b, {type} *result) {{ const guf_math_ckd_result check = guf_ckd_mul_{type_abbr}(a, b); if (result) {{ @@ -299,24 +332,31 @@ def generate_ckdint_functions(int_types: list, uint_types: list) -> str: }} """) - text_result = "// Signed integer add/sub checks (generated with libguf/tools/ckdint-gen.py)\n" + text_result = "// Signed integer arithmetic checks (generated with libguf/tools/ckdint-gen.py)\n" + text_result_header = text_result for type in int_types: text_result += ckd_add_sub_int.format(type = type.INT_TYPE, type_abbr = type.INT_TYPE_ABBR, int_min = type.INT_MIN, int_max = type.INT_MAX) + text_result_header += ckd_add_sub_int_header.format(type = type.INT_TYPE, type_abbr = type.INT_TYPE_ABBR, int_min = type.INT_MIN, int_max = type.INT_MAX) - text_result += "\n// Unsigned integer add/sub checks (generated with libguf/tools/ckdint-gen.py) \n" + text_result += "\n// Unsigned integer arithmetic checks (generated with libguf/tools/ckdint-gen.py) \n" + text_result_header += "\n// Unsigned integer arithmetic checks (generated with libguf/tools/ckdint-gen.py) \n" for type in uint_types: text_result += ckd_add_sub_uint.format(type = type.INT_TYPE, type_abbr = type.INT_TYPE_ABBR, int_min = type.INT_MIN, int_max = type.INT_MAX) + text_result_header += ckd_add_sub_uint_header.format(type = type.INT_TYPE, type_abbr = type.INT_TYPE_ABBR, int_min = type.INT_MIN, int_max = type.INT_MAX) - - text_result += "\n\n// Signed saturating/wrapping add/sub (generated with libguf/tools/ckdint-gen.py)\n" + text_result += "\n\n// Signed saturating/wrapping arithmetic (generated with libguf/tools/ckdint-gen.py)\n" + text_result_header += "\n\n// Signed saturating/wrapping arithmetic (generated with libguf/tools/ckdint-gen.py)\n" for type in int_types: text_result += saturating_wrapping_int.format(type = type.INT_TYPE, type_abbr = type.INT_TYPE_ABBR, int_min = type.INT_MIN, int_max = type.INT_MAX, uint_type = type.UINT_TYPE) + "\n" + text_result_header += saturating_wrapping_int_header.format(type = type.INT_TYPE, type_abbr = type.INT_TYPE_ABBR, int_min = type.INT_MIN, int_max = type.INT_MAX, uint_type = type.UINT_TYPE) + "\n" - text_result += "\n// Unsigned saturating/wrapping add/sub (generated with libguf/tools/ckdint-gen.py)\n" + text_result += "\n// Unsigned saturating/wrapping arithmetic (generated with libguf/tools/ckdint-gen.py)\n" + text_result_header += "\n// Unsigned saturating/wrapping arithmetic (generated with libguf/tools/ckdint-gen.py)\n" for type in uint_types: text_result += saturating_wrapping_uint.format(type = type.INT_TYPE, type_abbr = type.INT_TYPE_ABBR, int_min = type.INT_MIN, int_max = type.INT_MAX) + "\n" + text_result_header += saturating_wrapping_uint_header.format(type = type.INT_TYPE, type_abbr = type.INT_TYPE_ABBR, int_min = type.INT_MIN, int_max = type.INT_MAX) + "\n" - return text_result + return (text_result_header, text_result) @@ -341,7 +381,32 @@ if __name__ == "__main__": UintType(INT_TYPE = "size_t", INT_TYPE_ABBR = "size_t", INT_MIN = "0", INT_MAX = "SIZE_MAX"), ] - ckd_fun_code = generate_ckdint_functions(int_types = int_types, uint_types= uint_types) + code_header, code_impl = generate_ckdint_functions(int_types = int_types, uint_types= uint_types) - print(ckd_fun_code) + print(textwrap.dedent( + """ + #if defined(GUF_MATH_CKDINT_IMPL_STATIC) + #define GUF_MATH_CKDINT_KWRDS static inline + #else + #define GUF_MATH_CKDINT_KWRDS + #endif + #ifndef GUF_MATH_CKDINT_H + #define GUF_MATH_CKDINT_H + #include "guf_common.h" + + typedef enum guf_math_ckd_result {GUF_MATH_CKD_SUCCESS = 0, GUF_MATH_CKD_OVERFLOW, GUF_MATH_CKD_UNDERFLOW} guf_math_ckd_result; + +""")) + + print(code_header) + + print("#if defined(GUF_MATH_CKDINT_IMPL) || defined(GUF_MATH_CKDINT_IMPL_STATIC)") + print('#include "guf_assert.h"') + print(code_impl) + print("#endif\n") + + print("#endif") + + print("#undef GUF_MATH_CKDINT_IMPL") + print("#undef GUF_MATH_CKDINT_IMPL_STATIC\n")