|
|
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <signal.h>
- #include <setjmp.h>
-
- /*
- * 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;
- }
|