about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2002-04-25 15:46:22 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2002-04-25 15:46:22 +0000
commit8bfa024da9d56e884ea1dbb5fa4b6ecca6b80317 (patch)
treedadde5d26cbc39a449a84c46615eccc6f8567d96 /Src
parente420cc259c6b98499483b384c3e2584ffa81d81b (diff)
downloadzsh-8bfa024da9d56e884ea1dbb5fa4b6ecca6b80317.tar.gz
zsh-8bfa024da9d56e884ea1dbb5fa4b6ecca6b80317.tar.xz
zsh-8bfa024da9d56e884ea1dbb5fa4b6ecca6b80317.zip
17046: Src/math.c: OCTAL_ZEROES with a `0' on its own was
	swallowing up too many characters.
Diffstat (limited to 'Src')
-rw-r--r--Src/math.c49
1 files changed, 43 insertions, 6 deletions
diff --git a/Src/math.c b/Src/math.c
index 5b2357c74..6e3fce777 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -186,6 +186,8 @@ static int type[TOKCOUNT] =
 /* 50 */  LR|OP_OPF, RL|OP_E2, LR|OP_OPF
 };
 
+/**/
+int outputradix;
 
 /**/
 static int
@@ -340,12 +342,35 @@ zzlex(void)
 	    return EOI;
 	case '[':
 	    {
-		int base = zstrtol(ptr, &ptr, 10);
+		int n;
 
-		if (*ptr == ']')
-		    ptr++;
-		yyval.u.l = zstrtol(ptr, &ptr, lastbase = base);
-		return NUM;
+		if (idigit(*ptr)) {
+		    n = zstrtol(ptr, &ptr, 10);
+		    if (*ptr != ']' || !idigit(*++ptr)) {
+			zerr("bad base syntax", NULL, 0);
+			return EOI;
+		    }
+		    yyval.u.l = zstrtol(ptr, &ptr, lastbase = n);
+		    return NUM;
+		}
+		if (*ptr == '#') {
+		    n = 1;
+		    if (*++ptr == '#') {
+			n = -1;
+			ptr++;
+		    }
+		    if (!idigit(*ptr))
+			goto bofs;
+		    outputradix = n * zstrtol(ptr, &ptr, 10);
+		} else {
+		    bofs:
+		    zerr("bad output format specification", NULL, 0);
+		    return EOI;
+		}
+		if(*ptr != ']')
+			goto bofs;
+		ptr++;
+		break;
 	    }
 	case ' ':
 	case '\t':
@@ -357,6 +382,12 @@ zzlex(void)
 		yyval.u.l = zstrtol(++ptr, &ptr, lastbase = 16);
 		return NUM;
 	    }
+	    else if (isset(OCTALZEROES) &&
+		    (memchr(ptr, '.', strlen(ptr)) == NULL) &&
+		     idigit(*ptr)) {
+	        yyval.u.l = zstrtol(ptr, &ptr, lastbase = 8);
+		return NUM;
+	    }
 	/* Fall through! */
 	default:
 	    if (idigit(*--ptr) || *ptr == '.') {
@@ -465,10 +496,12 @@ getcvar(char *s)
     mnumber mn;
     mn.type = MN_INTEGER;
 
+    queue_signals();
     if (!(t = getsparam(s)))
 	mn.u.l = 0;
     else
         mn.u.l = STOUC(*t == Meta ? t[1] ^ 32 : *t);
+    unqueue_signals();
     return mn;
 }
 
@@ -485,6 +518,7 @@ setvar(char *s, mnumber v)
     }
     if (noeval)
 	return v;
+    untokenize(s);
     setnparam(s, v);
     return v;
 }
@@ -929,6 +963,9 @@ matheval(char *s)
     char *junk;
     mnumber x;
     int xmtok = mtok;
+    /* maintain outputradix across levels of evaluation */
+    if (!mlevel)
+	outputradix = 0;
 
     if (!*s) {
 	x.type = MN_INTEGER;
@@ -943,7 +980,7 @@ matheval(char *s)
 }
 
 /**/
-zlong
+mod_export zlong
 mathevali(char *s)
 {
     mnumber x = matheval(s);