diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2002-04-25 15:46:22 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2002-04-25 15:46:22 +0000 |
commit | 8bfa024da9d56e884ea1dbb5fa4b6ecca6b80317 (patch) | |
tree | dadde5d26cbc39a449a84c46615eccc6f8567d96 | |
parent | e420cc259c6b98499483b384c3e2584ffa81d81b (diff) | |
download | zsh-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.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/math.c | 49 |
2 files changed, 48 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog index 0df1313e9..9f3de0702 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2002-04-25 Peter Stephenson <pws@csr.com> + + * 17046: Src/math.c: OCTAL_ZEROES with a `0' on its own was + swallowing up too many characters. + 2002-04-25 Clint Adams <clint@zsh.org> * 17045: Completion/Unix/Command/_w3m: complete all files, not 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); |