Fix #27445: various operators missing with some non-english system languages.
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Thu, 26 May 2011 09:58:22 +0000 (09:58 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Thu, 26 May 2011 09:58:22 +0000 (09:58 +0000)
In the case of this bug e.g. material.new became MATERiAL_OT_new, due to
different capitalization of "i" in Turkish. Fixed by not using the locale
dependent toupper/tolower functions.

source/blender/blenlib/BLI_string.h
source/blender/blenlib/intern/string.c
source/blender/windowmanager/intern/wm_operators.c

index 635c38e1d13cdc9305a3fb7f34ab0fc8f9f6482f..69702f720264361f2237ea418bc45a4c0c12dade 100644 (file)
@@ -147,6 +147,9 @@ void BLI_timestr(double _time, char *str); /* time var is global */
 int BLI_utf8_invalid_byte(const char *str, int length);
 int BLI_utf8_invalid_strip(char *str, int length);
 
+void BLI_ascii_strtolower(char *str, int len);
+void BLI_ascii_strtoupper(char *str, int len);
+
 #ifdef __cplusplus
 }
 #endif
index ee5bd17c901665bf75a238cf6b815cfc912428b3..11de8a3d45c0a9ab56b180a0eeb036ba08ee9285 100644 (file)
@@ -469,3 +469,21 @@ int BLI_utf8_invalid_strip(char *str, int length)
        return tot;
 }
 
+void BLI_ascii_strtolower(char *str, int len)
+{
+       int i;
+
+       for(i=0; i<len; i++)
+               if(str[i] >= 'A' && str[i] <= 'Z')
+                       str[i] += 'a' - 'A';
+}
+
+void BLI_ascii_strtoupper(char *str, int len)
+{
+       int i;
+
+       for(i=0; i<len; i++)
+               if(str[i] >= 'a' && str[i] <= 'z')
+                       str[i] -= 'a' - 'A';
+}
+
index 8ac7a3d7eb628131a1a6a250ac8974ee185408c1..78610d48a92519f52e86e613596b3ab14584f785 100644 (file)
@@ -56,6 +56,7 @@
 #include "BLI_blenlib.h"
 #include "BLI_dynstr.h" /*for WM_operator_pystring */
 #include "BLI_math.h"
+#include "BLI_string.h"
 #include "BLI_utildefines.h"
 
 #include "BLO_readfile.h"
@@ -441,10 +442,12 @@ void WM_operator_py_idname(char *to, const char *from)
 {
        char *sep= strstr(from, "_OT_");
        if(sep) {
-               int i, ofs= (sep-from);
-
-               for(i=0; i<ofs; i++)
-                       to[i]= tolower(from[i]);
+               int ofs= (sep-from);
+               
+               /* note, we use ascii tolower instead of system tolower, because the
+                  latter depends on the locale, and can lead to idname mistmatch */
+               memcpy(to, from, sizeof(char)*ofs);
+               BLI_ascii_strtolower(to, ofs);
 
                to[ofs] = '.';
                BLI_strncpy(to+(ofs+1), sep+4, OP_MAX_TYPENAME);
@@ -462,10 +465,10 @@ void WM_operator_bl_idname(char *to, const char *from)
                char *sep= strchr(from, '.');
 
                if(sep) {
-                       int i, ofs= (sep-from);
+                       int ofs= (sep-from);
 
-                       for(i=0; i<ofs; i++)
-                               to[i]= toupper(from[i]);
+                       memcpy(to, from, sizeof(char)*ofs);
+                       BLI_ascii_strtoupper(to, ofs);
 
                        BLI_strncpy(to+ofs, "_OT_", OP_MAX_TYPENAME);
                        BLI_strncpy(to+(ofs+4), sep+1, OP_MAX_TYPENAME);