Mon Aug 31 23:36:58 2020 UTC ()
Don't try so hard to convert strings into numbers. Results in bogus
conversions like:

% awk 'BEGIN { print "nanotime" + 123 }'
nan
% awk 'BEGIN { print "microtime" + 123 }'
123
% awk 'BEGIN { print "inftime" + 123 }'
inf


(christos)
diff -r1.11 -r1.12 src/external/historical/nawk/dist/tran.c

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

--- src/external/historical/nawk/dist/tran.c 2020/02/18 21:12:21 1.11
+++ src/external/historical/nawk/dist/tran.c 2020/08/31 23:36:58 1.12
@@ -394,29 +394,32 @@ char *setsval(Cell *vp, const char *s) / @@ -394,29 +394,32 @@ char *setsval(Cell *vp, const char *s) /
394 394
395 return(vp->sval); 395 return(vp->sval);
396} 396}
397 397
398Awkfloat getfval(Cell *vp) /* get float val of a Cell */ 398Awkfloat getfval(Cell *vp) /* get float val of a Cell */
399{ 399{
400 if ((vp->tval & (NUM | STR)) == 0) 400 if ((vp->tval & (NUM | STR)) == 0)
401 funnyvar(vp, "read value of"); 401 funnyvar(vp, "read value of");
402 if (isfld(vp) && !donefld) 402 if (isfld(vp) && !donefld)
403 fldbld(); 403 fldbld();
404 else if (isrec(vp) && !donerec) 404 else if (isrec(vp) && !donerec)
405 recbld(); 405 recbld();
406 if (!isnum(vp)) { /* not a number */ 406 if (!isnum(vp)) { /* not a number */
407 vp->fval = atof(vp->sval); /* best guess */ 407 if (is_number(vp->sval) && !(vp->tval&CON)) {
408 if (is_number(vp->sval) && !(vp->tval&CON)) 408 vp->fval = atof(vp->sval); /* best guess */
409 vp->tval |= NUM; /* make NUM only sparingly */ 409 vp->tval |= NUM; /* make NUM only sparingly */
 410 } else {
 411 vp->fval = 0;
 412 }
410 } 413 }
411 dprintf( ("getfval %p: %s = %g, t=%o\n", 414 dprintf( ("getfval %p: %s = %g, t=%o\n",
412 (void*)vp, NN(vp->nval), vp->fval, vp->tval) ); 415 (void*)vp, NN(vp->nval), vp->fval, vp->tval) );
413 return(vp->fval); 416 return(vp->fval);
414} 417}
415 418
416static char *get_str_val(Cell *vp, char **fmt) /* get string val of a Cell */ 419static char *get_str_val(Cell *vp, char **fmt) /* get string val of a Cell */
417{ 420{
418 char s[256]; 421 char s[256];
419 double dtemp; 422 double dtemp;
420 423
421 if ((vp->tval & (NUM | STR)) == 0) 424 if ((vp->tval & (NUM | STR)) == 0)
422 funnyvar(vp, "read value of"); 425 funnyvar(vp, "read value of");