diff --git a/libc3/ratio.c b/libc3/ratio.c
index b162fe9..7da0ad5 100644
--- a/libc3/ratio.c
+++ b/libc3/ratio.c
@@ -109,12 +109,6 @@ s_ratio * ratio_init (s_ratio *dest)
{
s_ratio tmp = {0};
assert(dest);
- if (! integer_init(&tmp.numerator))
- return NULL;
- if (! integer_init(&tmp.denominator)) {
- integer_clean(&tmp.numerator);
- return NULL;
- }
*dest = tmp;
return dest;
}
@@ -162,6 +156,33 @@ s_ratio * ratio_init_copy (s_ratio *dest, const s_ratio *src)
return dest;
}
+s_ratio * ratio_init_f32 (s_ratio *r, f32 x)
+{
+ assert(r);
+ ratio_init(r);
+ integer_init_f32(&r->numerator, x);
+ integer_init_s32(&r->denominator, 1);
+ return r;
+}
+
+s_ratio * ratio_init_f64 (s_ratio *r, f64 x)
+{
+ assert(r);
+ ratio_init(r);
+ integer_init_f64(&r->numerator, x);
+ integer_init_s32(&r->denominator, 1);
+ return r;
+}
+
+s_ratio * ratio_init_f128 (s_ratio *r, f128 x)
+{
+ assert(r);
+ ratio_init(r);
+ integer_init_f128(&r->numerator, x);
+ integer_init_s32(&r->denominator, 1);
+ return r;
+}
+
s_ratio * ratio_init_integer (s_ratio *r, const s_integer *src)
{
s_ratio tmp = {0};
@@ -177,6 +198,96 @@ s_ratio * ratio_init_integer (s_ratio *r, const s_integer *src)
return r;
}
+s_ratio * ratio_init_s8(s_ratio *r, s8 x)
+{
+ assert(r);
+ ratio_init(r);
+ integer_init_s8(&r->numerator, x);
+ integer_init_u8(&r->denominator, 1);
+ return r;
+}
+
+s_ratio * ratio_init_s16(s_ratio *r, s16 x)
+{
+ assert(r);
+ ratio_init(r);
+ integer_init_s16(&r->numerator, x);
+ integer_init_u8(&r->denominator, 1);
+ return r;
+}
+
+s_ratio * ratio_init_s32 (s_ratio *r, s32 x)
+{
+ assert(r);
+ ratio_init(r);
+ integer_init_s32(&r->numerator, x);
+ integer_init_u8(&r->denominator, 1);
+ return r;
+}
+
+s_ratio * ratio_init_s64 (s_ratio *r, s64 x)
+{
+ assert(r);
+ ratio_init(r);
+ integer_init_s64(&r->numerator, x);
+ integer_init_u8(&r->denominator, 1);
+ return r;
+}
+
+s_ratio * ratio_init_sw (s_ratio *r, sw x)
+{
+ assert(r);
+ ratio_init(r);
+ integer_init_sw(&r->numerator, x);
+ integer_init_u8(&r->denominator, 1);
+ return r;
+}
+
+s_ratio * ratio_init_u8 (s_ratio *r, u8 x)
+{
+ assert(r);
+ ratio_init(r);
+ integer_init_u8(&r->numerator, x);
+ integer_init_u8(&r->denominator, 1);
+ return r;
+}
+
+s_ratio * ratio_init_u16 (s_ratio *r, u16 x)
+{
+ assert(r);
+ ratio_init(r);
+ integer_init_u16(&r->numerator, x);
+ integer_init_u8(&r->denominator, 1);
+ return r;
+}
+
+s_ratio * ratio_init_u32 (s_ratio *r, u32 x)
+{
+ assert(r);
+ ratio_init(r);
+ integer_init_u32(&r->numerator, x);
+ integer_init_u8(&r->denominator, 1);
+ return r;
+}
+
+s_ratio * ratio_init_u64 (s_ratio *r, u64 x)
+{
+ assert(r);
+ ratio_init(r);
+ integer_init_u64(&r->numerator, x);
+ integer_init_u8(&r->denominator, 1);
+ return r;
+}
+
+s_ratio * ratio_init_uw (s_ratio *r, uw x)
+{
+ assert(r);
+ ratio_init(r);
+ integer_init_uw(&r->numerator, x);
+ integer_init_u8(&r->denominator, 1);
+ return r;
+}
+
s_ratio * ratio_init_zero (s_ratio *r)
{
s_ratio tmp = {0};
diff --git a/libc3/tag_add.c b/libc3/tag_add.c
index b8ce45b..b45f8be 100644
--- a/libc3/tag_add.c
+++ b/libc3/tag_add.c
@@ -21,6 +21,7 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
s_complex c;
s_integer tmp;
s_integer tmp2;
+ s_ratio r;
assert(a);
assert(b);
assert(dest);
@@ -237,6 +238,8 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
integer_add(&a->data.integer, &b->data.integer,
&dest->data.integer);
return dest;
+ case TAG_RATIO:
+
case TAG_S8:
integer_init_s8(&tmp, b->data.s8);
dest->type = TAG_INTEGER;
@@ -313,10 +316,29 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
complex_clean(&c);
return dest;
case TAG_F32:
+ ratio_init_f32(&r, b->data.f32);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
case TAG_F64:
+ ratio_init_f64(&r, b->data.f64);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
case TAG_F128:
+ ratio_init_f128(&r, b->data.f128);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
case TAG_INTEGER:
- goto ko;
+ ratio_init_integer(&r, &b->data.integer);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
case TAG_RATIO:
if (! ratio_add(&a->data.ratio, &b->data.ratio,
&dest->data.ratio))
@@ -324,15 +346,65 @@ s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest)
dest->type = TAG_RATIO;
return dest;
case TAG_S8:
+ ratio_init_s8(&r, b->data.s8);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
case TAG_S16:
+ ratio_init_s16(&r, b->data.s16);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
case TAG_S32:
+ ratio_init_s32(&r, b->data.s32);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
case TAG_S64:
+ ratio_init_s64(&r, b->data.s64);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
case TAG_SW:
+ ratio_init_sw(&r, b->data.sw);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
case TAG_U8:
+ ratio_init_u8(&r, b->data.u8);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
case TAG_U16:
+ ratio_init_u16(&r, b->data.u16);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
case TAG_U32:
+ ratio_init_u32(&r, b->data.u32);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
case TAG_U64:
+ ratio_init_u64(&r, b->data.u64);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
case TAG_UW:
+ ratio_init_uw(&r, b->data.uw);
+ dest->type = TAG_RATIO;
+ ratio_add(&a->data.ratio, &r, &dest->data.ratio);
+ ratio_clean(&r);
+ return dest;
default:
goto ko;
}