diff --git a/calc b/calc new file mode 100755 index 0000000..ec5aa6d Binary files /dev/null and b/calc differ diff --git a/calc.c b/calc.c new file mode 100644 index 0000000..8e8afdd --- /dev/null +++ b/calc.c @@ -0,0 +1,104 @@ +#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; +} diff --git a/calc.sh b/calc.sh new file mode 100755 index 0000000..c454252 --- /dev/null +++ b/calc.sh @@ -0,0 +1 @@ +socat TCP-listen:8080,reuseaddr,fork EXEC:./calc