66
#include "calc.hpp"
int getFloat(strr str, flt_t& n) {
n = 0.0f;
for (long j = long(str[0] == '-'); j < str.length(); j++)
if (str[j] >= '0' && str[j] <= '9') n = n * 10 + flt_t(str[j] - '0');
else if (str[j] == '.')
for (long i = j++; j < str.length(); j++)
if (str[j] >= '0' && str[j] <= '9') n += (flt_t(str[j] - '0') / pow(10, j-i));
else return 1;
else return 1;
n*=1-2*(str[0]=='-');
return 0;
}
op_t ops = {
{strr("+"), fptr([](flt_t a, flt_t b){ return flt_t(a + b); })},
{strr("-"), fptr([](flt_t a, flt_t b){ return flt_t(a - b); })},
{strr("x"), fptr([](flt_t a, flt_t b){ return flt_t(a * b); })},
{strr("*"), fptr([](flt_t a, flt_t b){ return flt_t(a * b); })},
{strr("/"), fptr([](flt_t a, flt_t b){ return flt_t(a / b); })},
{strr("^"), fptr([](flt_t a, flt_t b){ return flt_t(pow(a, b)); })},
{strr("%"), fptr([](flt_t a, flt_t b){ return flt_t(int_t(a)%int_t(b)); })}
};
int calc(strr n1,strr opi, strr n2) {
char bf[128]="error: invalid input";
flt_t num1, num2;
fptr op = ops[opi];
if (op == nullptr || getFloat(n1, num1) || getFloat(n2, num2))return puts("error: invalid input");
flt_t ans = op(num1, num2);
int n = snprintf(bf, 128, "%.12Lf", ans);
for (n--;n>0;n--) {
if (bf[n] != '0') {
if (bf[n] != '.')n++;
break;
}
}
bf[n]='\0';
puts(bf);
return 0;
}
void help(char* argv) {
printf("Usage:\t%s [number] [operator] [number]\n", argv);
printf("\t%s [operator]\n\n", argv);
puts("If numbers are not provided, they will be read from stdin.");
puts("Supported operators: + - x / ^ %");
exit(0);
}
int main(int argc, char* argv[]) {
if (argc == 2&&(ops[strr(argv[1])]!=nullptr)) {
strr in[2]={"",""};
int i = 0;
char c = getchar();
while(c != EOF) {
if (c == '\n'||c == ' ')if(i) break; else i++;else in[i] += c;
c = getchar();
}
return 0!=calc(in[0], argv[1], in[1]);
}
if (argc == 4) return 0!=calc(argv[1], argv[2], argv[3]);
help(argv[0]);
return 0;
}