summaryrefslogtreecommitdiff
path: root/Src/Modules
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2015-06-12 09:30:39 +0100
committerPeter Stephenson <pws@zsh.org>2015-06-12 09:30:39 +0100
commitf1923bdfa6300a0d32e3329eb2488447f76b8970 (patch)
treeeed76e87f3e28384f5597030978d802265715a14 /Src/Modules
parent370e7f73f68af06aaf1595bc8b16ec7e8c910409 (diff)
downloadzsh-f1923bdfa6300a0d32e3329eb2488447f76b8970.tar.gz
zsh-f1923bdfa6300a0d32e3329eb2488447f76b8970.zip
Add non-metafied character length handling.
Use this in regex module and add test using $'\ua0'. Rename mb_metacharinit() to mb_charinit() as it does not involve metafied characters.
Diffstat (limited to 'Src/Modules')
-rw-r--r--Src/Modules/curses.c2
-rw-r--r--Src/Modules/regex.c33
2 files changed, 24 insertions, 11 deletions
diff --git a/Src/Modules/curses.c b/Src/Modules/curses.c
index 41ad2c6e4..62dbd55ea 100644
--- a/Src/Modules/curses.c
+++ b/Src/Modules/curses.c
@@ -765,7 +765,7 @@ zccmd_string(const char *nam, char **args)
w = (ZCWin)getdata(node);
#ifdef HAVE_WADDWSTR
- mb_metacharinit();
+ mb_charinit();
wptr = wstr = zhalloc((strlen(str)+1) * sizeof(wchar_t));
while (*str && (clen = mb_metacharlenconv(str, &wc))) {
diff --git a/Src/Modules/regex.c b/Src/Modules/regex.c
index ce57de986..94f523f32 100644
--- a/Src/Modules/regex.c
+++ b/Src/Modules/regex.c
@@ -115,6 +115,7 @@ zcond_regex_match(char **a, int id)
} else {
zlong offs;
char *ptr;
+ int clen, leftlen;
m = matches;
s = metafy(lhstr + m->rm_so, m->rm_eo - m->rm_so, META_DUP);
@@ -123,19 +124,25 @@ zcond_regex_match(char **a, int id)
* Count the characters before the match.
*/
ptr = lhstr;
+ leftlen = m->rm_so;
offs = 0;
- MB_METACHARINIT();
- while (ptr < lhstr + m->rm_so) {
+ MB_CHARINIT();
+ while (leftlen) {
offs++;
- ptr += MB_METACHARLEN(ptr);
+ clen = MB_CHARLEN(ptr, leftlen);
+ ptr += clen;
+ leftlen -= clen;
}
setiparam("MBEGIN", offs + !isset(KSHARRAYS));
/*
* Add on the characters in the match.
*/
- while (ptr < lhstr + m->rm_eo) {
+ leftlen = m->rm_eo - m->rm_so;
+ while (leftlen) {
offs++;
- ptr += MB_METACHARLEN(ptr);
+ clen = MB_CHARLEN(ptr, leftlen);
+ ptr += clen;
+ leftlen -= clen;
}
setiparam("MEND", offs + !isset(KSHARRAYS) - 1);
if (nelem) {
@@ -149,19 +156,25 @@ zcond_regex_match(char **a, int id)
{
char buf[DIGBUFSIZE];
ptr = lhstr;
+ leftlen = m->rm_so;
offs = 0;
/* Find the start offset */
- MB_METACHARINIT();
- while (ptr < lhstr + m->rm_so) {
+ MB_CHARINIT();
+ while (leftlen) {
offs++;
- ptr += MB_METACHARLEN(ptr);
+ clen = MB_CHARLEN(ptr, leftlen);
+ ptr += clen;
+ leftlen -= clen;
}
convbase(buf, offs + !isset(KSHARRAYS), 10);
*bptr = ztrdup(buf);
/* Continue to the end offset */
- while (ptr < lhstr + m->rm_eo) {
+ leftlen = m->rm_eo - m->rm_so;
+ while (leftlen ) {
offs++;
- ptr += MB_METACHARLEN(ptr);
+ clen = MB_CHARLEN(ptr, leftlen);
+ ptr += clen;
+ leftlen -= clen;
}
convbase(buf, offs + !isset(KSHARRAYS) - 1, 10);
*eptr = ztrdup(buf);