summaryrefslogtreecommitdiff
path: root/rushs/tinyprintf/evalexpr/src/evalexpr.c
diff options
context:
space:
mode:
authorMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
committerMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
commitc9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c (patch)
tree3e4f42f93c7ae89a364e4d51fff6e5cec4e55fa9 /rushs/tinyprintf/evalexpr/src/evalexpr.c
add: graphs et rushs
Diffstat (limited to 'rushs/tinyprintf/evalexpr/src/evalexpr.c')
-rw-r--r--rushs/tinyprintf/evalexpr/src/evalexpr.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/rushs/tinyprintf/evalexpr/src/evalexpr.c b/rushs/tinyprintf/evalexpr/src/evalexpr.c
new file mode 100644
index 0000000..5012355
--- /dev/null
+++ b/rushs/tinyprintf/evalexpr/src/evalexpr.c
@@ -0,0 +1,93 @@
+#include "evalexpr.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define BUFFER_SIZE 10
+
+char *get_input(void)
+{
+ size_t r;
+ char buf[BUFFER_SIZE];
+ size_t size = 0;
+ char *expr = malloc(size * sizeof(char) + 1);
+ if (expr == NULL)
+ return NULL;
+ expr[0] = '\0';
+ do
+ {
+ r = fread(buf, sizeof(char), BUFFER_SIZE - 1, stdin);
+ if (r != 0)
+ {
+ buf[r] = '\0';
+ size += r;
+ char *tmp = realloc(expr, size * sizeof(char) + 1);
+ if (tmp == NULL)
+ {
+ free(expr);
+ return NULL;
+ }
+ expr = tmp;
+ strcat(expr, buf);
+ }
+ } while (r != 0);
+ if (size == 0)
+ {
+ free(expr);
+ return NULL;
+ }
+ if (expr[size - 1] == '\n')
+ expr[size - 1] = '\0';
+ return expr;
+}
+
+void cleanup(char *expr, char *rpn)
+{
+ free(expr);
+ free(rpn);
+}
+
+int main(int argc, char **argv)
+{
+ if ((argc == 2 && strcmp(argv[1], "-rpn") != 0) || (argc > 2))
+ return 4;
+ char *expr = get_input();
+ if (expr == NULL)
+ return 4;
+ if (argc == 1)
+ {
+ char *rpn;
+ int e = shunting_yard(expr, &rpn);
+ if (e != 0)
+ return e;
+ // call shunting yard
+ int retval;
+ e = evalrpn(rpn, &retval);
+ if (e != 0)
+ {
+ cleanup(expr, rpn);
+ return e;
+ }
+ // FREE RPN
+ printf("%d\n", retval);
+ cleanup(expr, rpn);
+ // return
+ return 0;
+ }
+
+ if (argc == 2 && strcmp(argv[1], "-rpn") == 0)
+ {
+ // call rpn eval
+ int retval;
+ int e = evalrpn(expr, &retval);
+ printf("%d\n", retval);
+ // return
+ free(expr);
+ if (e != 0)
+ return e;
+ return 0;
+ }
+
+ return 4;
+}