OSDN Git Service

util.h: add int_add for 32-bit platforms
authorPeter Jones <pjones@redhat.com>
Thu, 11 Aug 2016 19:46:06 +0000 (15:46 -0400)
committerPeter Jones <pjones@redhat.com>
Thu, 11 Aug 2016 20:00:20 +0000 (16:00 -0400)
src/util.h

index 80f5fab..a519ac2 100644 (file)
  */
 #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;                   \
 #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))