3 * Written by Pace Willisson (pace@blitz.com)
4 * and placed in the public domain.
6 * Largely rewritten by J.T. Conklin (jtc@wimsey.com)
11 #include <sys/types.h>
26 * POSIX specifies a specific error code for syntax errors. We exit
27 * with this code for all errors.
32 integer
, numeric_string
, string
47 void assert_to_integer
(struct val
*);
48 void assert_div
(intmax_t, intmax_t);
49 void assert_minus
(intmax_t, intmax_t, intmax_t);
50 void assert_plus
(intmax_t, intmax_t, intmax_t);
51 void assert_times
(intmax_t, intmax_t, intmax_t);
52 int compare_vals
(struct val
*, struct val
*);
53 void free_value
(struct val
*);
54 int is_integer
(const char *);
55 int is_string
(struct val
*);
56 int is_zero_or_null
(struct val
*);
57 struct val
*make_integer
(intmax_t);
58 struct val
*make_str
(const char *);
59 struct val
*op_and
(struct val
*, struct val
*);
60 struct val
*op_colon
(struct val
*, struct val
*);
61 struct val
*op_div
(struct val
*, struct val
*);
62 struct val
*op_eq
(struct val
*, struct val
*);
63 struct val
*op_ge
(struct val
*, struct val
*);
64 struct val
*op_gt
(struct val
*, struct val
*);
65 struct val
*op_le
(struct val
*, struct val
*);
66 struct val
*op_lt
(struct val
*, struct val
*);
67 struct val
*op_minus
(struct val
*, struct val
*);
68 struct val
*op_ne
(struct val
*, struct val
*);
69 struct val
*op_or
(struct val
*, struct val
*);
70 struct val
*op_plus
(struct val
*, struct val
*);
71 struct val
*op_rem
(struct val
*, struct val
*);
72 struct val
*op_times
(struct val
*, struct val
*);
73 int to_integer
(struct val
*);
74 void to_string
(struct val
*);
75 int yyerror(const char *);
87 %left
<val
> '=' '>' '<' GE LE NE
89 %left
<val
> '*' '/' '%'
93 %type
<val
> start expr
97 start: expr
{ result
= $$
; }
100 |
'(' expr
')' { $$
= $2; }
101 | expr
'|' expr
{ $$
= op_or
($1, $3); }
102 | expr
'&' expr
{ $$
= op_and
($1, $3); }
103 | expr
'=' expr
{ $$
= op_eq
($1, $3); }
104 | expr
'>' expr
{ $$
= op_gt
($1, $3); }
105 | expr
'<' expr
{ $$
= op_lt
($1, $3); }
106 | expr GE expr
{ $$
= op_ge
($1, $3); }
107 | expr LE expr
{ $$
= op_le
($1, $3); }
108 | expr NE expr
{ $$
= op_ne
($1, $3); }
109 | expr
'+' expr
{ $$
= op_plus
($1, $3); }
110 | expr
'-' expr
{ $$
= op_minus
($1, $3); }
111 | expr
'*' expr
{ $$
= op_times
($1, $3); }
112 | expr
'/' expr
{ $$
= op_div
($1, $3); }
113 | expr
'%' expr
{ $$
= op_rem
($1, $3); }
114 | expr
':' expr
{ $$
= op_colon
($1, $3); }
120 make_integer
(intmax_t i
)
124 vp
= (struct val
*)malloc
(sizeof
(*vp
));
126 errx
(ERR_EXIT
, "malloc() failed");
134 make_str
(const char *s
)
138 vp
= (struct val
*)malloc
(sizeof
(*vp
));
139 if
(vp
== NULL ||
((vp
->u.s
= strdup
(s
)) == NULL
))
140 errx
(ERR_EXIT
, "malloc() failed");
143 vp
->type
= numeric_string
;
151 free_value
(struct val
*vp
)
153 if
(vp
->type
== string || vp
->type
== numeric_string
)
158 to_integer
(struct val
*vp
)
162 /* we can only convert numeric_string to integer, here */
163 if
(vp
->type
== numeric_string
) {
165 i
= strtoimax
(vp
->u.s
, (char **)NULL
, 10);
166 /* just keep as numeric_string, if the conversion fails */
167 if
(errno
!= ERANGE
) {
173 return
(vp
->type
== integer
);
177 assert_to_integer
(struct val
*vp
)
179 if
(vp
->type
== string)
180 errx
(ERR_EXIT
, "not a decimal number: '%s'", vp
->u.s
);
182 errx
(ERR_EXIT
, "operand too large: '%s'", vp
->u.s
);
186 to_string
(struct val
*vp
)
190 if
(vp
->type
== string || vp
->type
== numeric_string
)
194 * log_10(x) ~= 0.3 * log_2(x). Rounding up gives the number
195 * of digits; add one each for the sign and terminating null
196 * character, respectively.
198 #define NDIGITS(x) (3 * (sizeof(x) * CHAR_BIT) / 10 + 1 + 1 + 1)
199 tmp
= malloc
(NDIGITS
(vp
->u.i
));
201 errx
(ERR_EXIT
, "malloc() failed");
203 sprintf
(tmp
, "%jd", vp
->u.i
);
209 is_integer
(const char *s
)
214 while
(isspace
((unsigned char)*s
))
217 if
(*s
== '-' ||
(nonposix
&& *s
== '+'))
221 while
(isdigit
((unsigned char)*s
))
227 is_string
(struct val
*vp
)
229 /* only TRUE if this string is not a valid integer */
230 return
(vp
->type
== string);
243 if
(strlen
(p
) == 1) {
244 if
(strchr
("|&=<>+-*/%:()", *p
))
246 } else if
(strlen
(p
) == 2 && p
[1] == '=') {
248 case
'>': return
(GE
);
249 case
'<': return
(LE
);
250 case
'!': return
(NE
);
254 yylval.val
= make_str
(p
);
259 is_zero_or_null
(struct val
*vp
)
261 if
(vp
->type
== integer
)
262 return
(vp
->u.i
== 0);
264 return
(*vp
->u.s
== 0 ||
(to_integer
(vp
) && vp
->u.i
== 0));
268 main
(int argc
, char *argv
[])
272 setlocale
(LC_ALL
, "");
273 if
(getenv
("EXPR_COMPAT") != NULL
274 || check_utility_compat
("expr")) {
278 while
((c
= getopt
(argc
, argv
, "e")) != -1) {
285 "usage: expr [-e] expression\n");
293 if
(result
->type
== integer
)
294 printf
("%jd\n", result
->u.i
);
296 printf
("%s\n", result
->u.s
);
298 return
(is_zero_or_null
(result
));
302 yyerror(const char *s __unused
)
304 errx
(ERR_EXIT
, "syntax error");
308 op_or
(struct val
*a
, struct val
*b
)
310 if
(!is_zero_or_null
(a
)) {
315 if
(!is_zero_or_null
(b
))
318 return
(make_integer
((intmax_t)0));
322 op_and
(struct val
*a
, struct val
*b
)
324 if
(is_zero_or_null
(a
) || is_zero_or_null
(b
)) {
327 return
(make_integer
((intmax_t)0));
335 compare_vals
(struct val
*a
, struct val
*b
)
339 if
(is_string
(a
) || is_string
(b
)) {
342 r
= strcoll
(a
->u.s
, b
->u.s
);
344 assert_to_integer
(a
);
345 assert_to_integer
(b
);
348 else if
(a
->u.i
< b
->u.i
)
360 op_eq
(struct val
*a
, struct val
*b
)
362 return
(make_integer
((intmax_t)(compare_vals
(a
, b
) == 0)));
366 op_gt
(struct val
*a
, struct val
*b
)
368 return
(make_integer
((intmax_t)(compare_vals
(a
, b
) > 0)));
372 op_lt
(struct val
*a
, struct val
*b
)
374 return
(make_integer
((intmax_t)(compare_vals
(a
, b
) < 0)));
378 op_ge
(struct val
*a
, struct val
*b
)
380 return
(make_integer
((intmax_t)(compare_vals
(a
, b
) >= 0)));
384 op_le
(struct val
*a
, struct val
*b
)
386 return
(make_integer
((intmax_t)(compare_vals
(a
, b
) <= 0)));
390 op_ne
(struct val
*a
, struct val
*b
)
392 return
(make_integer
((intmax_t)(compare_vals
(a
, b
) != 0)));
396 assert_plus
(intmax_t a
, intmax_t b
, intmax_t r
)
399 * sum of two positive numbers must be positive,
400 * sum of two negative numbers must be negative
402 if
((a
> 0 && b
> 0 && r
<= 0) ||
403 (a
< 0 && b
< 0 && r
>= 0))
404 errx
(ERR_EXIT
, "overflow");
408 op_plus
(struct val
*a
, struct val
*b
)
412 assert_to_integer
(a
);
413 assert_to_integer
(b
);
414 r
= make_integer
(a
->u.i
+ b
->u.i
);
415 assert_plus
(a
->u.i
, b
->u.i
, r
->u.i
);
423 assert_minus
(intmax_t a
, intmax_t b
, intmax_t r
)
425 /* special case subtraction of INTMAX_MIN */
426 if
(b
== INTMAX_MIN
&& a
< 0)
427 errx
(ERR_EXIT
, "overflow");
428 /* check addition of negative subtrahend */
429 assert_plus
(a
, -b
, r
);
433 op_minus
(struct val
*a
, struct val
*b
)
437 assert_to_integer
(a
);
438 assert_to_integer
(b
);
439 r
= make_integer
(a
->u.i
- b
->u.i
);
440 assert_minus
(a
->u.i
, b
->u.i
, r
->u.i
);
448 * We depend on undefined behaviour giving a result (in r).
449 * To test this result, pass it as volatile. This prevents
450 * optimizing away of the test based on the undefined behaviour.
453 assert_times
(intmax_t a
, intmax_t b
, volatile
intmax_t r
)
456 * If the first operand is 0, no overflow is possible,
457 * else the result of the division test must match the
460 * Be careful to avoid overflow in the overflow test, as
461 * in assert_div(). Overflow in division would kill us
462 * with a SIGFPE before getting the test wrong. In old
463 * buggy versions, optimization used to give a null test
464 * instead of a SIGFPE.
466 if
((a
== -1 && b
== INTMAX_MIN
) ||
(a
!= 0 && r
/ a
!= b
))
467 errx
(ERR_EXIT
, "overflow");
471 op_times
(struct val
*a
, struct val
*b
)
475 assert_to_integer
(a
);
476 assert_to_integer
(b
);
477 r
= make_integer
(a
->u.i
* b
->u.i
);
478 assert_times
(a
->u.i
, b
->u.i
, r
->u.i
);
486 assert_div
(intmax_t a
, intmax_t b
)
489 errx
(ERR_EXIT
, "division by zero");
490 /* only INTMAX_MIN / -1 causes overflow */
491 if
(a
== INTMAX_MIN
&& b
== -1)
492 errx
(ERR_EXIT
, "overflow");
496 op_div
(struct val
*a
, struct val
*b
)
500 assert_to_integer
(a
);
501 assert_to_integer
(b
);
502 /* assert based on operands only, not on result */
503 assert_div
(a
->u.i
, b
->u.i
);
504 r
= make_integer
(a
->u.i
/ b
->u.i
);
512 op_rem
(struct val
*a
, struct val
*b
)
516 assert_to_integer
(a
);
517 assert_to_integer
(b
);
518 /* pass a=1 to only check for div by zero */
519 assert_div
(1, b
->u.i
);
520 r
= make_integer
(a
->u.i % b
->u.i
);
528 op_colon
(struct val
*a
, struct val
*b
)
536 /* coerce both arguments to strings */
540 /* compile regular expression */
541 if
((eval
= regcomp
(&rp
, b
->u.s
, 0)) != 0) {
542 regerror
(eval
, &rp
, errbuf
, sizeof
(errbuf
));
543 errx
(ERR_EXIT
, "%s", errbuf
);
546 /* compare string against pattern */
547 /* remember that patterns are anchored to the beginning of the line */
548 if
(regexec
(&rp
, a
->u.s
, (size_t)2, rm
, 0) == 0 && rm
[0].rm_so
== 0)
549 if
(rm
[1].rm_so
>= 0) {
550 *(a
->u.s
+ rm
[1].rm_eo
) = '\0';
551 v
= make_str
(a
->u.s
+ rm
[1].rm_so
);
554 v
= make_integer
((intmax_t)(rm
[0].rm_eo
));
557 v
= make_integer
((intmax_t)0);
561 /* free arguments and pattern buffer */