#define TOK_MINUS (MIN_TOK + 6)
#define TOK_NUMBER 256
-char *inp;
+char *inp, *prev;
int tok;
-int err_val;
+int err_val; //skip, parse_num, eval
long tok_value;
-int brackets;
char *op_table = "!@@" "~@@" "*@@" "/@@" "%@@" "+@@" "-@@" "<@@" "<=@" "<<@" ">@@" ">=@" ">>@" "!=@" "==@" "&@@" "|@@" "^@@" "&&@" "||@";
signed char op_prio[NUM_OPS] = { 10, 10, 9, 9, 9, 8, 8, 6, 6, 7, 6, 6, 7, 5, 5, 4, 3, 2, 1, 0 };
if(tok == -1)
return;
+ prev = inp;
ignore_whitespace();
if(*inp)
t_op[0] = *inp++;
-
- if(*t_op == ')')
- {
- brackets--;
- tok = ')';
- return;
- }
-
+
p1 = strstr(op_table, t_op);
if(!p1 || !*inp)
{
else if(accept(TOK_PLUS)) {}
if (accept('(')) {
- brackets++;
num = parse_expr();
skip(')');
return flag * num;
default:
err_val = -1;
- printf("Undefined operator\n");
- return -1;
+ //printf("Undefined operator\n");
+ return 0;
}
}
return 0;
lhs = eval(op - MIN_TOK, lhs, rhs);
+
+ if(err_val)
+ return 0;
}
return lhs;
}
int parse_arith(char *inp_string, char **end, char **buffer)
{
long value;
- brackets = err_val = tok = 0;
+ err_val = tok = 0;
inp = inp_string;
input();
value = parse_expr();
if(err_val) //Read till we get a ')'
{
- while(*inp && *inp != ')')
- inp++;
- input();
- }
-
- *end = inp;
- skip(')');
-
- if(err_val)
- {
- printf("Parse error\n");
- return -1;
+ *end = strchr(inp, ')');
+ if(!*end)
+ *end = inp;
+ else end++;
}
-
+ else
+ *end = prev;
+
if(buffer)
+ {
+ if(err_val)
+ {
+ printf("Parse error\n");
+ *buffer = malloc(1);
+ **buffer = 0;
+ return 0;
+ }
return asprintf(buffer, "%ld", value);
+ }
return -1;
}