summaryrefslogtreecommitdiff
path: root/Src/pattern.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2006-06-28 13:12:55 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2006-06-28 13:12:55 +0000
commit6157c14d0602c698aa9ebfac9a2135ef095a76b4 (patch)
treecae7cb80281a1426c06734889fd8f0b83292c6ca /Src/pattern.c
parentf95a6a913c885932827e9c0219221f7de7ccdd79 (diff)
downloadzsh-6157c14d0602c698aa9ebfac9a2135ef095a76b4.tar.gz
zsh-6157c14d0602c698aa9ebfac9a2135ef095a76b4.zip
22525: lengths and cases of multibyte strings in parameters and history
Diffstat (limited to 'Src/pattern.c')
-rw-r--r--Src/pattern.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/Src/pattern.c b/Src/pattern.c
index a39095c37..bc9afbae3 100644
--- a/Src/pattern.c
+++ b/Src/pattern.c
@@ -1644,17 +1644,12 @@ charrefinc(char **x, char *y)
}
-#ifndef PARAMETER_CODE_HANDLES_MULTIBYTE
/*
- * TODO: We should use the other branch, but currently
- * the parameter code doesn't handle multibyte input,
- * so this would produce the wrong subscripts,
- * so just use a raw byte difference for now.
+ * Counter the number of characters between two pointers, smaller first
+ *
+ * This is used when setting values in parameters, so we obey
+ * the MULTIBYTE option (even if it's been overridden locally).
*/
-/* Counter the number of characters between two pointers, smaller first */
-# define CHARSUB(x,y) ((y) - (x))
-#else
-/* Counter the number of characters between two pointers, smaller first */
#define CHARSUB(x,y) charsub(x, y)
static ptrdiff_t
charsub(char *x, char *y)
@@ -1663,6 +1658,9 @@ charsub(char *x, char *y)
size_t ret;
wchar_t wc;
+ if (!isset(MULTIBYTE))
+ return y - x;
+
while (x < y) {
ret = mbrtowc(&wc, x, y-x, &shiftstate);
@@ -1674,13 +1672,12 @@ charsub(char *x, char *y)
/* Treat nulls as normal characters */
if (!ret)
ret = 1;
- res += ret;
+ res++;
x += ret;
}
return res;
}
-#endif
#else /* no MULTIBYTE_SUPPORT */