diff options
author | dgp <dgp@users.sourceforge.net> | 2018-10-17 20:02:16 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2018-10-17 20:02:16 (GMT) |
commit | da461559312846043039c84d96a019da01f4dd06 (patch) | |
tree | 1a601db6a9ca3444d7418ec591f320756df6f58f /generic/tclUtf.c | |
parent | 4252e1f99f58589cf3ab90f0d2fe8f83f48fd996 (diff) | |
parent | e154c5151281fbbe01ef1361f5f6980a5ec5a6d3 (diff) | |
download | tcl-da461559312846043039c84d96a019da01f4dd06.zip tcl-da461559312846043039c84d96a019da01f4dd06.tar.gz tcl-da461559312846043039c84d96a019da01f4dd06.tar.bz2 |
merge 8.7
Diffstat (limited to 'generic/tclUtf.c')
-rw-r--r-- | generic/tclUtf.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/generic/tclUtf.c b/generic/tclUtf.c index c8292a2..ce67db7 100644 --- a/generic/tclUtf.c +++ b/generic/tclUtf.c @@ -225,7 +225,7 @@ Tcl_UniCharToUtfDString( */ oldLength = Tcl_DStringLength(dsPtr); - Tcl_DStringSetLength(dsPtr, (oldLength + uniLength + 1) * 4); + Tcl_DStringSetLength(dsPtr, oldLength + (uniLength + 1) * 4); string = Tcl_DStringValue(dsPtr) + oldLength; p = string; @@ -434,20 +434,32 @@ Tcl_UtfToUniCharDString( */ oldLength = Tcl_DStringLength(dsPtr); -/* TODO: fix overreach! */ + Tcl_DStringSetLength(dsPtr, - (int) ((oldLength + length + 1) * sizeof(Tcl_UniChar))); + oldLength + (int) ((length + 1) * sizeof(Tcl_UniChar))); wString = (Tcl_UniChar *) (Tcl_DStringValue(dsPtr) + oldLength); w = wString; - end = src + length; - for (p = src; p < end; ) { + p = src; + end = src + length - 4; + while (p < end) { p += TclUtfToUniChar(p, &ch); *w++ = ch; } + end += 4; + while (p < end) { + if (Tcl_UtfCharComplete(p, end-p)) { + p += TclUtfToUniChar(p, &ch); + } else if ((unsigned)((UCHAR(*p)-0x80)) < (unsigned) 0x20) { + ch = (Tcl_UniChar) cp1252[UCHAR(*p++)-0x80]; + } else { + ch = UCHAR(*p++); + } + *w++ = ch; + } *w = '\0'; Tcl_DStringSetLength(dsPtr, - (oldLength + ((char *) w - (char *) wString))); + oldLength + ((char *) w - (char *) wString)); return wString; } @@ -771,8 +783,8 @@ Tcl_UniCharAtIndex( * * Returns a pointer to the specified character (not byte) position in * the UTF-8 string. If TCL_UTF_MAX <= 4, characters > U+FFFF count as - * 2 positions, but then the pointer should never be placed between - * the two positions. + * 2 positions, but then the pointer should never be placed between + * the two positions. * * Results: * As above. |