Commit: 12f60e7825aa2db3cb1b8dc84ba983fb72e9f41c
Author: Bastien Montagne
Date:   Fri Feb 27 21:31:54 2015 +0100
Branches: master
https://developer.blender.org/rB12f60e7825aa2db3cb1b8dc84ba983fb72e9f41c

Fix T43834: Text object looses one char after another by entering/leaving edit 
mode.

Own mistake in refactoring of `BLI_strncpy_wchar_as_utf8()`, if given size was 
exactly
the one needed, we'd lost last char (off-by-one error).

Many thanks to plasmasolutions (Thomas Beck) who found the issue and did
all the investigation work here!

===================================================================

M       source/blender/blenlib/intern/string_utf8.c

===================================================================

diff --git a/source/blender/blenlib/intern/string_utf8.c 
b/source/blender/blenlib/intern/string_utf8.c
index c93c3cf..67ff532 100644
--- a/source/blender/blenlib/intern/string_utf8.c
+++ b/source/blender/blenlib/intern/string_utf8.c
@@ -249,7 +249,7 @@ char *BLI_strncat_utf8(char *__restrict dst, const char 
*__restrict src, size_t
 size_t BLI_strncpy_wchar_as_utf8(char *__restrict dst, const wchar_t 
*__restrict src, const size_t maxncpy)
 {
        const size_t maxlen = maxncpy - 1;
-       const size_t maxlen_secured = ((int)maxlen - 6) < 0 ? 0 : maxlen - 6;  
/* 6 is max utf8 length of an unicode char. */
+       const int64_t maxlen_secured = (int64_t)maxlen - 6;  /* 6 is max utf8 
length of an unicode char. */
        size_t len = 0;
 
        BLI_assert(maxncpy != 0);
@@ -258,7 +258,7 @@ size_t BLI_strncpy_wchar_as_utf8(char *__restrict dst, 
const wchar_t *__restrict
        memset(dst, 0xff, sizeof(*dst) * maxncpy);
 #endif
 
-       while (*src && len < maxlen_secured) {
+       while (*src && len <= maxlen_secured) {
                len += BLI_str_utf8_from_unicode((unsigned int)*src++, dst + 
len);
        }
 
@@ -268,7 +268,7 @@ size_t BLI_strncpy_wchar_as_utf8(char *__restrict dst, 
const wchar_t *__restrict
                char t[6];
                size_t l = BLI_str_utf8_from_unicode((unsigned int)*src++, t);
                BLI_assert(l <= 6);
-               if (len + l >= maxlen) {
+               if (len + l > maxlen) {
                        break;
                }
                memcpy(dst + len, t, l);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to