|
|
@ -156,7 +156,7 @@ static int ashr(int r, int n) |
|
|
const char *expr(const char *p, int *v, int linepc, int allowfr, |
|
|
const char *expr(const char *p, int *v, int linepc, int allowfr, |
|
|
enum expr_ecode *ecode, const char **ep) |
|
|
enum expr_ecode *ecode, const char **ep) |
|
|
{ |
|
|
{ |
|
|
int si, usi; |
|
|
|
|
|
|
|
|
int si, usi, usl; |
|
|
const char *q; |
|
|
const char *q; |
|
|
char last; |
|
|
char last; |
|
|
int stack[ESTKSZ2]; |
|
|
int stack[ESTKSZ2]; |
|
|
@ -172,6 +172,7 @@ const char *expr(const char *p, int *v, int linepc, int allowfr, |
|
|
si = 0; |
|
|
si = 0; |
|
|
r = 0; |
|
|
r = 0; |
|
|
last = 'V'; /* first void */ |
|
|
last = 'V'; /* first void */ |
|
|
|
|
|
usl = 0; |
|
|
loop: |
|
|
loop: |
|
|
p = skipws(p); |
|
|
p = skipws(p); |
|
|
if (*p == '(') { |
|
|
if (*p == '(') { |
|
|
@ -184,6 +185,8 @@ loop: |
|
|
} |
|
|
} |
|
|
stack[si++] = last; |
|
|
stack[si++] = last; |
|
|
stack[si++] = r; |
|
|
stack[si++] = r; |
|
|
|
|
|
stack[si++] = usl; |
|
|
|
|
|
usl = usi; |
|
|
p++; |
|
|
p++; |
|
|
r = 0; |
|
|
r = 0; |
|
|
last = 'v'; /* void */ |
|
|
last = 'v'; /* void */ |
|
|
@ -197,6 +200,7 @@ loop: |
|
|
} else { |
|
|
} else { |
|
|
p++; |
|
|
p++; |
|
|
n = r; |
|
|
n = r; |
|
|
|
|
|
usl = stack[--si]; |
|
|
r = stack[--si]; |
|
|
r = stack[--si]; |
|
|
last = (char) stack[--si]; |
|
|
last = (char) stack[--si]; |
|
|
goto oper; |
|
|
goto oper; |
|
|
@ -396,7 +400,7 @@ uoper: |
|
|
uopstk[usi++] = *p++; |
|
|
uopstk[usi++] = *p++; |
|
|
goto loop; |
|
|
goto loop; |
|
|
oper: |
|
|
oper: |
|
|
while (usi > 0) { |
|
|
|
|
|
|
|
|
while (usi > usl) { |
|
|
usi--; |
|
|
usi--; |
|
|
switch (uopstk[usi]) { |
|
|
switch (uopstk[usi]) { |
|
|
case '~': n = ~n; break; |
|
|
case '~': n = ~n; break; |
|
|
|