version 1.10, 1993/08/16 23:20:22 |
version 1.11, 1993/08/17 16:01:23 |
|
|
%{ |
%{ |
/* Written by Pace Willisson (pace@blitz.com) |
/* Written by Pace Willisson (pace@blitz.com) |
* and placed in the public domain |
* and placed in the public domain. |
|
* |
|
* Largely rewritten by J.T. Conklin (jtc@wimsey.com) |
* |
* |
* $Header$ |
* $Header$ |
*/ |
*/ |
|
|
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
#include <ctype.h> |
#include <ctype.h> |
|
#include <err.h> |
|
|
enum valtype { |
enum valtype { |
integer, string |
integer, string |
|
|
|
|
vp = (struct val *) malloc (sizeof (*vp)); |
vp = (struct val *) malloc (sizeof (*vp)); |
if (vp == NULL) { |
if (vp == NULL) { |
fprintf (stderr, "expr: out of memory\n"); |
err (2, NULL); |
exit (2); |
|
} |
} |
|
|
vp->type = integer; |
vp->type = integer; |
|
|
|
|
vp = (struct val *) malloc (sizeof (*vp)); |
vp = (struct val *) malloc (sizeof (*vp)); |
if (vp == NULL || ((vp->u.s = strdup (s)) == NULL)) { |
if (vp == NULL || ((vp->u.s = strdup (s)) == NULL)) { |
fprintf (stderr, "expr: out of memory\n"); |
err (2, NULL); |
exit (2); |
|
} |
} |
|
|
vp->type = string; |
vp->type = string; |
|
|
|
|
tmp = malloc (25); |
tmp = malloc (25); |
if (tmp == NULL) { |
if (tmp == NULL) { |
fprintf (stderr, "expr: out of memory\n"); |
err (2, NULL); |
exit (2); |
|
} |
} |
|
|
sprintf (tmp, "%d", vp->u.i); |
sprintf (tmp, "%d", vp->u.i); |
|
|
yyerror (s) |
yyerror (s) |
char *s; |
char *s; |
{ |
{ |
fprintf (stderr, "expr: syntax error\n"); |
errx (2, "syntax error"); |
exit (2); |
|
} |
} |
|
|
|
|
Line 404 struct val *a, *b; |
|
Line 403 struct val *a, *b; |
|
struct val *r; |
struct val *r; |
|
|
if (!to_integer (a) || !to_integer (b)) { |
if (!to_integer (a) || !to_integer (b)) { |
fprintf (stderr, "expr: non-numeric argument\n"); |
errx (2, "non-numeric argument"); |
exit (2); |
|
} |
} |
|
|
r = make_integer (a->u.i + b->u.i); |
r = make_integer (a->u.i + b->u.i); |
Line 421 struct val *a, *b; |
|
Line 419 struct val *a, *b; |
|
struct val *r; |
struct val *r; |
|
|
if (!to_integer (a) || !to_integer (b)) { |
if (!to_integer (a) || !to_integer (b)) { |
fprintf (stderr, "expr: non-numeric argument\n"); |
errx (2, "non-numeric argument"); |
exit (2); |
|
} |
} |
|
|
r = make_integer (a->u.i - b->u.i); |
r = make_integer (a->u.i - b->u.i); |
Line 438 struct val *a, *b; |
|
Line 435 struct val *a, *b; |
|
struct val *r; |
struct val *r; |
|
|
if (!to_integer (a) || !to_integer (b)) { |
if (!to_integer (a) || !to_integer (b)) { |
fprintf (stderr, "expr: non-numeric argument\n"); |
errx (2, "non-numeric argument"); |
exit (2); |
|
} |
} |
|
|
r = make_integer (a->u.i * b->u.i); |
r = make_integer (a->u.i * b->u.i); |
Line 455 struct val *a, *b; |
|
Line 451 struct val *a, *b; |
|
struct val *r; |
struct val *r; |
|
|
if (!to_integer (a) || !to_integer (b)) { |
if (!to_integer (a) || !to_integer (b)) { |
fprintf (stderr, "expr: non-numeric argument\n"); |
errx (2, "non-numeric argument"); |
exit (2); |
|
} |
} |
|
|
if (b->u.i == 0) { |
if (b->u.i == 0) { |
fprintf (stderr, "expr: division by zero\n"); |
errx (2, "division by zero"); |
exit (2); |
|
} |
} |
|
|
r = make_integer (a->u.i / b->u.i); |
r = make_integer (a->u.i / b->u.i); |
Line 477 struct val *a, *b; |
|
Line 471 struct val *a, *b; |
|
struct val *r; |
struct val *r; |
|
|
if (!to_integer (a) || !to_integer (b)) { |
if (!to_integer (a) || !to_integer (b)) { |
fprintf (stderr, "expr: non-numeric argument\n"); |
errx (2, "non-numeric argument"); |
exit (2); |
|
} |
} |
|
|
if (b->u.i == 0) { |
if (b->u.i == 0) { |
fprintf (stderr, "expr: division by zero\n"); |
errx (2, "division by zero"); |
exit (2); |
|
} |
} |
|
|
r = make_integer (a->u.i % b->u.i); |
r = make_integer (a->u.i % b->u.i); |
Line 518 struct val *a, *b; |
|
Line 510 struct val *a, *b; |
|
/* compile regular expression */ |
/* compile regular expression */ |
if ((eval = regcomp (&rp, newpat, 0)) != 0) { |
if ((eval = regcomp (&rp, newpat, 0)) != 0) { |
regerror (eval, &rp, errbuf, sizeof(errbuf)); |
regerror (eval, &rp, errbuf, sizeof(errbuf)); |
fprintf (stderr, "expr: %s\n", errbuf); |
errx (2, "%s", errbuf); |
exit (2); |
|
} |
} |
free (newpat); |
free (newpat); |
|
|
/* compare string against pattern */ |
/* compare string against pattern */ |
if (regexec(&rp, a->u.s, SE_MAX, rm, 0) == 0) { |
if (regexec(&rp, a->u.s, SE_MAX, rm, 0) == 0) { |
if (rm[1].rm_so >= 0) { |
if (rm[1].rm_so >= 0) { |
*(a->u.s + rm[1].rm_eo) = 0; |
*(a->u.s + rm[1].rm_eo) = '\0'; |
v = make_str (a->u.s + rm[1].rm_so); |
v = make_str (a->u.s + rm[1].rm_so); |
|
|
} else { |
} else { |
v = make_integer (rm[0].rm_eo - rm[0].rm_so); |
v = make_integer (rm[0].rm_eo - rm[0].rm_so); |
} |
} |
} else { |
} else { |
v = make_integer (0); |
if (rp.re_nsub == 0) { |
|
v = make_integer (0); |
|
} else { |
|
v = make_str (""); |
|
} |
} |
} |
|
|
/* free arguments and pattern buffer */ |
/* free arguments and pattern buffer */ |