77 #include <jasper/jas_config.h>
95 #define JAS_KIBI JAS_CAST(size_t, 1024)
96 #define JAS_MEBI (JAS_KIBI * JAS_KIBI)
100 (((x) >= 0) ? (x) : (-(x)))
103 #define JAS_MIN(x, y) \
104 (((x) < (y)) ? (x) : (y))
107 #define JAS_MAX(x, y) \
108 (((x) > (y)) ? (x) : (y))
112 #define JAS_MOD(x, y) \
113 (((x) < 0) ? (((-x) % (y)) ? ((y) - ((-(x)) % (y))) : (0)) : ((x) % (y)))
117 #define JAS_ONES(n) \
124 #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ > 6)
127 #pragma GCC diagnostic push
128 #pragma GCC diagnostic ignored "-Wshift-negative-value"
132 JAS_ATTRIBUTE_DISABLE_USAN
133 inline static int jas_int_asr(
int x,
unsigned n)
137 assert(((-1) >> 1) == -1);
145 JAS_ATTRIBUTE_DISABLE_USAN
146 inline static int jas_int_asl(
int x,
unsigned n)
150 assert(((-1) << 1) == -2);
158 JAS_ATTRIBUTE_DISABLE_USAN
159 inline static int_least32_t jas_least32_asr(int_least32_t x,
unsigned n)
163 assert(((JAS_CAST(int_least32_t, -1)) >> 1) == JAS_CAST(int_least32_t, -1));
171 JAS_ATTRIBUTE_DISABLE_USAN
172 inline static int_least32_t jas_least32_asl(int_least32_t x,
unsigned n)
176 assert(((JAS_CAST(int_least32_t, -1)) << 1) == JAS_CAST(int_least32_t, -2));
184 JAS_ATTRIBUTE_DISABLE_USAN
185 inline static int_fast32_t jas_fast32_asr(int_fast32_t x,
unsigned n)
189 assert(((JAS_CAST(int_fast32_t, -1)) >> 1) == JAS_CAST(int_fast32_t, -1));
197 JAS_ATTRIBUTE_DISABLE_USAN
198 inline static int_fast32_t jas_fast32_asl(int_fast32_t x,
unsigned n)
202 assert(((JAS_CAST(int_fast32_t, -1)) << 1) == JAS_CAST(int_fast32_t, -2));
209 #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ > 6)
210 #pragma GCC diagnostic pop
218 inline static bool jas_safe_size_mul(
size_t x,
size_t y,
size_t *result)
220 #if jas_has_builtin(__builtin_mul_overflow) || (defined(__GNUC__) && __GNUC__ > 5)
221 size_t result_buffer;
223 result = &result_buffer;
224 return !__builtin_mul_overflow(x, y, result);
227 if (x && y > SIZE_MAX / x) {
239 inline static bool jas_safe_size_mul3(
size_t a,
size_t b,
size_t c,
243 if (!jas_safe_size_mul(a, b, &tmp) ||
244 !jas_safe_size_mul(tmp, c, &tmp)) {
254 inline static bool jas_safe_size_add(
size_t x,
size_t y,
size_t *result)
256 #if jas_has_builtin(__builtin_add_overflow) || (defined(__GNUC__) && __GNUC__ > 5)
257 size_t result_buffer;
259 result = &result_buffer;
260 return !__builtin_add_overflow(x, y, result);
262 if (y > SIZE_MAX - x) {
273 inline static bool jas_safe_size_sub(
size_t x,
size_t y,
size_t *result)
275 #if jas_has_builtin(__builtin_sub_overflow) || (defined(__GNUC__) && __GNUC__ > 5)
276 size_t result_buffer;
278 result = &result_buffer;
279 return !__builtin_sub_overflow(x, y, result);
292 inline static bool jas_safe_intfast32_mul(int_fast32_t x, int_fast32_t y,
293 int_fast32_t *result)
295 #if jas_has_builtin(__builtin_mul_overflow) || (defined(__GNUC__) && __GNUC__ > 5)
296 int_fast32_t result_buffer;
298 result = &result_buffer;
299 return !__builtin_mul_overflow(x, y, result);
305 if (x > INT_FAST32_MAX / y) {
310 if (y < INT_FAST32_MIN / x) {
318 if (x < INT_FAST32_MIN / y) {
322 if (x != 0 && y < INT_FAST32_MAX / x) {
336 inline static bool jas_safe_intfast32_mul3(int_fast32_t a, int_fast32_t b,
337 int_fast32_t c, int_fast32_t *result)
340 if (!jas_safe_intfast32_mul(a, b, &tmp) ||
341 !jas_safe_intfast32_mul(tmp, c, &tmp)) {
351 inline static bool jas_safe_intfast32_add(int_fast32_t x, int_fast32_t y,
352 int_fast32_t *result)
354 #if jas_has_builtin(__builtin_add_overflow) || (defined(__GNUC__) && __GNUC__ > 5)
355 int_fast32_t result_buffer;
357 result = &result_buffer;
358 return !__builtin_add_overflow(x, y, result);
360 if ((y > 0 && x > INT_FAST32_MAX - y) ||
361 (y < 0 && x < INT_FAST32_MIN - y)) {
376 inline static bool jas_safe_uint_mul(
unsigned x,
unsigned y,
unsigned *result)
379 if (x && y > UINT_MAX / x) {