Cleanup/fix some BLI_string_utf8 not using size_t/off_t as expected.
authorBastien Montagne <montagne29@wanadoo.fr>
Fri, 20 Jan 2017 12:03:21 +0000 (13:03 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Fri, 20 Jan 2017 15:51:05 +0000 (16:51 +0100)
source/blender/blenkernel/intern/library.c
source/blender/blenkernel/intern/text.c
source/blender/blenlib/BLI_string_utf8.h
source/blender/blenlib/intern/string_utf8.c
source/blender/editors/interface/interface_handlers.c

index ea6137952497bfd52cb89da8b9273dee4be82b94..77013a55d18463c91d66e2dd9039c17d68537df1 100644 (file)
@@ -1408,7 +1408,8 @@ static ID *is_dupid(ListBase *lb, ID *id, const char *name)
 static bool check_for_dupid(ListBase *lb, ID *id, char *name)
 {
        ID *idtest;
-       int nr = 0, a, left_len;
+       int nr = 0, a;
+       size_t left_len;
 #define MAX_IN_USE 64
        bool in_use[MAX_IN_USE];
        /* to speed up finding unused numbers within [1 .. MAX_IN_USE - 1] */
@@ -1442,7 +1443,7 @@ static bool check_for_dupid(ListBase *lb, ID *id, char *name)
 
                /* Code above may have generated invalid utf-8 string, due to raw truncation.
                 * Ensure we get a valid one now! */
-               left_len -= BLI_utf8_invalid_strip(left, left_len);
+               left_len -= (size_t)BLI_utf8_invalid_strip(left, left_len);
 
                for (idtest = lb->first; idtest; idtest = idtest->next) {
                        int nrtest;
@@ -1484,7 +1485,7 @@ static bool check_for_dupid(ListBase *lb, ID *id, char *name)
                 * shave off the end chars until we have a unique name.
                 * Check the null terminators match as well so we don't get Cube.000 -> Cube.00 */
                if (nr == 0 && name[left_len] == '\0') {
-                       int len;
+                       size_t len;
                        /* FIXME: this code will never be executed, because either nr will be
                         * at least 1, or name will not end at left_len! */
                        BLI_assert(0);
index 672857e88fe004316d3f834bdb34bbdd773df067..a0b987d8cfe8d3686df296285cdd47269b35ec9c 100644 (file)
@@ -235,8 +235,9 @@ Text *BKE_text_add(Main *bmain, const char *name)
 /* to a valid utf-8 sequences */
 int txt_extended_ascii_as_utf8(char **str)
 {
-       int bad_char, added = 0, i = 0;
-       int length = strlen(*str);
+       size_t bad_char, i = 0;
+       const size_t length = strlen(*str);
+       int added = 0;
 
        while ((*str)[i]) {
                if ((bad_char = BLI_utf8_invalid_byte(*str + i, length - i)) == -1)
@@ -248,7 +249,7 @@ int txt_extended_ascii_as_utf8(char **str)
        
        if (added != 0) {
                char *newstr = MEM_mallocN(length + added + 1, "text_line");
-               int mi = 0;
+               size_t mi = 0;
                i = 0;
                
                while ((*str)[i]) {
index 0740b574c1a5ab3e369306a0b39704814653b709..970f4e6c3dbbbb289814f35dea07719a61a8c89c 100644 (file)
@@ -36,8 +36,8 @@ extern "C" {
 char        *BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL();
 size_t       BLI_strncpy_utf8_rlen(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL();
 char        *BLI_strncat_utf8(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL();
-int          BLI_utf8_invalid_byte(const char *str, int length) ATTR_NONNULL();
-int          BLI_utf8_invalid_strip(char *str, int length) ATTR_NONNULL();
+off_t        BLI_utf8_invalid_byte(const char *str, size_t length) ATTR_NONNULL();
+int          BLI_utf8_invalid_strip(char *str, size_t length) ATTR_NONNULL();
 
 int          BLI_str_utf8_size(const char *p) ATTR_NONNULL(); /* warning, can return -1 on bad chars */
 int          BLI_str_utf8_size_safe(const char *p) ATTR_NONNULL();
index 0ab11810b48b3a2b2f47fbbc67cefe8358218503..7352cd7332ba0981054b759c0593551812b7b6d8 100644 (file)
@@ -74,7 +74,7 @@ static const size_t utf8_skip_data[256] = {
  *
  * \return the offset of the first invalid byte.
  */
-int BLI_utf8_invalid_byte(const char *str, int length)
+off_t BLI_utf8_invalid_byte(const char *str, size_t length)
 {
        const unsigned char *p, *perr, *pend = (const unsigned char *)str + length;
        unsigned char c;
@@ -161,18 +161,24 @@ int BLI_utf8_invalid_byte(const char *str, int length)
 
 utf8_error:
 
-       return (int)((const char *)perr - (const char *)str);
+       return ((const char *)perr - (const char *)str);
 }
 
-int BLI_utf8_invalid_strip(char *str, int length)
+/**
+ * Remove any invalid utf-8 byte (taking into account multi-bytes sequence of course).
+ *
+ * @return number of stripped bytes.
+ */
+int BLI_utf8_invalid_strip(char *str, size_t length)
 {
-       int bad_char, tot = 0;
+       off_t bad_char;
+       int tot = 0;
 
        BLI_assert(str[length] == '\0');
 
        while ((bad_char = BLI_utf8_invalid_byte(str, length)) != -1) {
                str += bad_char;
-               length -= (bad_char + 1);
+               length -= (size_t)(bad_char + 1);
 
                if (length == 0) {
                        /* last character bad, strip it */
@@ -182,7 +188,7 @@ int BLI_utf8_invalid_strip(char *str, int length)
                }
                else {
                        /* strip, keep looking */
-                       memmove(str, str + 1, (size_t)length + 1);  /* +1 for NULL char! */
+                       memmove(str, str + 1, length + 1);  /* +1 for NULL char! */
                        tot++;
                }
        }
index a761bcfdf5e05f32d981054b6872e05641e55a60..734cd02a05683b4f0d6bd9c92d12af1b8d48dbdc 100644 (file)
@@ -2963,7 +2963,7 @@ static bool ui_textedit_copypaste(uiBut *but, uiHandleButtonData *data, const in
 
                if (pbuf) {
                        if (ui_but_is_utf8(but)) {
-                               buf_len -= BLI_utf8_invalid_strip(pbuf, buf_len);
+                               buf_len -= BLI_utf8_invalid_strip(pbuf, (size_t)buf_len);
                        }
 
                        ui_textedit_insert_buf(but, data, pbuf, buf_len);