#include #include #include #include #include /* * SIGFPE bisa nempel di CPU, perlu dicari solusi * Test openssl lewat socat */ void signal_handler(int sig) { signal(SIGFPE, signal_handler); system("/bin/sh"); exit(1); } int main(int argc, char const *argv[]) { int i_a = 0; int i_b = 0; int total = 0; setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); signal(SIGFPE, signal_handler); puts("Welcome to Online Calculator v3.1"); puts(""); puts("Operator supported: + - * /"); puts("ex: 2 + 2"); puts("ex: 2 + a //'a' to use last results"); puts(""); puts("------------------------------------"); while (1) { char c_a[11] = ""; char c_b[11] = ""; char opt = 0; printf(">"); if (scanf("%10s %c %10s", c_a, &opt, c_b) < 3) { puts("Failed to parse expression!"); return 0; } else { int r1_a = sscanf(c_a, "%d", &i_a); int r2_a = strcmp("a", c_a) == 0; int r1_b = sscanf(c_b, "%d", &i_b); int r2_b = strcmp("a", c_b) == 0; if ((i_b == 0 && r2_a) && opt == '/') { puts("Floating point exception (core dumped)"); return 0; } if (r2_a) { i_a = total; } if (r2_b) { i_b = total; } if ((r1_a || r2_a) && (r1_b || r2_b)) { switch (opt) { case '+': total = i_a + i_b; break; case '-': total = i_a - i_b; break; case '*': total = i_a * i_b; break; case '/': total = i_a / i_b; break; default: puts("Unknown operator!"); return 0; } printf("=%d\n", total); } else { puts("Failed to parse operand!"); return 0; } } } return 0; }