Merge branch 'vendor/AWK'
authorJohn Marino <draco@marino.st>
Thu, 9 May 2013 00:47:07 +0000 (02:47 +0200)
committerJohn Marino <draco@marino.st>
Thu, 9 May 2013 00:47:07 +0000 (02:47 +0200)
1  2 
contrib/awk/run.c
contrib/awk/tran.c

diff --combined contrib/awk/run.c
@@@ -1153,13 -1153,13 +1153,13 @@@ Cell *cat(Node **a, int q)   /* a[0] cat 
        getsval(x);
        getsval(y);
        n1 = strlen(x->sval);
 -      n2 = strlen(y->sval);
 -      s = (char *) malloc(n1 + n2 + 1);
 +      n2 = strlen(y->sval) + 1;
 +      s = (char *) malloc(n1 + n2);
        if (s == NULL)
                FATAL("out of space concatenating %.15s... and %.15s...",
                        x->sval, y->sval);
 -      strcpy(s, x->sval);
 -      strcpy(s+n1, y->sval);
 +      memmove(s, x->sval, n1);
 +      memmove(s+n1, y->sval, n2);
        tempfree(x);
        tempfree(y);
        z = gettemp();
@@@ -1210,13 -1210,13 +1210,13 @@@ Cell *dopa2(Node **a, int n) /* a[0], a
  Cell *split(Node **a, int nnn)        /* split(a[0], a[1], a[2]); a[3] is type */
  {
        Cell *x = 0, *y, *ap;
-       char *s;
+       char *s, *origs;
        int sep;
        char *t, temp, num[50], *fs = 0;
        int n, tempstat, arg3type;
  
        y = execute(a[0]);      /* source string */
-       s = getsval(y);
+       origs = s = strdup(getsval(y));
        arg3type = ptoi(a[3]);
        if (a[2] == 0)          /* fs string */
                fs = *FS;
        }
        tempfree(ap);
        tempfree(y);
+       free(origs);
        if (a[2] != 0 && arg3type == STRING) {
                tempfree(x);
        }
diff --combined contrib/awk/tran.c
@@@ -298,6 -298,8 +298,8 @@@ Awkfloat setfval(Cell *vp, Awkfloat f)     
                xfree(vp->sval); /* free any previous string */
        vp->tval &= ~STR;       /* mark string invalid */
        vp->tval |= NUM;        /* mark number ok */
+       if (f == -0)  /* who would have thought this possible? */
+               f = 0;
           dprintf( ("setfval %p: %s = %g, t=%o\n", (void*)vp, NN(vp->nval), f, vp->tval) );
        return vp->fval = f;
  }
@@@ -402,9 -404,10 +404,9 @@@ char *tostring(const char *s)     /* make 
  {
        char *p;
  
 -      p = (char *) malloc(strlen(s)+1);
 +      p = strdup(s);
        if (p == NULL)
                FATAL("out of space in tostring on %s", s);
 -      strcpy(p, s);
        return(p);
  }