#include <math.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#define ADD 1
#define SUB 2
#define MUL 3
#define DIV 4
#define AND 5
#define OR 6
#define POW 7
int error = 0;
int mystrcmp(char* a, char* b) {
int r = 1;
while(*a) {
if (*a != *b) {
r = 0;
break;
}
a++,b++;
}
return (*b)?0:r;
}
int ipow(int a, int b) {
int i;
int res = 1;
for (i = 0; i < b; i++) {
res *= a;
}
return res;
}
int indexOf(char *str, char c) {
int index = -1;
char *p = str;
while(*str) {
if (*str == c) {
index = (str - p);
break;
}
str++;
}
return index;
}
int getOp (char c) {
int op = -1;
switch(c) {
case '+' : op = ADD; break;
case '-' : op = SUB; break;
case '*' : op = MUL; break;
case '/' : op = DIV; break;
case '&' : op = AND; break;
case '|' : op = OR; break;
case '^' : op = POW; break;
}
return op;
}
int getResult (int op, int opA, int opB) {
int n = -1;;
switch(op) {
case ADD:
n = opA + opB;
break;
case SUB:
n = opA - opB;
break;
case MUL:
n = opA * opB;
break;
case DIV:
if (opB == 0) {
error = 4;
//mostrar error division dentro de 0
} else {
n = opA / opB;
}
break;
case AND:
n = opA & opB;
break;
case OR:
n = opA | opB;
break;
case POW:
n = ipow(opA,opB);
break;
}
return n;
}
int operate(char **str) {
int result;
char *refBuf, *refVar, *refVarAux, *var, *buf, *varAux;
buf = malloc(12);
var = malloc(10);
varAux = malloc(10);
refVarAux = varAux;
refBuf = buf;
refVar = var;
(*str)++; // me salto el primer parentesis
int op = getOp(**str);
(*str)++; // me salto el operador
if (op != -1) {
int opA, opB;
while(**str == ' ' || **str == '\t') (*str)++;
if (**str == '(') {
opA = operate(str);
} else if (isdigit(**str)) {
while(isdigit(**str)) {
*buf=**str;
buf++,(*str)++;
}
*buf = '\0';
buf = refBuf;
opA = atoi(buf);
} else {
printf("Debe ingresar las operaciones de la forma (operador operando operando)\n");
error = 4;
}
while(**str == ' ' || **str == '\t') (*str)++;
if (**str == '(') {
opB = operate(str);
} else if (isdigit(**str)) {
while(isdigit(**str)) {
*buf=**str;
buf++,(*str)++;
}
*buf = '\0';
buf = refBuf;
opB = atoi(buf);
} else {
printf("Debe ingresar las operaciones de la forma (operador operando operando)\n");
error = 4;
}
(*str)+=1;
result = getResult(op,opA,opB);
} else {
printf("Debe ingresar un operador valido (+,-,*,/,&,|,^,#)\n");
error = 4;
}
free(buf);
free(var);
free(varAux);
return result;
}
void parse(char *buffer) {
int parOIndex = indexOf(buffer,'(');
int parCIndex = indexOf(buffer,')');
if (parOIndex == -1 || parCIndex == -1) {
printf("Debe ingresar las operaciones de la forma (operador operando operando)\n");
} else {
int n = operate(&buffer);
printf("$>%i\n",n);
}
}
int main() {
char c;
int execute = 1;
char *buffer = (char*) malloc(100);
char *ref = buffer;
while(execute) {
printf("$>");
while ((c = getchar()) != '\n') {
*buffer=c;
buffer++;
}
*buffer = '\0';
buffer = ref;
if (!mystrcmp(buffer,"exit"))
parse(buffer);
else
execute = 0;
}
return 1;
}