49 lines
1.3 KiB
Diff
49 lines
1.3 KiB
Diff
From 181edb851ee929ee4628fc8c053eb0c89d869bd0 Mon Sep 17 00:00:00 2001
|
|
From: Peter Jones <pjones@redhat.com>
|
|
Date: Thu, 11 Aug 2016 15:46:06 -0400
|
|
Subject: [PATCH] util.h: add int_add for 32-bit platforms
|
|
|
|
---
|
|
src/util.h | 12 ++++++++++++
|
|
1 file changed, 12 insertions(+)
|
|
|
|
diff --git a/src/util.h b/src/util.h
|
|
index 80f5fab..a519ac2 100644
|
|
--- a/src/util.h
|
|
+++ b/src/util.h
|
|
@@ -38,12 +38,23 @@
|
|
*/
|
|
#if defined(__GNUC__) && defined(__GNUC_MINOR__)
|
|
#if __GNUC__ >= 5 && __GNUC_MINOR__ >= 1
|
|
+#define int_add(a, b, c) __builtin_add_overflow(a, b, c)
|
|
#define long_add(a, b, c) __builtin_add_overflow(a, b, c)
|
|
#define long_mult(a, b, c) __builtin_mul_overflow(a, b, c)
|
|
#define ulong_add(a, b, c) __builtin_add_overflow(a, b, c)
|
|
#define ulong_mult(a, b, c) __builtin_mul_overflow(a, b, c)
|
|
#endif
|
|
#endif
|
|
+#ifndef int_add
|
|
+#define int_add(a, b, c) ({ \
|
|
+ const int _limit = INT_MAX; \
|
|
+ int _ret; \
|
|
+ _ret = _limit - (a) > (b); \
|
|
+ if (!_ret) \
|
|
+ *(c) = ((a) + (b)); \
|
|
+ _ret; \
|
|
+ })
|
|
+#endif
|
|
#ifndef long_add
|
|
#define long_add(a, b, c) ({ \
|
|
const long _limit = LONG_MAX; \
|
|
@@ -92,6 +103,7 @@
|
|
#endif
|
|
|
|
#define add(a, b, c) _Generic((c), \
|
|
+ int *: int_add(a,b,c), \
|
|
long *: long_add(a,b,c), \
|
|
unsigned long *: ulong_add(a,b,c))
|
|
|
|
--
|
|
2.7.4
|
|
|