Go to the documentation of this file.
48 #if P99_COMPILER & (P99_COMPILER_GNU | P99_COMPILER_OPEN64)
49 # if P99_GCC_VERSION >= 40200UL
50 # pragma GCC diagnostic ignored "-Wmissing-braces"
64 #define P00_DOCUMENT_C2(WIDTH)
68 #define P99X_UINT16_C2(H, L) ((((uint16_t)(uint8_t)H) << 8u) | (uint16_t)(uint8_t)L)
72 #define P99X_INT16_C2(H, L) ((((int16_t)(int8_t)H) << 8u) | (int16_t)(int8_t)L)
76 #define P99X_UINT32_C2(H, L) ((((uint32_t)(uint16_t)H) << 16u) | (uint32_t)(uint16_t)L)
80 #define P99X_INT32_C2(H, L) ((((int32_t)(int16_t)H) << 16u) | (int32_t)(int16_t)L)
84 #define P99X_UINT64_C2(H, L) ((((uint64_t)(uint32_t)H) << 32u) | (uint64_t)(uint32_t)L)
88 #define P99X_INT64_C2(H, L) ((((int64_t)(int32_t)H) << 32u) | (int64_t)(int32_t)L)
93 #define P99X_UINT128_C2(H, L) ((((p99x_uint128)H) << 64u) | (p99x_uint128)L)
94 #define P99X_UINT128_0 P99X_UINT128_C2(0x0000000000000000, 0x0000000000000000)
95 #define P99X_UINT128_MAX P99X_UINT128_C2(0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF)
100 #define P99X_INT128_C2(H, L) ((((p99x_int128)H) << 64u) | (p99x_int128)L)
101 #define P99X_INT128_MAX P99X_INT128_C2(0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF)
102 #define P99X_INT128_MIN P99X_INT128_C2(0x8000000000000000, 0x0000000000000000)
167 #define P99X__SIGN_PROMOTE(EXPR) \
168 ((p99x_uintmax)+P99_SIGN_PROMOTE(P99_UE_MAX(EXPR), (p99x_uintmax)+UINTMAX_MAX))
170 #define P99X__SHIFT(EXPR) \
171 ((P99_SIGN_PROMOTE(P99_UE_MAX(EXPR), UINTMAX_MAX) > (p99x_uintmax)+UINTMAX_MAX) \
177 # if P99_UINTMAX_WIDTH == 64
178 # define P99_HIGH2(X) \
179 ((((X) & P00_B0) ? P00_S0 : 0u) \
180 | (((X) & P00_B1) ? P00_S1 : 0u) \
181 | (((X) & P00_B2) ? P00_S2 : 0u) \
182 | (((X) & P00_B3) ? P00_S3 : 0u) \
183 | (((X) & P00_B4) ? P00_S4 : 0u) \
184 | (((X) & P00_B5) ? P00_S5 : 0u))
188 # if P99_UINTMAX_WIDTH <= 128
189 # define P99_HIGH2(X) \
190 ((((X) & P00_B0) ? P00_S0 : 0u) \
191 | (((X) & P00_B1) ? P00_S1 : 0u) \
192 | (((X) & P00_B2) ? P00_S2 : 0u) \
193 | (((X) & P00_B3) ? P00_S3 : 0u) \
194 | (((X) & P00_B4) ? P00_S4 : 0u) \
195 | (((X) & P00_B5) ? P00_S5 : 0u) \
196 | (((X) & P00_B6) ? P00_S6 : 0u))
201 #define P99X__SHIFT(EXPR) 0
204 #ifndef P99X__SIGN_PROMOTE
205 #define P99X__SIGN_PROMOTE(EXPR) 0
208 #define P99_HIGH2_1(X) ((X) == P99_UINTMAX_MAX ? P99_UINTMAX_WIDTH : (P99_HIGH2((X) + UINTMAX_C(1))))
218 #define P99_TO_UNSIGNED(T, MACRO) \
220 (sizeof(T) < sizeof(signed) \
222 ? MACRO(unsigned char) \
223 : MACRO(unsigned short)) \
224 : (sizeof(T) < sizeof(unsigned long) \
226 : (sizeof(T) < sizeof(unsigned long long) \
227 ? MACRO(unsigned long) \
228 : MACRO(unsigned long long)))))
232 #define P99_TO_UNSIGN(T, VAL) \
234 (sizeof(T) < sizeof(signed) \
236 ? (unsigned char)+(VAL) \
237 : (unsigned short)+(VAL)) \
238 : (sizeof(T) < sizeof(unsigned long) \
240 : (sizeof(T) < sizeof(unsigned long long) \
241 ? (unsigned long)+(VAL) \
242 : (unsigned long long)+(VAL)))))
259 #define P99_M1(T) ((T)-1)
266 #define P99_M1U(T) (P99_ISSIGNED(T) ? P99_TO_UNSIGN(T, -1) : P99_C(uintmax_t, P99_M1(T)))
268 #define P00_DOCUMENT_SIGNED(X)
269 #define P00_DOCUMENT_UNSIGNED(X)
302 #define P99_C(T, X) ((T)+(X))
304 #define P00_DOCUMENT_CONSTANT(T)
309 P00_DOCUMENT_CONSTANT(
size_t)
310 # define SIZE_C(X) P99_C(size_t, X)
313 #if !defined(PTRDIFF_C)
315 # define PTRDIFF_C(X) P99_C(ptrdiff_t, X)
318 #if !defined(WCHAR_C)
319 P00_DOCUMENT_CONSTANT(
wchar_t)
320 # define WCHAR_C(X) P99_C(wchar_t, X)
324 P00_DOCUMENT_CONSTANT(wint_t)
325 # define WINT_C(X) P99_C(wint_t, X)
330 #if defined(SIG_ATOMIC_MAX) && !defined(SIG_ATOMIC_C)
331 P00_DOCUMENT_CONSTANT(sig_atomic_t)
332 # define SIG_ATOMIC_C(X) P99_C(sig_atomic_t, X)
335 #if defined(UINTPTR_MAX) && !defined(UINTPTR_C)
336 P00_DOCUMENT_CONSTANT(uintptr_t)
337 # define UINTPTR_C(X) P99_C(uintptr_t, X)
340 #if defined(UINTPTR_MAX) && !defined(INTPTR_C)
341 P00_DOCUMENT_CONSTANT(intptr_t)
342 # define INTPTR_C(X) P99_C(intptr_t, X)
348 P00_DOCUMENT_SIGNED(0)
349 #define P99_0(T) P99_C(T, 0)
351 P00_DOCUMENT_UNSIGNED(0)
352 #define P99_0U(T) P99_TO_UNSIGN(T, 0)
354 P00_DOCUMENT_SIGNED(1)
355 #define P99_1(T) P99_C(T, 1)
357 P00_DOCUMENT_UNSIGNED(1)
358 #define P99_1U(T) P99_TO_UNSIGN(T, 1)
360 P00_DOCUMENT_SIGNED(2)
361 #define P99_2(T) P99_C(T, 2)
363 P00_DOCUMENT_UNSIGNED(2)
364 #define P99_2U(T) P99_TO_UNSIGN(T, 2)
366 P00_DOCUMENT_SIGNED(3)
367 #define P99_3(T) P99_C(T, 3)
369 P00_DOCUMENT_UNSIGNED(3)
370 #define P99_3U(T) P99_TO_UNSIGN(T, 3)
379 #define P99_UT_MAX(T) (P99_M1U(T))
392 #define P99_UT_MAX1(T) (P99_UT_MAX(T)/2u)
405 #define P00_ST_MIN1(T) (-(T)P99_UT_MAX1(T))
423 #define P99_ISSIGNED(T) (P99_M1(T) < P99_1(T))
441 #define P99_SIGN_PROMOTE(A, B) (1 ? (A) : (B))
444 #define P00_SEE_PROMOTE
446 #define P00_DOCUMENT_PROMOTE(X)
448 P00_DOCUMENT_PROMOTE(0)
450 #define P99_PROMOTE_0(EXPR) P99_SIGN_PROMOTE(0, (EXPR))
452 P00_DOCUMENT_PROMOTE(1)
454 #define P99_PROMOTE_1(EXPR) P99_SIGN_PROMOTE(1, (EXPR))
456 P00_DOCUMENT_PROMOTE(2)
458 #define P99_PROMOTE_2(EXPR) P99_SIGN_PROMOTE(2, (EXPR))
460 P00_DOCUMENT_PROMOTE(3)
462 #define P99_PROMOTE_3(EXPR) P99_SIGN_PROMOTE(3, (EXPR))
464 P00_DOCUMENT_PROMOTE(0U)
466 #define P99_PROMOTE_0U(EXPR) P99_SIGN_PROMOTE(0U, (EXPR))
468 P00_DOCUMENT_PROMOTE(1u)
470 #define P99_PROMOTE_1U(EXPR) P99_SIGN_PROMOTE(1U, (EXPR))
472 P00_DOCUMENT_PROMOTE(2u)
474 #define P99_PROMOTE_2U(EXPR) P99_SIGN_PROMOTE(2U, (EXPR))
477 P00_DOCUMENT_PROMOTE(-1)
479 #define P99_PROMOTE_M1(EXPR) P99_SIGN_PROMOTE(-1, (EXPR))
486 #define P99_PROMOTE_M1U(EXPR) P99_SIGN_PROMOTE(P99_PROMOTE_M1(EXPR), P99_PROMOTE_0U(EXPR))
495 #define P99_UE_MAX(EXPR) (P99_PROMOTE_M1U(EXPR))
509 #define P99_UE_MAX1(EXPR) (P99_UE_MAX(EXPR)/P99_PROMOTE_2U(EXPR))
528 #define P99_EWIDTH(EXPR)
533 P00_DOCUMENT_TYPE_ARGUMENT(
P99_TMAX, 0)
539 P00_DOCUMENT_TYPE_ARGUMENT(
P99_TMIN, 0)
545 #define P99_EWIDTH(EXPR) \
547 ? (P99_HIGH2_1((uintmax_t)+(P99_UE_MAX(EXPR)>>P99X__SHIFT(EXPR))) + P99X__SHIFT(EXPR)) \
548 : P99_HIGH2_1(P99_UE_MAX(EXPR)) \
551 #define P99_EWIDTH(EXPR) P99_HIGH2_1(P99_UE_MAX(EXPR))
566 #define P99_EPREC(EXPR) (P99_EWIDTH(EXPR) - P99_SIGNED(EXPR))
583 #define P99_EPADDING(EXPR) (sizeof(P99_PROMOTE_0(EXPR))*CHAR_BIT - P99_EWIDTH(EXPR))
585 #define P99_SE_MAX(EXPR) \
586 ((((P99_PROMOTE_1(EXPR) \
587 << (P99_EWIDTH(EXPR) - 2U)) \
588 - P99_PROMOTE_1(EXPR)) \
590 + P99_PROMOTE_1(EXPR))
604 #define P00_SE_MIN1(EXPR) (-P99_SE_MAX(EXPR))
622 #define P99_SIGNED(EXPR) (P99_PROMOTE_M1(EXPR) < P99_PROMOTE_1(EXPR))
627 uintmax_t p00_abs_signed(intmax_t p00_a) {
632 return (p00_a < INTMAX_C(0)) ? -p00_aa : p00_a;
648 #define P99_ABS(EXPR) (P99_SIGNED(EXPR) ? p00_abs_signed(EXPR) : P99_C(uintmax_t, EXPR))
650 #if defined(p99x_uintmax) && defined(p99x_intmax)
660 #define P99X_ABS(EXPR) (P99_SIGNED(EXPR) ? p99x__abs_signed(EXPR) : (EXPR))
674 # define P99X_ABS P00_ABS
699 #define P99_SIGNED_REPRESENTATION(T) P99_C(p99_signed_representation, (P99_M1(T) & P99_3(T)))
707 #define P99_2COMPLEMENT(T) (P99_SIGNED_REPRESENTATION(T) == p99_signed_representation_twos)
710 P00_DOCUMENT_TYPE_ARGUMENT(
P99_TMAX, 0)
711 #define P99_TMAX(T) \
714 ? (P99_ISSIGNED(T) ? P99X__SIGN_PROMOTE((T)-1)/2u : P99_UE_MAX((T)0)) \
715 : (P99_ISSIGNED(T) ? P99_UT_MAX1(T) : P99_UT_MAX(T))))
717 P00_DOCUMENT_TYPE_ARGUMENT(
P99_TMIN, 0)
718 #define P99_TMIN(T) \
721 ? (P99_ISSIGNED(T) ? (-(P99X__SIGN_PROMOTE((T)-1)/2u)) - P99_2COMPLEMENT(T) : (T)0) \
722 : (P99_ISSIGNED(T) ? (P00_ST_MIN1(T) - P99_2COMPLEMENT(T)) : P99_0(T))))
724 P00_DOCUMENT_TYPE_ARGUMENT(
P99_TMAX, 0)
725 #define P99_TMAX(T) P99_C(T, P99_ISSIGNED(T) ? P99_UT_MAX1(T) : P99_UT_MAX(T))
726 P00_DOCUMENT_TYPE_ARGUMENT(
P99_TMIN, 0)
727 #define P99_TMIN(T) P99_C(T, P99_ISSIGNED(T) ? (P00_ST_MIN1(T) - P99_2COMPLEMENT(T)) : P99_0(T))
739 #define P99_E_REPRESENTATION(EXPR) ((p99_signed_representation)(P99_PROMOTE_M1(EXPR) & P99_PROMOTE_3(EXPR)))
747 #define P99_E_2COMPLEMENT(EXPR) \
748 P99_SIGN_PROMOTE(P99_E_REPRESENTATION(EXPR) == p99_signed_representation_twos, (EXPR))
754 #define P99_EMAX(EXPR) (P99_SIGNED(EXPR) ? P99_SE_MAX(EXPR) : P99_PROMOTE_M1(EXPR))
760 #define P99_EMIN(EXPR) (P99_SIGNED(EXPR) ? (P00_SE_MIN1(EXPR) - P99_E_2COMPLEMENT(EXPR)) : P99_PROMOTE_0(EXPR))
772 #define P99_TPREC(T) \
773 (P99X__SHIFT((T)-1) \
775 : P99_HIGH2_1(P99_TMAX(T)))
789 #define P99_TWIDTH(T) (P99_TPREC(T) + P99_ISSIGNED(T))
804 #define P99_TPADDING(T) ((sizeof(T)*CHAR_BIT) - P99_TWIDTH(T))
807 #define P00_DECLARE_OVERFLOW(SUFF) \
812 P99_BUILTIN_TYPE(SUFF,) \
813 P99_PASTE2(p99_twos, SUFF)(P99_BUILTIN_TYPE(u, SUFF) p00_a); \
815 P99_BUILTIN_TYPE(SUFF,) \
816 P99_PASTE2(p99_add, SUFF)(P99_BUILTIN_TYPE(SUFF,) p00_a, P99_BUILTIN_TYPE(SUFF,) p00_b, int* p00_err)
818 #define P00_DECLARE_OVERFLOW(SUFF) \
819 P00_DECLARE_TWOS(SUFF) \
820 P00_DECLARE_UNSIG(SUFF) \
821 P00_DECLARE_ADD0(SUFF) \
822 P00_DECLARE_ADD1(SUFF) \
823 P00_DECLARE_ADD2(SUFF) \
824 P00_DECLARE_ADD(SUFF) \
825 P00_DECLARE_SUB0(SUFF) \
826 P00_DECLARE_SUB1(SUFF) \
827 P00_DECLARE_SUB2(SUFF) \
828 P00_DECLARE_SUB(SUFF) \
829 P99_MACRO_END(p99_overflow_, SUFF)
832 #define P00_DECLARE_TWOS(SUFF) \
835 P99_BUILTIN_TYPE(SUFF) \
836 P99_PASTE2(p99_twos, SUFF)(P99_BUILTIN_TYPE(u, SUFF) p00_a) { \
837 P99_BUILTIN_TYPE(u, SUFF) const type_max = P99_BUILTIN_MAX(SUFF); \
838 P99_BUILTIN_TYPE(u, SUFF) const type_max1 = (P99_BUILTIN_TYPE(u, SUFF))(type_max + 1); \
840 P99_BUILTIN_TYPE(u, SUFF) const utype_max = (P99_BUILTIN_TYPE(u, SUFF))((2 * type_max) + 1); \
845 (p00_a <= type_max) \
849 : (((P99_BUILTIN_MIN(SUFF) == -P99_BUILTIN_MAX(SUFF)) && (p00_a == type_max1)) \
850 ? (P99_BUILTIN_TYPE(SUFF))(-0) \
854 : (P99_BUILTIN_TYPE(SUFF))((-(P99_BUILTIN_TYPE(SUFF))(utype_max - (utype_max & p00_a))) - 1)); \
857 #define P00_DECLARE_UNSIG(SUFF) \
860 P99_BUILTIN_TYPE(u, SUFF) \
861 P99_PASTE2(p99_unsig, SUFF)(P99_BUILTIN_TYPE(SUFF) p00_a) { \
863 register P99_BUILTIN_TYPE(SUFF) const type_null = 0; \
864 register P99_BUILTIN_TYPE(u, SUFF) const type_max = P99_BUILTIN_MAX(SUFF); \
865 register P99_BUILTIN_TYPE(u, SUFF) const type_max1 = (P99_BUILTIN_TYPE(u, SUFF))(type_max + 1); \
867 register P99_BUILTIN_TYPE(u, SUFF) const utype_max = (P99_BUILTIN_TYPE(u, SUFF))((2 * type_max) + 1); \
873 : (((P99_BUILTIN_MIN(SUFF) == -P99_BUILTIN_MAX(SUFF)) && (p00_a == P99_BUILTIN_MIN(SUFF))) \
876 : (P99_BUILTIN_TYPE(u, SUFF))((utype_max - (P99_BUILTIN_TYPE(u, SUFF))-p00_a) + 1)); \
879 #define P00_DECLARE_ADD0(SUFF) \
882 P99_BUILTIN_TYPE(u, SUFF) \
883 P99_PASTE2(p00_add0, SUFF)(P99_BUILTIN_TYPE(SUFF) p00_a, P99_BUILTIN_TYPE(SUFF) p00_b) { \
884 register P99_BUILTIN_TYPE(u, SUFF) p00_ua = P99_PASTE2(p99_unsig, SUFF)(p00_a); \
885 register P99_BUILTIN_TYPE(u, SUFF) p00_ub = P99_PASTE2(p99_unsig, SUFF)(p00_b); \
886 register P99_BUILTIN_TYPE(u, SUFF) p00_res = (P99_BUILTIN_TYPE(u, SUFF))(p00_ua + p00_ub); \
890 #define P00_DECLARE_SUB0(SUFF) \
893 P99_BUILTIN_TYPE(u, SUFF) \
894 P99_PASTE2(p00_sub0, SUFF)(P99_BUILTIN_TYPE(SUFF) p00_a, P99_BUILTIN_TYPE(SUFF) p00_b) { \
895 register P99_BUILTIN_TYPE(u, SUFF) p00_ua = P99_PASTE2(p99_unsig, SUFF)(p00_a); \
896 register P99_BUILTIN_TYPE(u, SUFF) p00_ub = P99_PASTE2(p99_unsig, SUFF)(p00_b); \
897 register P99_BUILTIN_TYPE(u, SUFF) p00_res = (P99_BUILTIN_TYPE(u, SUFF))(p00_ua - p00_ub); \
901 #define P00_DECLARE_ADD2(SUFF) \
904 P99_BUILTIN_TYPE(SUFF) \
905 P99_PASTE2(p00_add2, SUFF)(P99_BUILTIN_TYPE(SUFF) p00_a, \
906 P99_BUILTIN_TYPE(SUFF) p00_b, \
907 int p00_err[P99_ATLEAST 1]) { \
909 register P99_BUILTIN_TYPE(SUFF) const type_null = 0; \
910 register P99_BUILTIN_TYPE(u, SUFF) const type_max = P99_BUILTIN_MAX(SUFF); \
911 register P99_BUILTIN_TYPE(u, SUFF) const type_max1 = (P99_BUILTIN_TYPE(u, SUFF))(type_max + 1); \
912 register P99_BUILTIN_TYPE(u, SUFF) p00_uc \
913 = P99_PASTE2(p00_add0, SUFF)(p00_a, p00_b); \
914 register P99_BUILTIN_TYPE(SUFF) p00_c \
915 = P99_PASTE2(p99_twos, SUFF)(p00_uc); \
917 if (P99_UNLIKELY(((p00_a ^ p00_b) >= type_null) && ((p00_b ^ p00_c) < type_null)) \
919 || ((P99_BUILTIN_MIN(SUFF) == -P99_BUILTIN_MAX(SUFF)) \
920 && (p00_uc == type_max1))) \
921 p00_err[0] = ERANGE; \
925 #define P00_DECLARE_SUB2(SUFF) \
928 P99_BUILTIN_TYPE(SUFF) \
929 P99_PASTE2(p00_sub2, SUFF)(P99_BUILTIN_TYPE(SUFF) p00_a, \
930 P99_BUILTIN_TYPE(SUFF) p00_b, \
931 int p00_err[P99_ATLEAST 1]) { \
933 register P99_BUILTIN_TYPE(SUFF) const type_null = 0; \
934 register P99_BUILTIN_TYPE(u, SUFF) const type_max = P99_BUILTIN_MAX(SUFF); \
935 register P99_BUILTIN_TYPE(u, SUFF) const type_max1 = (P99_BUILTIN_TYPE(u, SUFF))(type_max + 1); \
936 register P99_BUILTIN_TYPE(u, SUFF) p00_uc \
937 = P99_PASTE2(p00_sub0, SUFF)(p00_a, p00_b); \
938 register P99_BUILTIN_TYPE(SUFF) p00_c \
939 = P99_PASTE2(p99_twos, SUFF)(p00_uc); \
941 if (P99_UNLIKELY(((p00_a ^ p00_b) < type_null) && ((p00_b ^ p00_c) >= type_null)) \
943 || ((P99_BUILTIN_MIN(SUFF) == -P99_BUILTIN_MAX(SUFF)) \
944 && (p00_uc == type_max1))) \
945 p00_err[0] = ERANGE; \
949 #define P00_DECLARE_ADD1(SUFF) \
952 P99_BUILTIN_TYPE(SUFF) \
953 P99_PASTE2(p00_add1, SUFF)(P99_BUILTIN_TYPE(SUFF) p00_a, \
954 P99_BUILTIN_TYPE(SUFF) p00_b, \
955 int p00_err[P99_ATLEAST 1]) { \
957 register P99_BUILTIN_TYPE(SUFF) const type_null = 0; \
958 register P99_BUILTIN_TYPE(SUFF) p00_ret; \
959 if (p00_b >= type_null) { \
960 if (P99_LIKELY(P99_BUILTIN_MAX(SUFF) - p00_b >= p00_a)) { \
961 p00_ret = p00_a + p00_b; \
963 p00_ret = ((p00_b - P99_BUILTIN_MAX(SUFF)) + p00_a) - 1; \
964 p00_err[0] = ERANGE; \
967 if (P99_LIKELY(P99_BUILTIN_MIN(SUFF) - p00_b <= p00_a)) { \
968 p00_ret = p00_a + p00_b; \
970 p00_ret = ((p00_b + P99_BUILTIN_MAX(SUFF)) + p00_a) + 1; \
971 p00_err[0] = ERANGE; \
977 #define P00_DECLARE_SUB1(SUFF) \
980 P99_BUILTIN_TYPE(SUFF) \
981 P99_PASTE2(p00_sub1, SUFF)(P99_BUILTIN_TYPE(SUFF) p00_a, \
982 P99_BUILTIN_TYPE(SUFF) p00_b, \
983 int p00_err[P99_ATLEAST 1]) { \
985 register P99_BUILTIN_TYPE(SUFF) const type_null = 0; \
986 register P99_BUILTIN_TYPE(SUFF) p00_ret; \
987 if (p00_b <= type_null) { \
988 if (P99_LIKELY(P99_BUILTIN_MAX(SUFF) + p00_b >= p00_a)) { \
989 p00_ret = p00_a - p00_b; \
991 p00_ret = (p00_a - (p00_b + P99_BUILTIN_MAX(SUFF))) + 1; \
992 p00_err[0] = ERANGE; \
995 if (P99_LIKELY(P99_BUILTIN_MIN(SUFF) + p00_b <= p00_a)) { \
996 p00_ret = p00_a - p00_b; \
998 p00_ret = (p00_a - (p00_b - P99_BUILTIN_MAX(SUFF))) - 1; \
999 p00_err[0] = ERANGE; \
1005 #define P00_DECLARE_ADD(SUFF) \
1006 P99_CONST_FUNCTION \
1008 P99_BUILTIN_TYPE(SUFF) \
1009 P99_PASTE2(p99_add, SUFF)(P99_BUILTIN_TYPE(SUFF) p00_a, \
1010 P99_BUILTIN_TYPE(SUFF) p00_b, \
1011 int p00_err[P99_ATLEAST 1]) { \
1013 (P99_BUILTIN_MAX(SUFF) < P99_BUILTIN_MAX(u, SUFF)) \
1014 ? P99_PASTE2(p00_add2, SUFF)(p00_a, p00_b, p00_err) \
1015 : P99_PASTE2(p00_add1, SUFF)(p00_a, p00_b, p00_err); \
1018 #define P00_DECLARE_SUB(SUFF) \
1019 P99_CONST_FUNCTION \
1021 P99_BUILTIN_TYPE(SUFF) \
1022 P99_PASTE2(p99_sub, SUFF)(P99_BUILTIN_TYPE(SUFF) p00_a, \
1023 P99_BUILTIN_TYPE(SUFF) p00_b, \
1024 int p00_err[P99_ATLEAST 1]) { \
1026 (P99_BUILTIN_MAX(SUFF) < P99_BUILTIN_MAX(u, SUFF)) \
1027 ? P99_PASTE2(p00_sub2, SUFF)(p00_a, p00_b, p00_err) \
1028 : P99_PASTE2(p00_sub1, SUFF)(p00_a, p00_b, p00_err); \
1032 P00_DECLARE_OVERFLOW(c);
1033 P00_DECLARE_OVERFLOW(hh);
1034 P00_DECLARE_OVERFLOW(h);
1035 P00_DECLARE_OVERFLOW();
1036 P00_DECLARE_OVERFLOW(l);
1037 P00_DECLARE_OVERFLOW(ll);
1059 #if P99_COMPILER & P99_COMPILER_CLANG
1061 P99_WARN_INIT_PUSH \
1065 # define P99_INIT { 0 }
1068 #define P00_LVAL1(T) ((T)P99_INIT)
1069 #define P00_LVAL(T, ...) ((T){ __VA_ARGS__ })
1084 #define P99_LVAL(...) \
1085 P99_WARN_INIT_PUSH \
1086 P99_IF_LE(P99_NARG(__VA_ARGS__),1)(P00_LVAL1(__VA_ARGS__))(P00_LVAL(__VA_ARGS__)) \
1121 # define P99_RVAL(T, VAL)
1123 # define P99_RVAL(...) \
1124 P99_WARN_INIT_PUSH \
1125 P99_IF_EQ_1(P99_NARG(__VA_ARGS__)) \
1126 (P00_RVAL1(__VA_ARGS__)) \
1127 (P00_RVAL2(__VA_ARGS__)) \
1131 #define P00_RVAL1_(T) (((const struct { int p00_bla1; T p00_T1; }){ .p00_bla1 = 0 }).p00_T1)
1132 #define P00_RVAL2_(T) ((( struct { int p00_bla2; T p00_T2; }){ .p00_bla2 = 0 }).p00_T2)
1134 #define P00_RVAL2(T, ...) (P00_RVAL2_(T) = (__VA_ARGS__))
1135 #define P00_RVAL1(T) P00_RVAL2(T, P00_RVAL1_(T))
1156 #define P99_AVAL(T) P00_RVAL2_(T)
1160 #define P99_CHOOSE5(xT, cc, cs, ci, cl, cll) \
1161 ((sizeof(xT) < sizeof(int)) \
1162 ? ((sizeof(xT) < sizeof(short)) \
1165 : ((sizeof(xT) <= sizeof(long)) \
1166 ? ((sizeof(xT) == sizeof(int)) \
1172 P00_DOCUMENT_PERMITTED_ARGUMENT(
P99_PRI, 0)
1173 #define P99_PRI(xT, F, LEN) \
1185 #define P00_J(X) (0 ? P99_0(uintmax_t) : (X))
1201 #define P99_HMASK(N,M) (P99_PASTE2(P00_MASK_, N)^P99_PASTE2(P00_MASK_, P99_MINUS(N, M)))
1246 #define P99_LOW2(X) ((X) & -(X))
1261 #define P99_LOW2MASK1(X) ((X) ^ ((X) - 1))
1276 #define P99_LOW2MASK0(X) (~(X) & ((X) - 1))
1291 #define P99_MASK2LOW1(X) ((X) | -(X))
1306 #define P99_MASK2LOW0(X) ((X) ^ -(X))
1320 #define P99_LOW2CLEAR(X) ((X) & ((X) - 1))
1334 #define P99_LOW2FILL(X) ((X) | ((X) - 1))
1348 #define P99_LOW0SET(X) ((X) | ((X) + 1))
1363 #define P99_LOW2SHIFT(X) (P99_LIKELY(!!(X)) ? ((X) / ((X) & -(X))) : 0u)
1389 p00_ret = p00_t | p00_m;
1413 typedef uint16_t p00_uint_byte_2;
1414 typedef uint32_t p00_uint_byte_4;
1415 typedef uint64_t p00_uint_byte_8;
1417 union p00_endian_2 {
1422 union p00_endian_4 {
1427 union p00_endian_8 {
1434 typedef uint128_t p00_uint_byte_16;
1436 union p00_endian_16 {
1441 # ifdef p99x_uint128
1444 union p00_endian_16 {
1452 #define P00_HTON0(N, X, I) [I] = (0xFF & ((X)>>((N - (I + 1))*CHAR_BIT)))
1453 #define P00_HTON(N, X) P99_FOR(N, N, P00_SEQ, P00_HTON0, P99_DUPL(N, X))
1454 #define P99_HTON_INITIALIZER(N, X) { .p00_c = { P00_HTON(N, X) } }
1461 #define P99_HTON(N, X) (((P99_PASTE2(p00_endian_, N) const)P99_HTON_INITIALIZER(N, X)).p00_i)
1469 P00_DOCUMENT_NUMBER_ARGUMENT(
P99_HTONS, 0)
1470 P00_DOCUMENT_PERMITTED_ARGUMENT(
P99_HTONS, 1)
1471 #define P99_HTONS(X) P99_HTON(2, X)
1479 P00_DOCUMENT_NUMBER_ARGUMENT(
P99_HTONL, 0)
1480 P00_DOCUMENT_PERMITTED_ARGUMENT(
P99_HTONL, 1)
1481 #define P99_HTONL(X) P99_HTON(4, X)
1484 #define P00_NTOH0(N, X, I) (((P99_PASTE2(p00_uint_byte_, N))((X).p00_c[I]))<<((N - (I + 1))*CHAR_BIT))
1485 #define P00_NTOH(N, X, XX) P99_FOR(N, N, P00_BOR, P00_NTOH0, P99_DUPL(N, XX))
1486 #define P99_NTOH_INITIALIZER(N, X) { .p00_i = (X) }
1493 #define P99_NTOH(N, X) (P99_PASTE2(p00_uint_byte_, N) const)P00_NTOH(N, X, ((P99_PASTE2(p00_endian_, N) const)P99_NTOH_INITIALIZER(N, X)))
1501 P00_DOCUMENT_NUMBER_ARGUMENT(
P99_NTOHS, 0)
1502 #define P99_NTOHS(X) P99_NTOH(2, X)
1510 P00_DOCUMENT_NUMBER_ARGUMENT(
P99_NTOHL, 0)
1511 #define P99_NTOHL(X) P99_NTOH(4, X)
uintmax_t p99_mask2low0(uintmax_t p00_x)
function equivalent to P99_MASK2LOW0
#define P99_TO_UNSIGNED(T, MACRO)
Apply the type macro MACRO to an unsigned type that is compatible with type T.
@ p99_signed_representation_invalid
C99 specific include files that are required by the standard.
uintmax_t p99_low2clear(uintmax_t p00_x)
function equivalent to P99_LOW2CLEAR
#define P99_LOW0SET(X)
set least significant zero bit
#define P99_LOW2MASK1(X)
mask consisting of bits strictly below the least significant bit that is non zero
@ p99_signed_representation_ones
#define P99_ISSIGNED(T)
Determine if T is an unsigned or signed integral type.
uintmax_t p99_mask2low1(uintmax_t p00_x)
function equivalent to P99_MASK2LOW1
#define P99_MASK2LOW0(X)
mask consisting of bits strictly above the least significant bit that is non zero
Implement a simple FILEID that changes each time this file is included somewhere.
#define P99_TMAX(T)
Give the maximum representable value of type T.
uintmax_t p99_low0set(uintmax_t p00_x)
function equivalent to P99_LOW0SET
#define P99_HTONS(X)
host to network transformation of integers according to the endianness of the platform
#define P99_UT_MAX(T)
The maximum representable value of the unsigned type corresponding to T.
uintmax_t p99_next_popcount(uintmax_t p00_x)
function that returns the next higher value that has exactly the same popcount as x.
#define P99_NTOHL(X)
network to host transformation of integers according to the endianness of the platform
#define p99_inline
Try to force a function always to be inlined.
#define P99_MASK2LOW1(X)
mask consisting of bits above and including the least significant bit that is non zero
intmax_t p99x_intmax
A signed integer type of maximal width that exceeds the C99 specifications.
uintmax_t p99_low2mask1(uintmax_t p00_x)
function equivalent to P99_LOW2MASK1
uintmax_t p99x_uintmax
An unsigned integer type of maximal width that exceeds the C99 specifications.
#define P99_SIGNED_REPRESENTATION(T)
C99 allows exactly three different possibilities for the encoding of negative values of integer types...
p99_signed_representation
C99 allows exactly three different possibilities for the encoding of negative values of integer types...
uintmax_t p99_low2fill(uintmax_t p00_x)
function equivalent to P99_LOW2FILL
@ p99_signed_representation_twos
#define P99_LOW2(X)
extract the least significant bit that is non zero
#define P99_CHOOSE5(xT, cc, cs, ci, cl, cll)
uintmax_t p99_low2mask0(uintmax_t p00_x)
function equivalent to P99_LOW2MASK0
#define P99_CONST_FUNCTION
On architectures that support this, assert that a function is "const", i.e only depends on parameters...
@ p99_signed_representation_magnitude
uintmax_t p99_low2shift(uintmax_t p00_x)
function equivalent to P99_LOW2SHIFT
uintmax_t p99_low2(uintmax_t p00_x)
function equivalent to P99_LOW2
#define P99_LOW2FILL(X)
fill all bits below least significant bit that is non zero
#define P99_LOW2MASK0(X)
mask consisting of bits below and including the least significant bit that is non zero
#define P99_LOW2CLEAR(X)
clear the least significant bit that is non zero
#define P99_LOW2SHIFT(X)
shift number right such that the least significant bit that is non zero ends up at bit position 0
#define P99_TMIN(T)
Give the minimum representable value of type T.
#define P99_HTONL(X)
host to network transformation of integers according to the endianness of the platform
#define P99_TO_UNSIGN(T, VAL)
#define P99_DECLARE_UNION(NAME)
forward declaration of a union NAME
#define P99_NTOHS(X)
network to host transformation of integers according to the endianness of the platform
extendedInt p99x_uint128
An unsigned integer type of width 128 that exceeds the C99 specifications.
#define P99_PRI(xT, F, LEN)
extendedInt p99x_int128
A signed integer type of width 128 that exceeds the C99 specifications.