77 #include <jasper/jas_config.h> 94 #define JAS_KIBI JAS_CAST(size_t, 1024) 95 #define JAS_MEBI (JAS_KIBI * JAS_KIBI) 99 (((x) >= 0) ? (x) : (-(x))) 102 #define JAS_MIN(x, y) \ 103 (((x) < (y)) ? (x) : (y)) 106 #define JAS_MAX(x, y) \ 107 (((x) > (y)) ? (x) : (y)) 111 #define JAS_MOD(x, y) \ 112 (((x) < 0) ? (((-x) % (y)) ? ((y) - ((-(x)) % (y))) : (0)) : ((x) % (y))) 116 #define JAS_ONES(n) \ 123 #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ > 6) 126 #pragma GCC diagnostic push 127 #pragma GCC diagnostic ignored "-Wshift-negative-value" 131 JAS_ATTRIBUTE_DISABLE_USAN
132 inline static int jas_int_asr(
int x,
unsigned n)
136 assert(((-1) >> 1) == -1);
144 JAS_ATTRIBUTE_DISABLE_USAN
145 inline static int jas_int_asl(
int x,
unsigned n)
149 assert(((-1) << 1) == -2);
157 JAS_ATTRIBUTE_DISABLE_USAN
158 inline static int_least32_t jas_least32_asr(int_least32_t x,
unsigned n)
162 assert(((JAS_CAST(int_least32_t, -1)) >> 1) == JAS_CAST(int_least32_t, -1));
170 JAS_ATTRIBUTE_DISABLE_USAN
171 inline static int_least32_t jas_least32_asl(int_least32_t x,
unsigned n)
175 assert(((JAS_CAST(int_least32_t, -1)) << 1) == JAS_CAST(int_least32_t, -2));
183 JAS_ATTRIBUTE_DISABLE_USAN
184 inline static int_fast32_t jas_fast32_asr(int_fast32_t x,
unsigned n)
188 assert(((JAS_CAST(int_fast32_t, -1)) >> 1) == JAS_CAST(int_fast32_t, -1));
196 JAS_ATTRIBUTE_DISABLE_USAN
197 inline static int_fast32_t jas_fast32_asl(int_fast32_t x,
unsigned n)
201 assert(((JAS_CAST(int_fast32_t, -1)) << 1) == JAS_CAST(int_fast32_t, -2));
208 #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ > 6) 209 #pragma GCC diagnostic pop 217 inline static bool jas_safe_size_mul(
size_t x,
size_t y,
size_t *result)
219 #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ > 5) 220 size_t result_buffer;
222 result = &result_buffer;
223 return !__builtin_mul_overflow(x, y, result);
226 if (x && y > SIZE_MAX / x) {
238 inline static bool jas_safe_size_mul3(
size_t a,
size_t b,
size_t c,
242 if (!jas_safe_size_mul(a, b, &tmp) ||
243 !jas_safe_size_mul(tmp, c, &tmp)) {
253 inline static bool jas_safe_size_add(
size_t x,
size_t y,
size_t *result)
255 #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ > 5) 256 size_t result_buffer;
258 result = &result_buffer;
259 return !__builtin_add_overflow(x, y, result);
261 if (y > SIZE_MAX - x) {
272 inline static bool jas_safe_size_sub(
size_t x,
size_t y,
size_t *result)
274 #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ > 5) 275 size_t result_buffer;
277 result = &result_buffer;
278 return !__builtin_sub_overflow(x, y, result);
291 inline static bool jas_safe_intfast32_mul(int_fast32_t x, int_fast32_t y,
292 int_fast32_t *result)
294 #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ > 5) 295 int_fast32_t result_buffer;
297 result = &result_buffer;
298 return !__builtin_mul_overflow(x, y, result);
304 if (x > INT_FAST32_MAX / y) {
309 if (y < INT_FAST32_MIN / x) {
317 if (x < INT_FAST32_MIN / y) {
321 if (x != 0 && y < INT_FAST32_MAX / x) {
335 inline static bool jas_safe_intfast32_mul3(int_fast32_t a, int_fast32_t b,
336 int_fast32_t c, int_fast32_t *result)
339 if (!jas_safe_intfast32_mul(a, b, &tmp) ||
340 !jas_safe_intfast32_mul(tmp, c, &tmp)) {
350 inline static bool jas_safe_intfast32_add(int_fast32_t x, int_fast32_t y,
351 int_fast32_t *result)
353 #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ > 5) 354 int_fast32_t result_buffer;
356 result = &result_buffer;
357 return !__builtin_add_overflow(x, y, result);
359 if ((y > 0 && x > INT_FAST32_MAX - y) ||
360 (y < 0 && x < INT_FAST32_MIN - y)) {