[BACK]Return to expr.y CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / bin / expr

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/bin/expr/expr.y between version 1.10 and 1.11

version 1.10, 1993/08/16 23:20:22 version 1.11, 1993/08/17 16:01:23
Line 1 
Line 1 
 %{  %{
 /* 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$
  */   */
Line 8 
Line 10 
 #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
Line 90  int i;
Line 93  int i;
   
         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;
Line 107  char *s;
Line 109  char *s;
   
         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;
Line 171  struct val *vp;
Line 172  struct val *vp;
   
         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);
Line 251  int
Line 251  int
 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 */

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.11

CVSweb <webmaster@jp.NetBSD.org>