Thu Jan 20 21:26:20 2011 UTC ()
fix bug introduced in rev. 1.3: need to set the string before
converting it into a numerical value, otherwise we might get junk or crash


(drochner)
diff -r1.3 -r1.4 src/external/historical/nawk/dist/tran.c

cvs diff -r1.3 -r1.4 src/external/historical/nawk/dist/tran.c (expand / switch to unified diff)

--- src/external/historical/nawk/dist/tran.c 2010/11/07 22:55:26 1.3
+++ src/external/historical/nawk/dist/tran.c 2011/01/20 21:26:20 1.4
@@ -343,34 +343,35 @@ char *setsval(Cell *vp, const char *s) / @@ -343,34 +343,35 @@ char *setsval(Cell *vp, const char *s) /
343 } else if (isrec(vp)) { 343 } else if (isrec(vp)) {
344 donefld = 0; /* mark $1... invalid */ 344 donefld = 0; /* mark $1... invalid */
345 donerec = 1; 345 donerec = 1;
346 } 346 }
347 t = tostring(s); /* in case it's self-assign */ 347 t = tostring(s); /* in case it's self-assign */
348 if (freeable(vp)) 348 if (freeable(vp))
349 xfree(vp->sval); 349 xfree(vp->sval);
350 vp->tval &= ~NUM; 350 vp->tval &= ~NUM;
351 vp->tval |= STR; 351 vp->tval |= STR;
352 vp->tval &= ~DONTFREE; 352 vp->tval &= ~DONTFREE;
353 dprintf( ("setsval %p: %s = \"%s (%p) \", t=%o r,f=%d,%d\n",  353 dprintf( ("setsval %p: %s = \"%s (%p) \", t=%o r,f=%d,%d\n",
354 vp, NN(vp->nval), t,t, vp->tval, donerec, donefld) ); 354 vp, NN(vp->nval), t,t, vp->tval, donerec, donefld) );
355 355
 356 vp->sval = t;
356 if (&vp->fval == NF) { 357 if (&vp->fval == NF) {
357 donerec = 0; /* mark $0 invalid */ 358 donerec = 0; /* mark $0 invalid */
358 f = getfval(vp); 359 f = getfval(vp);
359 setlastfld(f); 360 setlastfld(f);
360 dprintf( ("setting NF to %g\n", f) ); 361 dprintf( ("setting NF to %g\n", f) );
361 } 362 }
362 363
363 return(vp->sval = t); 364 return(vp->sval);
364} 365}
365 366
366Awkfloat getfval(Cell *vp) /* get float val of a Cell */ 367Awkfloat getfval(Cell *vp) /* get float val of a Cell */
367{ 368{
368 if ((vp->tval & (NUM | STR)) == 0) 369 if ((vp->tval & (NUM | STR)) == 0)
369 funnyvar(vp, "read value of"); 370 funnyvar(vp, "read value of");
370 if (isfld(vp) && donefld == 0) 371 if (isfld(vp) && donefld == 0)
371 fldbld(); 372 fldbld();
372 else if (isrec(vp) && donerec == 0) 373 else if (isrec(vp) && donerec == 0)
373 recbld(); 374 recbld();
374 if (!isnum(vp)) { /* not a number */ 375 if (!isnum(vp)) { /* not a number */
375 vp->fval = atof(vp->sval); /* best guess */ 376 vp->fval = atof(vp->sval); /* best guess */
376 if (is_number(vp->sval) && !(vp->tval&CON)) 377 if (is_number(vp->sval) && !(vp->tval&CON))