diff options
author | Bart Schaefer <schaefer@zsh.org> | 2024-02-24 21:16:15 -0800 |
---|---|---|
committer | Bart Schaefer <schaefer@zsh.org> | 2024-02-24 21:16:15 -0800 |
commit | 6c50d155625d83bde35dc78bc6920c9795462d58 (patch) | |
tree | 18fed694252cbe139ca304e68f060dff1a452f40 /Src | |
parent | 69c0c646bbabb1caaeb62242e9323a62bf3cd57a (diff) | |
download | zsh-6c50d155625d83bde35dc78bc6920c9795462d58.tar.gz zsh-6c50d155625d83bde35dc78bc6920c9795462d58.tar.xz zsh-6c50d155625d83bde35dc78bc6920c9795462d58.zip |
52597: fix character counts in context of operator and operand errors
Diffstat (limited to 'Src')
-rw-r--r-- | Src/math.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/Src/math.c b/Src/math.c index 50b69d6a1..d97dae238 100644 --- a/Src/math.c +++ b/Src/math.c @@ -1557,21 +1557,32 @@ checkunary(int mtokc, char *mptr) errmsg = 2; } if (errmsg) { - int len, over = 0; + int len = 0, over = 0; char *errtype = errmsg == 2 ? "operator" : "operand"; while (inblank(*mptr)) mptr++; - len = ztrlen(mptr); - if (len > 10) { - len = 10; - over = 1; + if (isset(MULTIBYTE)) + MB_CHARINIT(); + while (over < 10 && mptr[len]) { + if (isset(MULTIBYTE)) + len += MB_METACHARLEN(mptr+len); + else + len += (mptr[len] == Meta ? 2 : 1); + ++over; + } + if ((over = mptr[len])) { + mptr = dupstring(mptr); + if (mptr[len] == Meta) + mptr[len+1] = 0; + else + mptr[len] = 0; } if (!*mptr) zerr("bad math expression: %s expected at end of string", errtype); else - zerr("bad math expression: %s expected at `%l%s'", - errtype, mptr, len, over ? "..." : ""); + zerr("bad math expression: %s expected at `%s%s'", + errtype, mptr, over ? "..." : ""); } unary = !(tp & OP_OPF); } |