about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>2000-03-14 08:17:02 +0000
committerTanaka Akira <akr@users.sourceforge.net>2000-03-14 08:17:02 +0000
commitd14884912efc76cfef3b6bbbb679a753901d46f6 (patch)
treeb761e46d68ade57f59547fd86c098715bbe6d546
parentd7e3ef40ec5b99676d7f33f501c8f3b59446a938 (diff)
downloadzsh-d14884912efc76cfef3b6bbbb679a753901d46f6.tar.gz
zsh-d14884912efc76cfef3b6bbbb679a753901d46f6.tar.xz
zsh-d14884912efc76cfef3b6bbbb679a753901d46f6.zip
zsh-workers/10125
-rw-r--r--Src/math.c82
-rw-r--r--Src/params.c2
2 files changed, 11 insertions, 73 deletions
diff --git a/Src/math.c b/Src/math.c
index 2dc667c35..7eec82e63 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -47,6 +47,8 @@ static char *ptr;
 static mnumber yyval;
 static char *yylval;
 
+#define MAX_MLEVEL 256
+
 static int mlevel = 0;
 
 /* != 0 means recognize unary plus, minus, etc. */
@@ -861,6 +863,14 @@ mathevall(char *s, int prek, char **ep)
     struct mathvalue *xstack = 0, nstack[STACKSZ];
     mnumber ret;
 
+    if (mlevel >= MAX_MLEVEL) {
+	xyyval.type = MN_INTEGER;
+	xyyval.u.l = 0;
+
+	zerr("math recursion limit exceeded", NULL, 0);
+
+	return xyyval;
+    }
     if (mlevel++) {
 	xlastbase = lastbase;
 	xnoeval = noeval;
@@ -950,78 +960,6 @@ mathevalarg(char *s, char **ss)
     return (x.type & MN_FLOAT) ? (zlong)x.u.d : x.u.l;
 }
 
-/**/
-mod_export mnumber
-mathnumber(char *s)
-{
-    mnumber ret;
-
-    ret.type = MN_INTEGER;
-
-    while (*s) {
-	switch (*s++) {
-	case '[':
-	    {
-		int base = zstrtol(s, &s, 10);
-
-		if (*s == ']')
-		    s++;
-		ret.u.l = zstrtol(s, &s, base);
-		return ret;
-	    }
-	case ' ':
-	case '\t':
-	case '\n':
-	    break;
-	case '0':
-	    if (*s == 'x' || *s == 'X') {
-		/* Should we set lastbase here? */
-		ret.u.l = zstrtol(++s, &s, 16);
-		return ret;
-	    }
-	/* Fall through! */
-	default:
-	    if (idigit(*--s) || *s == '.') {
-		char *nptr;
-#ifdef USE_LOCALE
-		char *prev_locale;
-#endif
-		for (nptr = s; idigit(*nptr); nptr++);
-
-		if (*nptr == '.' || *nptr == 'e' || *nptr == 'E') {
-		    /* it's a float */
-		    ret.type = MN_FLOAT;
-#ifdef USE_LOCALE
-		    prev_locale = setlocale(LC_NUMERIC, NULL);
-		    setlocale(LC_NUMERIC, "POSIX");
-#endif
-		    ret.u.d = strtod(s, &nptr);
-#ifdef USE_LOCALE
-		    setlocale(LC_NUMERIC, prev_locale);
-#endif
-		    if (s == nptr || *nptr == '.')
-			goto end;
-		    s = nptr;
-		} else {
-		    /* it's an integer */
-		    ret.u.l = zstrtol(s, &s, 10);
-
-		    if (*s == '#')
-			ret.u.l = zstrtol(++s, &s, ret.u.l);
-		}
-		return ret;
-	    }
-	    goto end;
-	}
-    }
- end:
-
-    ret.type = MN_INTEGER;
-    ret.u.l = 0;
-
-    return ret;
-}
-
 /*
  * Make sure we have an operator or an operand, whatever is expected.
  * For this purpose, unary operators constitute part of an operand.
diff --git a/Src/params.c b/Src/params.c
index 5ed1c879b..d5c419daf 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -1420,7 +1420,7 @@ getnumvalue(Value v)
 	mn.type = MN_FLOAT;
 	mn.u.d = v->pm->gets.ffn(v->pm);
     } else
-	return mathnumber(getstrvalue(v));
+	return matheval(getstrvalue(v));
     return mn;
 }