diff options
| author | dgp <dgp@users.sourceforge.net> | 2017-06-16 20:28:53 (GMT) |
|---|---|---|
| committer | dgp <dgp@users.sourceforge.net> | 2017-06-16 20:28:53 (GMT) |
| commit | cca5a0c27a301473dd9e717180bb6db0cabd8f78 (patch) | |
| tree | d761f4a3fb5546b8115125f8dc40389056c00bbf /generic/tclUtf.c | |
| parent | 9a51ddaa6e245b55bd471afb1797e1a11eecb960 (diff) | |
| parent | 73f548527aa3d3852c86c86fba701c277e43e40f (diff) | |
| download | tcl-cca5a0c27a301473dd9e717180bb6db0cabd8f78.zip tcl-cca5a0c27a301473dd9e717180bb6db0cabd8f78.tar.gz tcl-cca5a0c27a301473dd9e717180bb6db0cabd8f78.tar.bz2 | |
merge trunk
Diffstat (limited to 'generic/tclUtf.c')
| -rw-r--r-- | generic/tclUtf.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/generic/tclUtf.c b/generic/tclUtf.c index c46d250..161a4bd 100644 --- a/generic/tclUtf.c +++ b/generic/tclUtf.c @@ -459,7 +459,6 @@ Tcl_NumUtfChars( * for strlen(string). */ { Tcl_UniChar ch; - register Tcl_UniChar *chPtr = &ch; register int i; /* @@ -472,23 +471,25 @@ Tcl_NumUtfChars( i = 0; if (length < 0) { while (*src != '\0') { - src += TclUtfToUniChar(src, chPtr); + src += TclUtfToUniChar(src, &ch); i++; } + if (i < 0) i = INT_MAX; /* Bug [2738427] */ } else { - register int n; - - while (length > 0) { - if (UCHAR(*src) < 0xC0) { - length--; - src++; - } else { - n = Tcl_UtfToUniChar(src, chPtr); - length -= n; - src += n; - } + register const char *endPtr = src + length - TCL_UTF_MAX; + + while (src < endPtr) { + src += TclUtfToUniChar(src, &ch); i++; } + endPtr += TCL_UTF_MAX; + while ((src < endPtr) && Tcl_UtfCharComplete(src, endPtr - src)) { + src += TclUtfToUniChar(src, &ch); + i++; + } + if (src < endPtr) { + i += endPtr - src; + } } return i; } |
