summaryrefslogtreecommitdiff
path: root/rushs/tinyprintf/variant/variant.c
diff options
context:
space:
mode:
Diffstat (limited to 'rushs/tinyprintf/variant/variant.c')
-rw-r--r--rushs/tinyprintf/variant/variant.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/rushs/tinyprintf/variant/variant.c b/rushs/tinyprintf/variant/variant.c
new file mode 100644
index 0000000..eb2f8a8
--- /dev/null
+++ b/rushs/tinyprintf/variant/variant.c
@@ -0,0 +1,96 @@
+#include "variant.h"
+
+#include <stdio.h>
+#include <string.h>
+
+void variant_display(const struct variant *e)
+{
+ switch (e->type)
+ {
+ case (TYPE_INT):
+ printf("%d\n", e->value.int_v);
+ break;
+ case (TYPE_FLOAT):
+ printf("%f\n", e->value.float_v);
+ break;
+ case (TYPE_CHAR):
+ printf("%c\n", e->value.char_v);
+ break;
+ default:
+ printf("%s\n", e->value.str_v);
+ break;
+ }
+}
+
+bool variant_equal(const struct variant *left, const struct variant *right)
+{
+ if (left == NULL || right == NULL)
+ {
+ return true;
+ }
+ switch (left->type)
+ {
+ case (TYPE_INT):
+ if (right->type != TYPE_INT)
+ {
+ return false;
+ }
+ return left->value.int_v == right->value.int_v;
+ case (TYPE_FLOAT):
+ if (right->type != TYPE_FLOAT)
+ {
+ return false;
+ }
+ return left->value.float_v == right->value.float_v;
+ case (TYPE_CHAR):
+ if (right->type != TYPE_CHAR)
+ {
+ return false;
+ }
+ return left->value.char_v == right->value.char_v;
+ default:
+ if (right->type != TYPE_STRING)
+ {
+ return false;
+ }
+ return strcmp(left->value.str_v, right->value.str_v) == 0;
+ }
+}
+
+int variant_find(const struct variant *array, size_t len, enum type type,
+ union type_any value)
+{
+ size_t i;
+ struct variant cmp = { type, value };
+ for (i = 0; i < len && variant_equal(array + i, &cmp) == false; i++)
+ {
+ continue;
+ }
+
+ if (i == len)
+ {
+ return -1;
+ }
+ return i;
+}
+
+float variant_sum(const struct variant *array, size_t len)
+{
+ if (array == NULL)
+ {
+ return 0;
+ }
+ float sum = 0;
+ for (size_t i = 0; i < len; i++)
+ {
+ if (array[i].type == TYPE_FLOAT)
+ {
+ sum += array[i].value.float_v;
+ }
+ else if (array[i].type == TYPE_INT)
+ {
+ sum += array[i].value.int_v;
+ }
+ }
+ return sum;
+}