|
Lines 1-2
Link Here
|
|
|
1 |
%{ |
| 2 |
#include <stdint.h> |
| 3 |
#ifdef OVERFLOW |
| 4 |
#include "options.h" |
| 5 |
#endif |
| 6 |
|
| 7 |
#define YYSTYPE intmax_t |
| 8 |
|
| 9 |
static intmax_t arith_res; |
| 10 |
%} |
| 11 |
|
| 1 |
%token ARITH_NUM ARITH_LPAREN ARITH_RPAREN |
12 |
%token ARITH_NUM ARITH_LPAREN ARITH_RPAREN |
| 2 |
|
13 |
|
|
Lines 15-19
Link Here
|
| 15 |
|
26 |
|
| 16 |
exp: expr = { |
27 |
exp: expr = { |
| 17 |
return ($1); |
28 |
arith_res = $1; |
|
|
29 |
return (0); |
| 18 |
} |
30 |
} |
| 19 |
; |
31 |
; |
|
Lines 34-40
Link Here
|
| 34 |
| expr ARITH_LSHIFT expr = { $$ = $1 << $3; } |
46 |
| expr ARITH_LSHIFT expr = { $$ = $1 << $3; } |
| 35 |
| expr ARITH_RSHIFT expr = { $$ = $1 >> $3; } |
47 |
| expr ARITH_RSHIFT expr = { $$ = $1 >> $3; } |
| 36 |
| expr ARITH_ADD expr = { $$ = $1 + $3; } |
48 |
| expr ARITH_ADD expr = { |
| 37 |
| expr ARITH_SUB expr = { $$ = $1 - $3; } |
49 |
$$ = $1 + $3; |
| 38 |
| expr ARITH_MUL expr = { $$ = $1 * $3; } |
50 |
#ifdef OVERFLOW |
|
|
51 |
if (Oflag && is_add_overflow($1, $3, $$)) |
| 52 |
yyerror("overflow in"); |
| 53 |
#endif |
| 54 |
} |
| 55 |
| expr ARITH_SUB expr = { |
| 56 |
$$ = $1 - $3; |
| 57 |
#ifdef OVERFLOW |
| 58 |
if (Oflag && is_add_overflow($1, -$3, $$)) |
| 59 |
yyerror("overflow in"); |
| 60 |
#endif |
| 61 |
} |
| 62 |
| expr ARITH_MUL expr = { |
| 63 |
$$ = $1 * $3; |
| 64 |
#ifdef OVERFLOW |
| 65 |
if (Oflag && $$/$1 != $3 ) |
| 66 |
yyerror("overflow in"); |
| 67 |
#endif |
| 68 |
} |
| 39 |
| expr ARITH_DIV expr = { |
69 |
| expr ARITH_DIV expr = { |
| 40 |
if ($3 == 0) |
70 |
if ($3 == 0) |
|
Lines 110-125
Link Here
|
| 110 |
|
140 |
|
| 111 |
int |
141 |
int |
| 112 |
arith(char *s) |
142 |
is_add_overflow(intmax_t a, intmax_t b, intmax_t s) |
| 113 |
{ |
143 |
{ |
| 114 |
long result; |
144 |
if (a > 0 && b > 0 && s <= 0) |
|
|
145 |
return 1; |
| 146 |
if (a < 0 && b < 0 && s >= 0) |
| 147 |
return 1; |
| 148 |
return 0; |
| 149 |
} |
| 115 |
|
150 |
|
|
|
151 |
intmax_t |
| 152 |
arith(char *s) |
| 153 |
{ |
| 116 |
arith_buf = arith_startbuf = s; |
154 |
arith_buf = arith_startbuf = s; |
| 117 |
|
155 |
|
| 118 |
INTOFF; |
156 |
INTOFF; |
| 119 |
result = yyparse(); |
157 |
yyparse(); |
| 120 |
arith_lex_reset(); /* reprime lex */ |
158 |
arith_lex_reset(); /* reprime lex */ |
| 121 |
INTON; |
159 |
INTON; |
| 122 |
|
160 |
|
| 123 |
return (result); |
161 |
return (arith_res); |
| 124 |
} |
162 |
} |
| 125 |
|
163 |
|
|
Lines 143-147
Link Here
|
| 143 |
char *concat; |
181 |
char *concat; |
| 144 |
char **ap; |
182 |
char **ap; |
| 145 |
long i; |
183 |
intmax_t i; |
| 146 |
|
184 |
|
| 147 |
if (argc > 1) { |
185 |
if (argc > 1) { |
|
Lines 168-172
Link Here
|
| 168 |
i = arith(p); |
206 |
i = arith(p); |
| 169 |
|
207 |
|
| 170 |
out1fmt("%ld\n", i); |
208 |
out1fmt("%jd\n", i); |
| 171 |
return (! i); |
209 |
return (! i); |
| 172 |
} |
210 |
} |