diff options
Diffstat (limited to 'rushs/tinyprintf/variant/variant.c')
| -rw-r--r-- | rushs/tinyprintf/variant/variant.c | 96 |
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; +} |
