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)) {