Commit 36b5651ef88080f245f7f89de8fdff62bc99273e

Baptiste 2024-03-07T18:13:26

more cases handled in the tag_add for ratios

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;
     }