#include "evalexpr.h" #include #include #include #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; }