diff options
author | Andrew Main <zefram@users.sourceforge.net> | 2000-09-02 17:09:28 +0000 |
---|---|---|
committer | Andrew Main <zefram@users.sourceforge.net> | 2000-09-02 17:09:28 +0000 |
commit | 960728aad2d745c3daaafb1bdce6bcababbc605f (patch) | |
tree | 5171efec0e590bc347d7af5d5ca23db3cd44922b /Src/math.c | |
parent | 0cea5554a84ac344a8efb1d091440c472e9f21be (diff) | |
download | zsh-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.c | 37 |
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 ' ': |