about summary refs log tree commit diff
path: root/Src/math.c
diff options
context:
space:
mode:
authorAndrew Main <zefram@users.sourceforge.net>2000-09-02 17:09:28 +0000
committerAndrew Main <zefram@users.sourceforge.net>2000-09-02 17:09:28 +0000
commit960728aad2d745c3daaafb1bdce6bcababbc605f (patch)
tree5171efec0e590bc347d7af5d5ca23db3cd44922b /Src/math.c
parent0cea5554a84ac344a8efb1d091440c472e9f21be (diff)
downloadzsh-960728aad2d745c3daaafb1bdce6bcababbc605f.tar.gz
zsh-960728aad2d745c3daaafb1bdce6bcababbc605f.tar.xz
zsh-960728aad2d745c3daaafb1bdce6bcababbc605f.zip
12722: [##base] for output base selection without a base prefix
Diffstat (limited to 'Src/math.c')
-rw-r--r--Src/math.c37
1 files changed, 25 insertions, 12 deletions
diff --git a/Src/math.c b/Src/math.c
index 38466ed8e..77c7df2a5 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -342,21 +342,34 @@ zzlex(void)
 	    return EOI;
 	case '[':
 	    {
-		int base, setradix = 0;
-		if (*ptr == '#') {
-		    ptr++;
-		    setradix = 1;
-		}
-		base = zstrtol(ptr, &ptr, 10);
+		int n;
 
-		if (*ptr == ']')
-		    ptr++;
-		if (setradix)
-		    outputradix = base;
-		else {
-		    yyval.u.l = zstrtol(ptr, &ptr, lastbase = base);
+		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 ' ':