diff options
Diffstat (limited to 'Src/pattern.c')
-rw-r--r-- | Src/pattern.c | 19 |
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 */ |