Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/intern/text.c15
-rw-r--r--source/blender/blenlib/BLI_string_utf8.h4
-rw-r--r--source/blender/blenlib/intern/string_utf8.c48
-rw-r--r--source/blender/blenloader/intern/writefile.c15
-rw-r--r--source/blender/makesdna/DNA_curve_types.h4
5 files changed, 40 insertions, 46 deletions
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index 296f25e303e..aec924e15b3 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -847,19 +847,6 @@ int txt_utf8_column_to_offset(const char *str, int column)
return offset;
}
-/* returns the real number of characters in string */
-/* not the same as BLI_strlen_utf8, which returns length for wide characters */
-static int txt_utf8_len(const char *src)
-{
- int len;
-
- for (len = 0; *src; len++) {
- src += BLI_str_utf8_size(src);
- }
-
- return len;
-}
-
void txt_move_up(Text *text, short sel)
{
TextLine **linep;
@@ -2059,7 +2046,7 @@ void txt_do_undo(Text *text)
text->undo_pos--;
}
buf[i] = 0;
- linep = txt_utf8_len(buf);
+ linep = BLI_strlen_utf8(buf);
MEM_freeN(buf);
/* skip over the length that was stored again */
diff --git a/source/blender/blenlib/BLI_string_utf8.h b/source/blender/blenlib/BLI_string_utf8.h
index d20cbd2a91c..adef843d2cc 100644
--- a/source/blender/blenlib/BLI_string_utf8.h
+++ b/source/blender/blenlib/BLI_string_utf8.h
@@ -51,8 +51,10 @@ char *BLI_str_prev_char_utf8(const char *p);
/* wchar_t functions, copied from blenders own font.c originally */
size_t BLI_wstrlen_utf8(const wchar_t *src);
+size_t BLI_strlen_utf8_ex(const char *strc, int *r_len_bytes);
size_t BLI_strlen_utf8(const char *strc);
-size_t BLI_strnlen_utf8(const char *start, const size_t maxlen);
+size_t BLI_strnlen_utf8_ex(const char *strc, const size_t maxlen, int *r_len_bytes);
+size_t BLI_strnlen_utf8(const char *strc, const size_t maxlen);
size_t BLI_strncpy_wchar_as_utf8(char *__restrict dst, const wchar_t *__restrict src, const size_t maxcpy);
size_t BLI_strncpy_wchar_from_utf8(wchar_t *__restrict dst, const char *__restrict src, const size_t maxcpy);
diff --git a/source/blender/blenlib/intern/string_utf8.c b/source/blender/blenlib/intern/string_utf8.c
index b8dca95ae33..ab0073a7585 100644
--- a/source/blender/blenlib/intern/string_utf8.c
+++ b/source/blender/blenlib/intern/string_utf8.c
@@ -245,24 +245,16 @@ size_t BLI_wstrlen_utf8(const wchar_t *src)
return len;
}
-/* this is very close to 'BLI_str_utf8_size' functionality, perhaps we should de-duplicate */
-/* size of UTF-8 character in bytes */
-static size_t strlen_utf8_char(const char *strc)
+size_t BLI_strlen_utf8_ex(const char *strc, int *r_len_bytes)
{
- if ((*strc & 0xe0) == 0xc0) {
- if ((strc[1] & 0x80) && (strc[1] & 0x40) == 0x00)
- return 2;
- }
- else if ((*strc & 0xf0) == 0xe0) {
- if ((strc[1] & strc[2] & 0x80) && ((strc[1] | strc[2]) & 0x40) == 0x00)
- return 3;
- }
- else if ((*strc & 0xf8) == 0xf0) {
- if ((strc[1] & strc[2] & strc[3] & 0x80) && ((strc[1] | strc[2] | strc[3]) & 0x40) == 0x00)
- return 4;
- }
+ size_t len;
+ const char *strc_orig = strc;
- return 1;
+ for (len = 0; *strc; len++)
+ strc += BLI_str_utf8_size_safe(strc);
+
+ *r_len_bytes = (strc - strc_orig);
+ return len;
}
size_t BLI_strlen_utf8(const char *strc)
@@ -270,25 +262,37 @@ size_t BLI_strlen_utf8(const char *strc)
size_t len;
for (len = 0; *strc; len++)
- strc += strlen_utf8_char(strc);
+ strc += BLI_str_utf8_size_safe(strc);
return len;
}
+size_t BLI_strnlen_utf8_ex(const char *strc, const size_t maxlen, int *r_len_bytes)
+{
+ size_t len;
+ const char *strc_orig = strc;
+ const char *strc_end = strc + maxlen;
+
+ for (len = 0; *strc && strc < strc_end; len++) {
+ strc += BLI_str_utf8_size_safe(strc);
+ }
+
+ *r_len_bytes = (strc - strc_orig);
+ return len;
+}
+
/**
* \param start the string to measure the length.
* \param maxlen the string length (in bytes)
* \return the unicode length (not in bytes!)
*/
-size_t BLI_strnlen_utf8(const char *start, const size_t maxlen)
+size_t BLI_strnlen_utf8(const char *strc, const size_t maxlen)
{
- const char *strc = start;
- const char *strc_end = start + maxlen;
-
size_t len;
+ const char *strc_end = strc + maxlen;
for (len = 0; *strc && strc < strc_end; len++) {
- strc += strlen_utf8_char(strc);
+ strc += BLI_str_utf8_size_safe(strc);
}
return len;
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 9b6699f3f21..dd4361be1ff 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1642,13 +1642,6 @@ static void write_mballs(WriteData *wd, ListBase *idbase)
}
}
-static int amount_of_chars(char *str)
-{
- // Since the data is saved as UTF-8 to the cu->str
- // The cu->len is not same as the strlen(cu->str)
- return strlen(str);
-}
-
static void write_curves(WriteData *wd, ListBase *idbase)
{
Curve *cu;
@@ -1666,8 +1659,12 @@ static void write_curves(WriteData *wd, ListBase *idbase)
if (cu->adt) write_animdata(wd, cu->adt);
if (cu->vfont) {
- writedata(wd, DATA, amount_of_chars(cu->str)+1, cu->str);
- writestruct(wd, DATA, "CharInfo", cu->len+1, cu->strinfo);
+ /* TODO, sort out 'cu->len', in editmode its character, object mode its bytes */
+ int len_bytes;
+ int len_chars = BLI_strlen_utf8_ex(cu->str, &len_bytes);
+
+ writedata(wd, DATA, len_bytes + 1, cu->str);
+ writestruct(wd, DATA, "CharInfo", len_chars + 1, cu->strinfo);
writestruct(wd, DATA, "TextBox", cu->totbox, cu->tb);
}
else {
diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h
index deb9902c35d..964fa11b0a2 100644
--- a/source/blender/makesdna/DNA_curve_types.h
+++ b/source/blender/makesdna/DNA_curve_types.h
@@ -215,6 +215,10 @@ typedef struct Curve {
void *lastsel;
/* font part */
+ /* WARNING: cu->len is...
+ * - strlen(cu->str) object-mode (bytes).
+ * - BLI_strlen_utf8(cu->str) in edit-mode.
+ * This should be cleaned up and some point, see 'write_curves' - campbell */
short len, lines, pos, spacemode;
float spacing, linedist, shear, fsize, wordspace, ulpos, ulheight;
float xof, yof;