Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/historical/nawk/dist check explicitly for inf and n...



details:   https://anonhg.NetBSD.org/src/rev/b3ad1f700a6d
branches:  trunk
changeset: 943364:b3ad1f700a6d
user:      christos <christos%NetBSD.org@localhost>
date:      Tue Sep 01 00:21:01 2020 +0000

description:
check explicitly for inf and nan. We can't check if it is a number,
because awk parses 1a as 1...

diffstat:

 external/historical/nawk/dist/tran.c |  24 +++++++++++++++++++++---
 1 files changed, 21 insertions(+), 3 deletions(-)

diffs (43 lines):

diff -r ac6e852e2522 -r b3ad1f700a6d external/historical/nawk/dist/tran.c
--- a/external/historical/nawk/dist/tran.c      Mon Aug 31 23:37:55 2020 +0000
+++ b/external/historical/nawk/dist/tran.c      Tue Sep 01 00:21:01 2020 +0000
@@ -395,6 +395,25 @@
        return(vp->sval);
 }
 
+static int checkstr(const char *s, const char *v)
+{
+       while (*s && tolower((unsigned char)*s) == *v)
+               s++, v++;
+       return !(*s || *v);
+}
+
+static int checkinfnan(const char *s)
+{
+       switch (tolower((unsigned char)*s)) {
+       case 'i':
+               return checkstr(s, "inf") || checkstr(s, "infinity");
+       case 'n':
+               return checkstr(s, "nan");
+       default:
+               return 1;
+       }
+}
+
 Awkfloat getfval(Cell *vp)     /* get float val of a Cell */
 {
        if ((vp->tval & (NUM | STR)) == 0)
@@ -404,11 +423,10 @@
        else if (isrec(vp) && !donerec)
                recbld();
        if (!isnum(vp)) {       /* not a number */
+               if (checkinfnan(vp->sval))
+                       vp->fval = atof(vp->sval);      /* best guess */
                if (is_number(vp->sval) && !(vp->tval&CON)) {
-                       vp->fval = atof(vp->sval);      /* best guess */
                        vp->tval |= NUM;        /* make NUM only sparingly */
-               } else {
-                       vp->fval = 0;
                }
        }
           dprintf( ("getfval %p: %s = %g, t=%o\n",



Home | Main Index | Thread Index | Old Index