[BACK]Return to tran.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / awk

Diff for /src/usr.bin/awk/tran.c between version 1.31 and 1.32

version 1.31, 2020/08/11 16:57:05 version 1.32, 2020/12/09 20:00:11
Line 130 
Line 130 
         free(cp->sval);          free(cp->sval);
         cp->sval = (char *) ARGVtab;          cp->sval = (char *) ARGVtab;
         for (i = 0; i < ac; i++) {          for (i = 0; i < ac; i++) {
                   double result;
   
                 snprintf(temp, sizeof temp, "%d", i);                  snprintf(temp, sizeof temp, "%d", i);
                 if (is_number(*av))                  if (is_number(*av, & result))
                         setsymtab(temp, *av, atof(*av), STR|NUM, ARGVtab);                          setsymtab(temp, *av, result, STR|NUM, ARGVtab);
                 else                  else
                         setsymtab(temp, *av, 0.0, STR, ARGVtab);                          setsymtab(temp, *av, 0.0, STR, ARGVtab);
                 av++;                  av++;
Line 149 
Line 151 
         free(cp->sval);          free(cp->sval);
         cp->sval = (char *) ENVtab;          cp->sval = (char *) ENVtab;
         for ( ; *envp; envp++) {          for ( ; *envp; envp++) {
                   double result;
   
                 if ((p = strchr(*envp, '=')) == NULL)                  if ((p = strchr(*envp, '=')) == NULL)
                         continue;                          continue;
                 if( p == *envp ) /* no left hand side name in env string */                  if( p == *envp ) /* no left hand side name in env string */
                         continue;                          continue;
                 *p++ = 0;       /* split into two strings at = */                  *p++ = 0;       /* split into two strings at = */
                 if (is_number(p))                  if (is_number(p, & result))
                         setsymtab(*envp, p, atof(p), STR|NUM, ENVtab);                          setsymtab(*envp, p, result, STR|NUM, ENVtab);
                 else                  else
                         setsymtab(*envp, p, 0.0, STR, ENVtab);                          setsymtab(*envp, p, 0.0, STR, ENVtab);
                 p[-1] = '=';    /* restore in case env is passed down to a shell */                  p[-1] = '=';    /* restore in case env is passed down to a shell */
Line 167 
Line 171 
         Array *ap;          Array *ap;
         Cell **tp;          Cell **tp;
   
         ap = malloc(sizeof(*ap));          ap = (Array *) malloc(sizeof(*ap));
         tp = calloc(n, sizeof(*tp));          tp = (Cell **) calloc(n, sizeof(*tp));
         if (ap == NULL || tp == NULL)          if (ap == NULL || tp == NULL)
                 FATAL("out of space in makesymtab");                  FATAL("out of space in makesymtab");
         ap->nelem = 0;          ap->nelem = 0;
Line 238 
Line 242 
                         (void*)p, NN(p->nval), NN(p->sval), p->fval, p->tval);                          (void*)p, NN(p->nval), NN(p->sval), p->fval, p->tval);
                 return(p);                  return(p);
         }          }
         p = malloc(sizeof(*p));          p = (Cell *) malloc(sizeof(*p));
         if (p == NULL)          if (p == NULL)
                 FATAL("out of space for symbol table at %s", n);                  FATAL("out of space for symbol table at %s", n);
         p->nval = tostring(n);          p->nval = tostring(n);
Line 273 
Line 277 
         Cell *cp, *op, **np;          Cell *cp, *op, **np;
   
         nsz = GROWTAB * tp->size;          nsz = GROWTAB * tp->size;
         np = calloc(nsz, sizeof(*np));          np = (Cell **) calloc(nsz, sizeof(*np));
         if (np == NULL)         /* can't do it, but can keep running. */          if (np == NULL)         /* can't do it, but can keep running. */
                 return;         /* someone else will run out later. */                  return;         /* someone else will run out later. */
         for (i = 0; i < tp->size; i++) {          for (i = 0; i < tp->size; i++) {
Line 400 
Line 404 
         else if (isrec(vp) && !donerec)          else if (isrec(vp) && !donerec)
                 recbld();                  recbld();
         if (!isnum(vp)) {       /* not a number */          if (!isnum(vp)) {       /* not a number */
                 vp->fval = atof(vp->sval);      /* best guess */                  double fval;
                 if (is_number(vp->sval) && !(vp->tval&CON))                  bool no_trailing;
                         vp->tval |= NUM;        /* make NUM only sparingly */  
                   if (is_valid_number(vp->sval, true, & no_trailing, & fval)) {
                           vp->fval = fval;
                           if (no_trailing && !(vp->tval&CON))
                                   vp->tval |= NUM;        /* make NUM only sparingly */
                   } else
                           vp->fval = 0.0;
         }          }
         DPRINTF("getfval %p: %s = %g, t=%o\n",          DPRINTF("getfval %p: %s = %g, t=%o\n",
                 (void*)vp, NN(vp->nval), vp->fval, vp->tval);                  (void*)vp, NN(vp->nval), vp->fval, vp->tval);
Line 521 
Line 531 
 {  {
         char *p;          char *p;
   
         p = malloc(n);          p = (char *) malloc(n);
         if (p == NULL)          if (p == NULL)
                 FATAL("out of space in tostringN %zu", n);                  FATAL("out of space in tostringN %zu", n);
         if (strlcpy(p, s, n) >= n)          if (strlcpy(p, s, n) >= n)
Line 536 
Line 546 
         char *sa = getsval(a);          char *sa = getsval(a);
         char *sb = getsval(b);          char *sb = getsval(b);
         size_t l = strlen(sa) + strlen(sb) + 1;          size_t l = strlen(sa) + strlen(sb) + 1;
         p = malloc(l);          p = (char *) malloc(l);
         if (p == NULL)          if (p == NULL)
                 FATAL("out of space concatenating %s and %s", sa, sb);                  FATAL("out of space concatenating %s and %s", sa, sb);
         snprintf(p, l, "%s%s", sa, sb);          snprintf(p, l, "%s%s", sa, sb);
   
         l++;    // add room for ' '          l++;    // add room for ' '
         char *newbuf = malloc(l);          char *newbuf = (char *) malloc(l);
         if (newbuf == NULL)          if (newbuf == NULL)
                 FATAL("out of space concatenating %s and %s", sa, sb);                  FATAL("out of space concatenating %s and %s", sa, sb);
         // See string() in lex.c; a string "xx" is stored in the symbol          // See string() in lex.c; a string "xx" is stored in the symbol
Line 561 
Line 571 
         const uschar *s = (const uschar *) is;          const uschar *s = (const uschar *) is;
         uschar *buf, *bp;          uschar *buf, *bp;
   
         if ((buf = malloc(strlen(is)+3)) == NULL)          if ((buf = (uschar *) malloc(strlen(is)+3)) == NULL)
                 FATAL( "out of space in qstring(%s)", s);                  FATAL( "out of space in qstring(%s)", s);
         for (bp = buf; (c = *s) != delim; s++) {          for (bp = buf; (c = *s) != delim; s++) {
                 if (c == '\n')                  if (c == '\n')

Legend:
Removed from v.1.31  
changed lines
  Added in v.1.32