#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;
|
|
}
|