diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | Src/hist.c | 12 | ||||
-rw-r--r-- | Src/params.c | 17 | ||||
-rw-r--r-- | Test/D07multibyte.ztst | 18 |
4 files changed, 50 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog index a418352fd..f914bb232 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,12 @@ 2010-10-10 Peter Stephenson <p.w.stephenson@ntlworld.com> - * 28332: Src/hist.c: HIST_LEX_WORDS didn't handled + * 28340: Src/params.c: assignment with negative index didn't + work with multibyte characters. + + * 28339: Src/hist.c: NO_HIST_LEX_WORDS didn't handle + backslash-newline line continuation properly, either. + + * 28332: Src/hist.c: HIST_LEX_WORDS didn't handle backslash-newline line continuation properly. Come to think of it, neither does the alternative. @@ -13728,5 +13734,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.5101 $ +* $Revision: 1.5102 $ ***************************************************** diff --git a/Src/hist.c b/Src/hist.c index 0eeb98fb0..e65ddb1b6 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -2365,7 +2365,7 @@ readhistfile(char *fn, int err, int readflags) */ if (inblank(*pt)) pt++; - else if (strpfx("\\\n", pt)) + else if (pt[0] == '\\' && pt[1] == '\n') pt += 2; else break; @@ -2414,8 +2414,14 @@ readhistfile(char *fn, int err, int readflags) } if (!uselex) { do { - while (inblank(*pt)) - pt++; + for (;;) { + if (inblank(*pt)) + pt++; + else if (pt[0] == '\\' && pt[1] == '\n') + pt += 2; + else + break; + } if (*pt) { if (nwordpos >= nwords) words = (short *) diff --git a/Src/params.c b/Src/params.c index 9a9f45893..f49a07f1a 100644 --- a/Src/params.c +++ b/Src/params.c @@ -2275,9 +2275,22 @@ setstrvalue(Value v, char *val) if (v->start > zlen) v->start = zlen; if (v->end < 0) { - v->end += zlen + 1; - if (v->end < 0) + v->end += zlen; + if (v->end < 0) { v->end = 0; + } else if (v->end >= zlen) { + v->end = zlen; + } else { +#ifdef MULTIBYTE_SUPPORT + if (isset(MULTIBYTE)) { + v->end += MB_METACHARLEN(z + v->end); + } else { + v->end++; + } +#else + v->end++; +#endif + } } else if (v->end > zlen) v->end = zlen; diff --git a/Test/D07multibyte.ztst b/Test/D07multibyte.ztst index 53cbe2a1d..2cb995346 100644 --- a/Test/D07multibyte.ztst +++ b/Test/D07multibyte.ztst @@ -447,3 +447,21 @@ print $(( [#16] #REPLY )) 0:read passes through invalid multibyte characters >0xC5 + + word=abcま + word[-1]= + print $word + word=abcま + word[-2]= + print $word + word=abcま + word[4]=d + print $word + word=abcま + word[3]=not_c + print $word +0:assignment with negative indices +>abc +>abま +>abcd +>abnot_cま |