diff --git a/libkc3/tag_add.c b/libkc3/tag_add.c
index 8d1cbcf..524bcbb 100644
--- a/libkc3/tag_add.c
+++ b/libkc3/tag_add.c
@@ -268,7 +268,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
dest->type = TAG_INTEGER;
integer_add(&a->data.integer, &b->data.integer,
&dest->data.integer);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_RATIO:
ratio_init_integer(&r, &a->data.integer);
dest->type = TAG_RATIO;
@@ -280,61 +280,61 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
dest->type = TAG_INTEGER;
integer_add(&a->data.integer, &tmp, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_S16:
integer_init_s16(&tmp, b->data.s16);
dest->type = TAG_INTEGER;
integer_add(&a->data.integer, &tmp, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_S32:
integer_init_s32(&tmp, b->data.s32);
dest->type = TAG_INTEGER;
integer_add(&a->data.integer, &tmp, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_S64:
integer_init_s64(&tmp, b->data.s64);
dest->type = TAG_INTEGER;
integer_add(&a->data.integer, &tmp, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_SW:
integer_init_sw(&tmp, b->data.sw);
dest->type = TAG_INTEGER;
integer_add(&a->data.integer, &tmp, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_U8:
integer_init_u8(&tmp, b->data.u8);
dest->type = TAG_INTEGER;
integer_add(&a->data.integer, &tmp, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_U16:
integer_init_u16(&tmp, b->data.u16);
dest->type = TAG_INTEGER;
integer_add(&a->data.integer, &tmp, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_U32:
integer_init_u32(&tmp, b->data.u32);
dest->type = TAG_INTEGER;
integer_add(&a->data.integer, &tmp, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_U64:
integer_init_u64(&tmp, b->data.u64);
dest->type = TAG_INTEGER;
integer_add(&a->data.integer, &tmp, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_UW:
integer_init_uw(&tmp, b->data.uw);
dest->type = TAG_INTEGER;
integer_add(&a->data.integer, &tmp, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
default:
goto ko;
}
@@ -460,7 +460,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
dest->type = TAG_INTEGER;
integer_add(&tmp, &b->data.integer, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_RATIO:
ratio_init_s8(&r, a->data.s8);
dest->type = TAG_RATIO;
@@ -468,67 +468,39 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
ratio_clean(&r);
return dest;
case TAG_S8:
- if (a->data.s8 < S8_MIN - b->data.s8 ||
- a->data.s8 > S8_MAX - b->data.s8)
- return tag_init_s16(dest, (s16) a->data.s8 + (s16) b->data.s8);
- else
- return tag_init_s8(dest, a->data.s8 + b->data.s8);
+ tag_init_s16(dest, (s16) a->data.s8 + (s16) b->data.s8);
+ return tag_integer_reduce(dest);
case TAG_S16:
- if (a->data.s8 < S16_MIN - b->data.s16 ||
- a->data.s8 > S16_MAX - b->data.s16)
- return tag_init_s32(dest, (s32) a->data.s8 + (s32) b->data.s16);
- else
- return tag_init_s16(dest, (s16) a->data.s8 + b->data.s16);
+ tag_init_s32(dest, (s32) a->data.s8 + (s32) b->data.s16);
+ return tag_integer_reduce(dest);
case TAG_S32:
- if (a->data.s8 < S32_MIN - b->data.s32 ||
- a->data.s8 > S32_MAX - b->data.s32)
- return tag_init_s64(dest, (s64) a->data.s8 + (s64) b->data.s32);
- else
- return tag_init_s32(dest, (s32) a->data.s8 + b->data.s32);
+ tag_init_s64(dest, (s64) a->data.s8 + (s64) b->data.s32);
+ return tag_integer_reduce(dest);
case TAG_S64:
- if (a->data.s8 < S64_MIN - b->data.s64 ||
- a->data.s8 > S64_MAX - b->data.s64) {
- integer_init_s8(&tmp, a->data.s8);
- integer_init_s64(&tmp2, b->data.s64);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, (s64) a->data.s8 + b->data.s64);
+ integer_init_s8(&tmp, a->data.s8);
+ integer_init_s64(&tmp2, b->data.s64);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_SW:
- if (a->data.s8 < SW_MIN - b->data.sw ||
- a->data.s8 > SW_MAX - b->data.sw) {
- integer_init_s8(&tmp, a->data.s8);
- integer_init_sw(&tmp2, b->data.sw);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_sw(dest, (sw) a->data.s8 + b->data.sw);
+ integer_init_s8(&tmp, a->data.s8);
+ integer_init_sw(&tmp2, b->data.sw);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U8:
- if (a->data.s8 < S8_MIN - b->data.u8 ||
- a->data.s8 > S8_MAX - b->data.u8)
- return tag_init_s16(dest, (s16) a->data.s8 + (s16) b->data.u8);
- else
- return tag_init_s8(dest, a->data.s8 + (s8) b->data.u8);
+ tag_init_s16(dest, (s16) a->data.s8 + (s16) b->data.u8);
+ return tag_integer_reduce(dest);
case TAG_U16:
- if (a->data.s8 < S16_MIN - b->data.u16 ||
- a->data.s8 > S16_MAX - b->data.u16)
- return tag_init_s32(dest, (s32) a->data.s8 + (s32) b->data.u16);
- else
- return tag_init_s16(dest, (s16) a->data.s8 + (s16) b->data.u16);
+ tag_init_s32(dest, (s32) a->data.s8 + (s32) b->data.u16);
+ return tag_integer_reduce(dest);
case TAG_U32:
- if (a->data.s8 < (s64) S32_MIN - (s64) b->data.u32 ||
- a->data.s8 > (s64) S32_MAX - (s64) b->data.u32)
- return tag_init_s64(dest, (s64) a->data.s8 + (s64) b->data.u32);
- else
- return tag_init_s32(dest, (s32) a->data.s8 + (s32) b->data.u32);
+ tag_init_s64(dest, (s64) a->data.s8 + (s64) b->data.u32);
+ return tag_integer_reduce(dest);
case TAG_U64:
integer_init_s8(&tmp, a->data.s8);
integer_init_u64(&tmp2, b->data.u64);
@@ -536,7 +508,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_UW:
integer_init_s8(&tmp, a->data.s8);
integer_init_uw(&tmp2, b->data.uw);
@@ -544,7 +516,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
default:
goto ko;
}
@@ -565,7 +537,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
dest->type = TAG_INTEGER;
integer_add(&tmp, &b->data.integer, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_RATIO:
ratio_init_s16(&r, a->data.s16);
dest->type = TAG_RATIO;
@@ -573,61 +545,39 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
ratio_clean(&r);
return dest;
case TAG_S8:
- if (a->data.s16 < S16_MIN - b->data.s8 ||
- a->data.s16 > S16_MAX - b->data.s8)
- return tag_init_s32(dest, (s32) a->data.s16 + (s32) b->data.s8);
- else
- return tag_init_s16(dest, a->data.s16 + (s16) b->data.s8);
+ tag_init_s32(dest, (s32) a->data.s16 + (s32) b->data.s8);
+ return tag_integer_reduce(dest);
case TAG_S16:
- if (a->data.s16 < S16_MIN - b->data.s16 ||
- a->data.s16 > S16_MAX - b->data.s16)
- return tag_init_s32(dest, (s32) a->data.s16 + (s32) b->data.s16);
- else
- return tag_init_s16(dest, a->data.s16 + b->data.s16);
+ tag_init_s32(dest, (s32) a->data.s16 + (s32) b->data.s16);
+ return tag_integer_reduce(dest);
case TAG_S32:
- if (a->data.s16 < S32_MIN - b->data.s32 ||
- a->data.s16 > S32_MAX - b->data.s32)
- return tag_init_s64(dest, (s64) a->data.s16 + (s64) b->data.s32);
- else
- return tag_init_s32(dest, (s32) a->data.s16 + b->data.s32);
+ tag_init_s64(dest, (s64) a->data.s16 + (s64) b->data.s32);
+ return tag_integer_reduce(dest);
case TAG_S64:
- if (a->data.s16 < S64_MIN - b->data.s64 ||
- a->data.s16 > S64_MAX - b->data.s64) {
- integer_init_s16(&tmp, a->data.s16);
- integer_init_s64(&tmp2, b->data.s64);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, (s64) a->data.s16 + b->data.s64);
+ integer_init_s16(&tmp, a->data.s16);
+ integer_init_s64(&tmp2, b->data.s64);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_SW:
- if (a->data.s16 < SW_MIN - b->data.sw ||
- a->data.s16 > SW_MAX - b->data.sw) {
- integer_init_s16(&tmp, a->data.s16);
- integer_init_sw(&tmp2, b->data.sw);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, (s64) a->data.s16 + b->data.s64);
+ integer_init_s16(&tmp, a->data.s16);
+ integer_init_sw(&tmp2, b->data.sw);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U8:
- if (a->data.s16 > S16_MAX - b->data.u8)
- return tag_init_s32(dest, (s32) a->data.s16 + (s32) b->data.u8);
- else
- return tag_init_s16(dest, a->data.s16 + (s16) b->data.u8);
+ tag_init_s32(dest, (s32) a->data.s16 + (s32) b->data.u8);
+ return tag_integer_reduce(dest);
case TAG_U16:
- if (a->data.s16 > S16_MAX - b->data.u16)
- return tag_init_s32(dest, (s32) a->data.s16 + (s32) b->data.u16);
- else
- return tag_init_s16(dest, a->data.s16 + (s16) b->data.u16);
+ tag_init_s32(dest, (s32) a->data.s16 + (s32) b->data.u16);
+ return tag_integer_reduce(dest);
case TAG_U32:
- return tag_init_s64(dest, (s64) a->data.s16 + (s64) b->data.u32);
+ tag_init_s64(dest, (s64) a->data.s16 + (s64) b->data.u32);
+ return tag_integer_reduce(dest);
case TAG_U64:
integer_init_s16(&tmp, a->data.s16);
integer_init_u64(&tmp2, b->data.u64);
@@ -635,7 +585,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_UW:
integer_init_s16(&tmp, a->data.s16);
integer_init_uw(&tmp2, b->data.uw);
@@ -643,7 +593,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
default:
goto ko;
}
@@ -664,7 +614,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
dest->type = TAG_INTEGER;
integer_add(&tmp, &b->data.integer, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_RATIO:
ratio_init_s32(&r, a->data.s32);
dest->type = TAG_RATIO;
@@ -672,70 +622,39 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
ratio_clean(&r);
return dest;
case TAG_S8:
- if (a->data.s32 < S32_MIN - b->data.s8 ||
- a->data.s32 > S32_MAX - b->data.s8)
- return tag_init_s64(dest, (s64) a->data.s32 + (s64) b->data.s8);
- else if (a->data.s32 < S16_MIN - b->data.s8 ||
- a->data.s32 > S16_MAX - b->data.s8)
- return tag_init_s32(dest, a->data.s32 + (s32) b->data.s8);
- else if (a->data.s32 < S8_MIN - b->data.s8 ||
- a->data.s32 > S8_MAX - b->data.s8)
- return tag_init_s16(dest, a->data.s32 + (s32) b->data.s8);
- else
- return tag_init_s8(dest, a->data.s32 + (s32) b->data.s8);
+ tag_init_s64(dest, (s64) a->data.s32 + (s64) b->data.s8);
+ return tag_integer_reduce(dest);
case TAG_S16:
- if (a->data.s32 < S32_MIN - b->data.s16 ||
- a->data.s32 > S32_MAX - b->data.s16)
- return tag_init_s64(dest, (s64) a->data.s32 + (s64) b->data.s16);
- else
- return tag_init_s32(dest, a->data.s32 + (s32) b->data.s16);
+ tag_init_s64(dest, (s64) a->data.s32 + (s64) b->data.s16);
+ return tag_integer_reduce(dest);
case TAG_S32:
- if (a->data.s32 < S32_MIN - b->data.s32 ||
- a->data.s32 > S32_MAX - b->data.s32)
- return tag_init_s64(dest, (s64) a->data.s32 + (s64) b->data.s32);
- else
- return tag_init_s32(dest, a->data.s32 + b->data.s32);
+ tag_init_s64(dest, (s64) a->data.s32 + (s64) b->data.s32);
+ return tag_integer_reduce(dest);
case TAG_S64:
- if (a->data.s32 < S64_MIN - b->data.s64 ||
- a->data.s32 > S64_MAX - b->data.s64) {
- integer_init_s32(&tmp, a->data.s32);
- integer_init_s64(&tmp2, b->data.s64);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, (s64) a->data.s32 + b->data.s64);
+ integer_init_s32(&tmp, a->data.s32);
+ integer_init_s64(&tmp2, b->data.s64);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_SW:
- if (a->data.s32 < SW_MIN - b->data.sw ||
- a->data.s32 > SW_MAX - b->data.sw) {
- integer_init_s32(&tmp, a->data.s32);
- integer_init_sw(&tmp2, b->data.sw);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_sw(dest, (sw) a->data.s32 + b->data.sw);
+ integer_init_s32(&tmp, a->data.s32);
+ integer_init_sw(&tmp2, b->data.sw);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U8:
- if (a->data.s32 > S32_MAX - b->data.u8)
- return tag_init_s64(dest, (s64) a->data.s32 + (s64) b->data.u8);
- else
- return tag_init_s32(dest, a->data.s32 + (s32) b->data.u8);
+ tag_init_s64(dest, (s64) a->data.s32 + (s64) b->data.u8);
+ return tag_integer_reduce(dest);
case TAG_U16:
- if (a->data.s32 > S32_MAX - b->data.u16)
- return tag_init_s64(dest, (s64) a->data.s32 + (s64) b->data.u16);
- else
- return tag_init_s32(dest, a->data.s32 + (s32) b->data.u16);
+ tag_init_s64(dest, (s64) a->data.s32 + (s64) b->data.u16);
+ return tag_integer_reduce(dest);
case TAG_U32:
- if (a->data.s32 > (s64) S32_MAX - (s64) b->data.u32)
- return tag_init_s64(dest, (s64) a->data.s32 + (s64) b->data.u32);
- else
- return tag_init_s32(dest, a->data.s32 + (s32) b->data.u32);
+ tag_init_s64(dest, (s64) a->data.s32 + (s64) b->data.u32);
+ return tag_integer_reduce(dest);
case TAG_U64:
integer_init_s32(&tmp, a->data.s32);
integer_init_u64(&tmp2, b->data.u64);
@@ -743,7 +662,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_UW:
integer_init_s32(&tmp, a->data.s32);
integer_init_uw(&tmp2, b->data.uw);
@@ -751,7 +670,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
default:
goto ko;
}
@@ -772,7 +691,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
dest->type = TAG_INTEGER;
integer_add(&tmp, &b->data.integer, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_RATIO:
ratio_init_s64(&r, a->data.s64);
dest->type = TAG_RATIO;
@@ -780,106 +699,69 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
ratio_clean(&r);
return dest;
case TAG_S8:
- if (a->data.s64 < S64_MIN - b->data.s8 ||
- a->data.s64 > S64_MAX - b->data.s8) {
- integer_init_s64(&tmp, a->data.s64);
- integer_init_s8(&tmp2, b->data.s8);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, a->data.s64 + (s64) b->data.s8);
+ integer_init_s64(&tmp, a->data.s64);
+ integer_init_s8(&tmp2, b->data.s8);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_S16:
- if (a->data.s64 < S64_MIN - b->data.s16 ||
- a->data.s64 > S64_MAX - b->data.s16) {
- integer_init_s64(&tmp, a->data.s64);
- integer_init_s16(&tmp2, b->data.s16);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, a->data.s64 + (s64) b->data.s16);
+ integer_init_s64(&tmp, a->data.s64);
+ integer_init_s16(&tmp2, b->data.s16);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_S32:
- if (a->data.s64 < S64_MIN - b->data.s32 ||
- a->data.s64 > S64_MAX - b->data.s32) {
- integer_init_s64(&tmp, a->data.s64);
- integer_init_s32(&tmp2, b->data.s32);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, a->data.s64 + (s64) b->data.s32);
+ integer_init_s64(&tmp, a->data.s64);
+ integer_init_s32(&tmp2, b->data.s32);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_S64:
- if (a->data.s64 < S64_MIN - b->data.s64 ||
- a->data.s64 > S64_MAX - b->data.s64) {
- integer_init_s64(&tmp, a->data.s64);
- integer_init_s64(&tmp2, b->data.s64);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, a->data.s64 + b->data.s64);
+ integer_init_s64(&tmp, a->data.s64);
+ integer_init_s64(&tmp2, b->data.s64);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_SW:
- if (a->data.s64 < S64_MIN - (s64) b->data.sw ||
- a->data.s64 > S64_MAX - (s64) b->data.sw) {
- integer_init_s64(&tmp, a->data.s64);
- integer_init_sw(&tmp2, b->data.sw);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, a->data.s64 + b->data.s64);
+ integer_init_s64(&tmp, a->data.s64);
+ integer_init_sw(&tmp2, b->data.sw);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U8:
- if (a->data.s64 > S64_MAX - b->data.u8) {
- integer_init_s64(&tmp, a->data.s64);
- integer_init_u8(&tmp2, b->data.u8);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, a->data.s64 + (s64) b->data.u8);
+ integer_init_s64(&tmp, a->data.s64);
+ integer_init_u8(&tmp2, b->data.u8);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U16:
- if (a->data.s64 > S64_MAX - b->data.u16) {
- integer_init_s64(&tmp, a->data.s64);
- integer_init_u16(&tmp2, b->data.u16);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, a->data.s64 + (s64) b->data.u16);
+ integer_init_s64(&tmp, a->data.s64);
+ integer_init_u16(&tmp2, b->data.u16);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U32:
- if (a->data.s64 > S64_MAX - b->data.u32) {
- integer_init_s64(&tmp, a->data.s64);
- integer_init_u32(&tmp2, b->data.u32);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, a->data.s64 + (s64) b->data.u32);
+ integer_init_s64(&tmp, a->data.s64);
+ integer_init_u32(&tmp2, b->data.u32);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U64:
integer_init_s64(&tmp, a->data.s64);
integer_init_u64(&tmp2, b->data.u64);
@@ -887,7 +769,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_UW:
integer_init_s64(&tmp, a->data.s64);
integer_init_uw(&tmp2, b->data.uw);
@@ -895,7 +777,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
default:
goto ko;
}
@@ -916,7 +798,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
dest->type = TAG_INTEGER;
integer_add(&tmp, &b->data.integer, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_RATIO:
ratio_init_sw(&r, a->data.sw);
dest->type = TAG_RATIO;
@@ -924,106 +806,69 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
ratio_clean(&r);
return dest;
case TAG_S8:
- if (a->data.sw < SW_MIN - b->data.s8 ||
- a->data.sw > SW_MAX - b->data.s8) {
- integer_init_sw(&tmp, a->data.sw);
- integer_init_s8(&tmp2, b->data.s8);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_sw(dest, a->data.sw + (sw) b->data.s8);
+ integer_init_sw(&tmp, a->data.sw);
+ integer_init_s8(&tmp2, b->data.s8);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_S16:
- if (a->data.sw < SW_MIN - b->data.s16 ||
- a->data.sw > SW_MAX - b->data.s16) {
- integer_init_sw(&tmp, a->data.sw);
- integer_init_s16(&tmp2, b->data.s16);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_sw(dest, a->data.sw + (sw) b->data.s16);
+ integer_init_sw(&tmp, a->data.sw);
+ integer_init_s16(&tmp2, b->data.s16);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_S32:
- if (a->data.sw < SW_MIN - b->data.s32 ||
- a->data.sw > SW_MAX - b->data.s32) {
- integer_init_sw(&tmp, a->data.sw);
- integer_init_s32(&tmp2, b->data.s32);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_sw(dest, a->data.sw + (sw) b->data.s32);
+ integer_init_sw(&tmp, a->data.sw);
+ integer_init_s32(&tmp2, b->data.s32);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_S64:
- if (a->data.sw < S64_MIN - b->data.s64 ||
- a->data.sw > S64_MAX - b->data.s64) {
- integer_init_sw(&tmp, a->data.sw);
- integer_init_s64(&tmp2, b->data.s64);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, (s64) a->data.sw + b->data.s64);
+ integer_init_sw(&tmp, a->data.sw);
+ integer_init_s64(&tmp2, b->data.s64);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_SW:
- if (a->data.sw < SW_MIN - b->data.sw ||
- a->data.sw > SW_MAX - b->data.sw) {
- integer_init_sw(&tmp, a->data.sw);
- integer_init_sw(&tmp2, b->data.sw);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_sw(dest, a->data.sw + b->data.sw);
+ integer_init_sw(&tmp, a->data.sw);
+ integer_init_sw(&tmp2, b->data.sw);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U8:
- if (a->data.sw > SW_MAX - b->data.u8) {
- integer_init_sw(&tmp, a->data.sw);
- integer_init_u8(&tmp2, b->data.u8);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_sw(dest, a->data.sw + (sw) b->data.u8);
+ integer_init_sw(&tmp, a->data.sw);
+ integer_init_u8(&tmp2, b->data.u8);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U16:
- if (a->data.sw > SW_MAX - b->data.u16) {
- integer_init_sw(&tmp, a->data.sw);
- integer_init_u16(&tmp2, b->data.u16);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_sw(dest, a->data.sw + (sw) b->data.u16);
+ integer_init_sw(&tmp, a->data.sw);
+ integer_init_u16(&tmp2, b->data.u16);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U32:
- if (a->data.sw > (sw) (SW_MAX - b->data.u32)) {
- integer_init_sw(&tmp, a->data.sw);
- integer_init_u32(&tmp2, b->data.u32);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_sw(dest, a->data.sw + (sw) b->data.u32);
+ integer_init_sw(&tmp, a->data.sw);
+ integer_init_u32(&tmp2, b->data.u32);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U64:
integer_init_sw(&tmp, a->data.sw);
integer_init_u64(&tmp2, b->data.u64);
@@ -1031,7 +876,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_UW:
integer_init_sw(&tmp, a->data.sw);
integer_init_uw(&tmp2, b->data.uw);
@@ -1039,7 +884,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
default:
goto ko;
}
@@ -1060,7 +905,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
dest->type = TAG_INTEGER;
integer_add(&tmp, &b->data.integer, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_RATIO:
ratio_init_u8(&r, a->data.u8);
dest->type = TAG_RATIO;
@@ -1068,83 +913,55 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
ratio_clean(&r);
return dest;
case TAG_S8:
- if (a->data.u8 > S8_MAX - b->data.s8)
- return tag_init_s16(dest, (s16) a->data.u8 + (s16) b->data.s8);
- else
- return tag_init_s8(dest, (s8) a->data.u8 + b->data.s8);
+ tag_init_s16(dest, (s16) a->data.u8 + (s16) b->data.s8);
+ return tag_integer_reduce(dest);
case TAG_S16:
- if (a->data.u8 > S16_MAX - b->data.s16)
- return tag_init_s32(dest, (s32) a->data.u8 + (s32) b->data.s16);
- else
- return tag_init_s16(dest, (s16) a->data.u8 + b->data.s16);
+ tag_init_s32(dest, (s32) a->data.u8 + (s32) b->data.s16);
+ return tag_integer_reduce(dest);
case TAG_S32:
- if (a->data.u8 > S32_MAX - b->data.s32)
- return tag_init_s64(dest, (s64) a->data.u8 + (s64) b->data.s32);
- else
- return tag_init_s32(dest, (s32) a->data.u8 + b->data.s32);
+ tag_init_s64(dest, (s64) a->data.u8 + (s64) b->data.s32);
+ return tag_integer_reduce(dest);
case TAG_S64:
- if (a->data.u8 > S64_MAX - b->data.s64) {
- integer_init_u8(&tmp, a->data.u8);
- integer_init_s64(&tmp2, b->data.s64);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, (s64) a->data.u8 + b->data.s64);
+ integer_init_u8(&tmp, a->data.u8);
+ integer_init_s64(&tmp2, b->data.s64);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_SW:
- if (a->data.u8 > SW_MAX - b->data.sw) {
- integer_init_u8(&tmp, a->data.u8);
- integer_init_sw(&tmp2, b->data.sw);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, (s64) a->data.u8 + b->data.s64);
+ integer_init_u8(&tmp, a->data.u8);
+ integer_init_sw(&tmp2, b->data.sw);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U8:
- if (a->data.u8 > U8_MAX - b->data.u8)
- return tag_init_u16(dest, (u16) a->data.u8 + (u16) b->data.u8);
- else
- return tag_init_u8(dest, a->data.u8 + b->data.u8);
+ tag_init_u16(dest, (u16) a->data.u8 + (u16) b->data.u8);
+ return tag_integer_reduce(dest);
case TAG_U16:
- if (a->data.u8 > U16_MAX - b->data.u16)
- return tag_init_u32(dest, (u32) a->data.u8 + (u32) b->data.u16);
- else
- return tag_init_u16(dest, (u16) a->data.u8 + b->data.u16);
+ tag_init_u32(dest, (u32) a->data.u8 + (u32) b->data.u16);
+ return tag_integer_reduce(dest);
case TAG_U32:
- if (a->data.u8 > U32_MAX - b->data.u32)
- return tag_init_u64(dest, (u64) a->data.u8 + (u64) b->data.u32);
- else
- return tag_init_u32(dest, (u32) a->data.u8 + b->data.u32);
+ tag_init_u64(dest, (u64) a->data.u8 + (u64) b->data.u32);
+ return tag_integer_reduce(dest);
case TAG_U64:
- if (a->data.u8 > U64_MAX - b->data.u64) {
- integer_init_u8(&tmp, a->data.u8);
- integer_init_u64(&tmp2, b->data.u64);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_u64(dest, (u64) a->data.u8 + b->data.u64);
+ integer_init_u8(&tmp, a->data.u8);
+ integer_init_u64(&tmp2, b->data.u64);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_UW:
- if (a->data.u8 > UW_MAX - b->data.uw) {
- integer_init_u8(&tmp, a->data.u8);
- integer_init_uw(&tmp2, b->data.uw);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_uw(dest, (uw) a->data.u8 + b->data.uw);
+ integer_init_u8(&tmp, a->data.u8);
+ integer_init_uw(&tmp2, b->data.uw);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
default:
goto ko;
}
@@ -1165,7 +982,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
dest->type = TAG_INTEGER;
integer_add(&tmp, &b->data.integer, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_RATIO:
ratio_init_u16(&r, a->data.u16);
dest->type = TAG_RATIO;
@@ -1173,83 +990,55 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
ratio_clean(&r);
return dest;
case TAG_S8:
- if (a->data.u16 > S16_MAX - b->data.s8)
- return tag_init_s32(dest, (s32) a->data.u16 + (s32) b->data.s8);
- else
- return tag_init_s16(dest, (s16) a->data.u16 + (s16) b->data.s8);
+ tag_init_s32(dest, (s32) a->data.u16 + (s32) b->data.s8);
+ return tag_integer_reduce(dest);
case TAG_S16:
- if (a->data.u16 > S16_MAX - b->data.s16)
- return tag_init_s32(dest, (s32) a->data.u16 + (s32) b->data.s16);
- else
- return tag_init_s16(dest, (s16) a->data.u16 + b->data.s16);
+ tag_init_s32(dest, (s32) a->data.u16 + (s32) b->data.s16);
+ return tag_integer_reduce(dest);
case TAG_S32:
- if (a->data.u16 > S32_MAX - b->data.s32)
- return tag_init_s64(dest, (s64) a->data.u16 + (s64) b->data.s32);
- else
- return tag_init_s32(dest, (s32) a->data.u16 + b->data.s32);
+ tag_init_s64(dest, (s64) a->data.u16 + (s64) b->data.s32);
+ return tag_integer_reduce(dest);
case TAG_S64:
- if (a->data.u16 > S64_MAX - b->data.s64) {
- integer_init_u16(&tmp, a->data.u16);
- integer_init_s64(&tmp2, b->data.s64);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, (s64) a->data.u16 + b->data.s64);
+ integer_init_u16(&tmp, a->data.u16);
+ integer_init_s64(&tmp2, b->data.s64);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_SW:
- if (a->data.u16 > SW_MAX - b->data.sw) {
- integer_init_u16(&tmp, a->data.u16);
- integer_init_sw(&tmp2, b->data.sw);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_sw(dest, (sw) a->data.u16 + b->data.sw);
+ integer_init_u16(&tmp, a->data.u16);
+ integer_init_sw(&tmp2, b->data.sw);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U8:
- if (a->data.u16 > U16_MAX - b->data.u8)
- return tag_init_u32(dest, (u32) a->data.u16 + (u32) b->data.u8);
- else
- return tag_init_u16(dest, a->data.u16 + (u16) b->data.u8);
+ tag_init_u32(dest, (u32) a->data.u16 + (u32) b->data.u8);
+ return tag_integer_reduce(dest);
case TAG_U16:
- if (a->data.u16 > U16_MAX - b->data.u16)
- return tag_init_u32(dest, (u32) a->data.u16 + (u32) b->data.u16);
- else
- return tag_init_u16(dest, a->data.u16 + b->data.u16);
+ tag_init_u32(dest, (u32) a->data.u16 + (u32) b->data.u16);
+ return tag_integer_reduce(dest);
case TAG_U32:
- if (a->data.u16 > U32_MAX - b->data.u32)
- return tag_init_u64(dest, (u64) a->data.u16 + (u64) b->data.u32);
- else
- return tag_init_u32(dest, (u32) a->data.u16 + b->data.u32);
+ tag_init_u64(dest, (u64) a->data.u16 + (u64) b->data.u32);
+ return tag_integer_reduce(dest);
case TAG_U64:
- if (a->data.u16 > U64_MAX - b->data.u64) {
- integer_init_u32(&tmp, (u32) a->data.u16);
- integer_init_u64(&tmp2, b->data.u64);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_u64(dest, (u64) a->data.u16 + b->data.u64);
+ integer_init_u32(&tmp, (u32) a->data.u16);
+ integer_init_u64(&tmp2, b->data.u64);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_UW:
- if (a->data.u16 > UW_MAX - b->data.uw) {
- integer_init_u16(&tmp, a->data.u16);
- integer_init_uw(&tmp2, b->data.uw);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_uw(dest, (uw) a->data.u16 + b->data.uw);
+ integer_init_u16(&tmp, a->data.u16);
+ integer_init_uw(&tmp2, b->data.uw);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
default:
goto ko;
}
@@ -1270,7 +1059,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
dest->type = TAG_INTEGER;
integer_add(&tmp, &b->data.integer, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_RATIO:
ratio_init_u32(&r, a->data.u32);
dest->type = TAG_RATIO;
@@ -1278,83 +1067,55 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
ratio_clean(&r);
return dest;
case TAG_S8:
- if ((s64) a->data.u32 > S32_MAX - b->data.s8)
- return tag_init_s64(dest, (s64) a->data.u32 + (s64) b->data.s8);
- else
- return tag_init_s32(dest, (s32) a->data.u32 + (s32) b->data.s8);
+ tag_init_s64(dest, (s64) a->data.u32 + (s64) b->data.s8);
+ return tag_integer_reduce(dest);
case TAG_S16:
- if ((s64) a->data.u32 > S32_MAX - b->data.s16)
- return tag_init_s64(dest, (s64) a->data.u32 + (s64) b->data.s16);
- else
- return tag_init_s32(dest, (s32) a->data.u32 + (s32) b->data.s16);
+ tag_init_s64(dest, (s64) a->data.u32 + (s64) b->data.s16);
+ return tag_integer_reduce(dest);
case TAG_S32:
- if ((s64) a->data.u32 > S32_MAX - b->data.s32)
- return tag_init_s64(dest, (s64) a->data.u32 + (s64) b->data.s32);
- else
- return tag_init_s32(dest, (s32) a->data.u32 + b->data.s32);
+ tag_init_s64(dest, (s64) a->data.u32 + (s64) b->data.s32);
+ return tag_integer_reduce(dest);
case TAG_S64:
- if (a->data.u32 > S64_MAX - b->data.s64) {
- integer_init_u32(&tmp, a->data.u32);
- integer_init_s64(&tmp2, b->data.s64);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_s64(dest, (s64) a->data.u32 + b->data.s64);
+ integer_init_u32(&tmp, a->data.u32);
+ integer_init_s64(&tmp2, b->data.s64);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_SW:
- if (a->data.u32 > (u32) (SW_MAX - b->data.sw)) {
- integer_init_u32(&tmp, a->data.u32);
- integer_init_sw(&tmp2, b->data.sw);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_sw(dest, (sw) a->data.u32 + b->data.sw);
+ integer_init_u32(&tmp, a->data.u32);
+ integer_init_sw(&tmp2, b->data.sw);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U8:
- if (a->data.u32 > U32_MAX - b->data.u8)
- return tag_init_u64(dest, (u64) a->data.u32 + (u64) b->data.u8);
- else
- return tag_init_u32(dest, a->data.u32 + (u32) b->data.u8);
+ tag_init_u64(dest, (u64) a->data.u32 + (u64) b->data.u8);
+ return tag_integer_reduce(dest);
case TAG_U16:
- if (a->data.u32 > U32_MAX - b->data.u16)
- return tag_init_u64(dest, (u64) a->data.u32 + (u64) b->data.u16);
- else
- return tag_init_u32(dest, a->data.u32 + (u32) b->data.u16);
+ tag_init_u64(dest, (u64) a->data.u32 + (u64) b->data.u16);
+ return tag_integer_reduce(dest);
case TAG_U32:
- if (a->data.u32 > U32_MAX - b->data.u32)
- return tag_init_u64(dest, (u64) a->data.u32 + (u64) b->data.u32);
- else
- return tag_init_u32(dest, a->data.u32 + b->data.u32);
+ tag_init_u64(dest, (u64) a->data.u32 + (u64) b->data.u32);
+ return tag_integer_reduce(dest);
case TAG_U64:
- if (a->data.u32 > U64_MAX - b->data.u64) {
- integer_init_u32(&tmp, a->data.u32);
- integer_init_u64(&tmp2, b->data.u64);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_u64(dest, (u64) a->data.u32 + b->data.u64);
+ integer_init_u32(&tmp, a->data.u32);
+ integer_init_u64(&tmp2, b->data.u64);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_UW:
- if (a->data.u32 > UW_MAX - b->data.uw) {
- integer_init_u32(&tmp, a->data.u32);
- integer_init_uw(&tmp2, b->data.uw);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_uw(dest, (uw) a->data.u32 + b->data.uw);
+ integer_init_u32(&tmp, a->data.u32);
+ integer_init_uw(&tmp2, b->data.uw);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
default:
goto ko;
}
@@ -1375,7 +1136,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
dest->type = TAG_INTEGER;
integer_add(&tmp, &b->data.integer, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_RATIO:
ratio_init_u64(&r, a->data.u64);
dest->type = TAG_RATIO;
@@ -1389,7 +1150,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_S16:
integer_init_u64(&tmp, a->data.u64);
integer_init_s16(&tmp2, b->data.s16);
@@ -1397,7 +1158,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_S32:
integer_init_u64(&tmp, a->data.u64);
integer_init_s32(&tmp2, b->data.s32);
@@ -1405,7 +1166,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_S64:
integer_init_u64(&tmp, a->data.u64);
integer_init_s64(&tmp2, b->data.s64);
@@ -1413,7 +1174,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_SW:
integer_init_u64(&tmp, a->data.u64);
integer_init_sw(&tmp2, b->data.sw);
@@ -1421,67 +1182,47 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_U8:
- if (a->data.u64 > U64_MAX - b->data.u8) {
- integer_init_u64(&tmp, a->data.u64);
- integer_init_u8(&tmp2, b->data.u8);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_u64(dest, a->data.u64 + (u64) b->data.u8);
+ integer_init_u64(&tmp, a->data.u64);
+ integer_init_u8(&tmp2, b->data.u8);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U16:
- if (a->data.u64 > U64_MAX - b->data.u16) {
- integer_init_u64(&tmp, a->data.u64);
- integer_init_u16(&tmp2, b->data.u16);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_u64(dest, a->data.u64 + (u64) b->data.u16);
+ integer_init_u64(&tmp, a->data.u64);
+ integer_init_u16(&tmp2, b->data.u16);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U32:
- if (a->data.u64 > U64_MAX - b->data.u32) {
- integer_init_u64(&tmp, a->data.u64);
- integer_init_u32(&tmp2, b->data.u32);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_u64(dest, a->data.u64 + (u64) b->data.u32);
+ integer_init_u64(&tmp, a->data.u64);
+ integer_init_u32(&tmp2, b->data.u32);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U64:
- if (a->data.u64 > U64_MAX - b->data.u64) {
- integer_init_u64(&tmp, a->data.u64);
- integer_init_u64(&tmp2, b->data.u64);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_u64(dest, a->data.u64 + b->data.u64);
+ integer_init_u64(&tmp, a->data.u64);
+ integer_init_u64(&tmp2, b->data.u64);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_UW:
- if (a->data.u64 > U64_MAX - b->data.uw) {
- integer_init_u64(&tmp, a->data.u64);
- integer_init_uw(&tmp2, b->data.uw);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_u64(dest, a->data.u64 + b->data.uw);
+ integer_init_u64(&tmp, a->data.u64);
+ integer_init_uw(&tmp2, b->data.uw);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
default:
goto ko;
}
@@ -1502,7 +1243,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
dest->type = TAG_INTEGER;
integer_add(&tmp, &b->data.integer, &dest->data.integer);
integer_clean(&tmp);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_RATIO:
ratio_init_uw(&r, a->data.uw);
dest->type = TAG_RATIO;
@@ -1516,7 +1257,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_S16:
integer_init_uw(&tmp, a->data.uw);
integer_init_s16(&tmp2, b->data.s16);
@@ -1524,7 +1265,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_S32:
integer_init_uw(&tmp, a->data.uw);
integer_init_s32(&tmp2, b->data.s32);
@@ -1532,7 +1273,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_S64:
integer_init_uw(&tmp, a->data.uw);
integer_init_s64(&tmp2, b->data.s64);
@@ -1540,7 +1281,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_SW:
integer_init_uw(&tmp, a->data.uw);
integer_init_sw(&tmp2, b->data.sw);
@@ -1548,67 +1289,47 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&tmp, &tmp2, &dest->data.integer);
integer_clean(&tmp);
integer_clean(&tmp2);
- return dest;
+ return tag_integer_reduce(dest);
case TAG_U8:
- if (a->data.uw > UW_MAX - b->data.u8) {
- integer_init_uw(&tmp, a->data.uw);
- integer_init_u8(&tmp2, b->data.u8);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_uw(dest, a->data.uw + (uw) b->data.u8);
+ integer_init_uw(&tmp, a->data.uw);
+ integer_init_u8(&tmp2, b->data.u8);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U16:
- if (a->data.uw > UW_MAX - b->data.u16) {
- integer_init_uw(&tmp, a->data.uw);
- integer_init_u16(&tmp2, b->data.u16);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_uw(dest, a->data.uw + (uw) b->data.u16);
+ integer_init_uw(&tmp, a->data.uw);
+ integer_init_u16(&tmp2, b->data.u16);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U32:
- if (a->data.uw > UW_MAX - b->data.u32) {
- integer_init_uw(&tmp, a->data.uw);
- integer_init_u32(&tmp2, b->data.u32);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_uw(dest, a->data.uw + (uw) b->data.u32);
+ integer_init_uw(&tmp, a->data.uw);
+ integer_init_u32(&tmp2, b->data.u32);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_U64:
- if (a->data.uw > U64_MAX - b->data.u64) {
- integer_init_uw(&tmp, a->data.uw);
- integer_init_u64(&tmp2, b->data.u64);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_u64(dest, (u64) a->data.uw + b->data.u64);
+ integer_init_uw(&tmp, a->data.uw);
+ integer_init_u64(&tmp2, b->data.u64);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
case TAG_UW:
- if (a->data.uw > UW_MAX - b->data.uw) {
- integer_init_uw(&tmp, a->data.uw);
- integer_init_uw(&tmp2, b->data.uw);
- dest->type = TAG_INTEGER;
- integer_add(&tmp, &tmp2, &dest->data.integer);
- integer_clean(&tmp);
- integer_clean(&tmp2);
- return dest;
- }
- else
- return tag_init_uw(dest, a->data.uw + b->data.uw);
+ integer_init_uw(&tmp, a->data.uw);
+ integer_init_uw(&tmp2, b->data.uw);
+ dest->type = TAG_INTEGER;
+ integer_add(&tmp, &tmp2, &dest->data.integer);
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return tag_integer_reduce(dest);
default:
goto ko;
}