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 | |
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
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | Src/math.c | 25 |
2 files changed, 21 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog index 9f7289cea..684820f92 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2024-02-24 Bart Schaefer <schaefer@zsh.org> + * 52597: Src/math.c: fix multibyte and metafied character counts + when providing context for operator and operand errors + * 52596: Src/exec.c: metafy interpreter name for error message * Stephane: 52591: Src/builtin.c: printf builtin must pass 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); } |