Module Name:    src
Committed By:   christos
Date:           Tue Sep  1 00:21:02 UTC 2020

Modified Files:
        src/external/historical/nawk/dist: tran.c

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


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/external/historical/nawk/dist/tran.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/historical/nawk/dist/tran.c
diff -u src/external/historical/nawk/dist/tran.c:1.12 src/external/historical/nawk/dist/tran.c:1.13
--- src/external/historical/nawk/dist/tran.c:1.12	Mon Aug 31 19:36:58 2020
+++ src/external/historical/nawk/dist/tran.c	Mon Aug 31 20:21:01 2020
@@ -395,6 +395,25 @@ char *setsval(Cell *vp, const char *s)	/
 	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 @@ Awkfloat getfval(Cell *vp)	/* get float 
 	else if (isrec(vp) && !donerec)
 		recbld();
 	if (!isnum(vp)) {	/* not a number */
-		if (is_number(vp->sval) && !(vp->tval&CON)) {
+		if (checkinfnan(vp->sval))
 			vp->fval = atof(vp->sval);	/* best guess */
+		if (is_number(vp->sval) && !(vp->tval&CON)) {
 			vp->tval |= NUM;	/* make NUM only sparingly */
-		} else {
-			vp->fval = 0;
 		}
 	}
 	   dprintf( ("getfval %p: %s = %g, t=%o\n",

Reply via email to