diff options
| author | Martial Simon <msimon_fr@hotmail.com> | 2025-10-11 22:20:05 +0200 |
|---|---|---|
| committer | Martial Simon <msimon_fr@hotmail.com> | 2025-10-11 22:20:05 +0200 |
| commit | 3b27def26196cc96fe14fc8333d9e66189d6230f (patch) | |
| tree | 3b1c1d0e0d4a924cbd605ed99a339dbb3218c5c4 /graphs/piscine/evalexpr/src/evalrpn.c | |
| parent | 73c2b00a10c5786ddeeacc915e233fd4df1c9321 (diff) | |
Diffstat (limited to 'graphs/piscine/evalexpr/src/evalrpn.c')
| -rw-r--r-- | graphs/piscine/evalexpr/src/evalrpn.c | 145 |
1 files changed, 0 insertions, 145 deletions
diff --git a/graphs/piscine/evalexpr/src/evalrpn.c b/graphs/piscine/evalexpr/src/evalrpn.c deleted file mode 100644 index db493eb..0000000 --- a/graphs/piscine/evalexpr/src/evalrpn.c +++ /dev/null @@ -1,145 +0,0 @@ -#include <ctype.h> - -#include "evalexpr.h" - -int parse_number(const char *expr, size_t *offset) -{ - for (*offset = 0; - expr[*offset] && expr[*offset] >= '0' && expr[*offset] <= '9'; - (*offset)++) - { - continue; - } - (*offset)--; - - int res = 0; - int pow = 1; - for (size_t n = 0; n <= *offset; n++, pow *= 10) - { - res += (expr[*offset - n] - '0') * pow; - } - - return res; -} - -int get_operands(struct stack **s, int *op1, int *op2) -{ - if (*s == NULL) - { - return 2; - } - *op1 = stack_peek(*s); - *s = stack_pop(*s); - if (*s == NULL) - { - return 2; - } - *op2 = stack_peek(*s); - *s = stack_pop(*s); - return 0; -} - -// Computes a to the bth -int my_pow(int a, int b) -{ - if (b == 0) - { - return 1; - } - if (a == 0) - { - return 0; - } - - int res = 1; - int c = b / 2; - while (c != 0) - { - res *= a * a; - c /= 2; - } - if (b % 2 != 0) - res *= a; - return res; -} - -int dispatch(const char c, struct stack **s, int op1, int op2) -{ - switch (c) - { - case '*': - *s = stack_push(*s, op1 * op2); - break; - case '+': - *s = stack_push(*s, op1 + op2); - break; - case '-': - *s = stack_push(*s, op2 - op1); - break; - case '/': - if (op1 == 0) - { - return 3; - } - *s = stack_push(*s, op2 / op1); - break; - case '%': - if (op1 == 0) - { - return 3; - } - *s = stack_push(*s, op2 % op1); - break; - case '^': - if (op1 < 0) - { - return 3; - } - *s = stack_push(*s, my_pow(op2, op1)); - break; - default: - return 1; - } - return 0; -} - -int evalrpn(const char *expr, int *retval) -{ - struct stack *s = NULL; - - for (size_t i = 0; expr[i]; i++) - { - if (expr[i] >= '0' && expr[i] <= '9') - { - size_t offset; - int val = parse_number(expr + i, &offset); - s = stack_push(s, val); - i += offset; - } - else if (isspace(expr[i])) - continue; - else - { - int op1; - int op2; - if (get_operands(&s, &op1, &op2) == 2) - { - return 2; - } - - int d = dispatch(expr[i], &s, op1, op2); - if (d != 0) - { - return d; - } - } - } - - if (s == NULL) - { - return 0; - } - *retval = stack_peek(s); - s = stack_pop(s); - return (!s) ? 0 : 2; -} |
