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:
authorBastien Montagne <montagne29@wanadoo.fr>2016-03-02 19:57:03 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2016-03-02 20:02:19 +0300
commit9c0de0084bfed50a78798c1f0df51fef0ce9e2bd (patch)
tree8563efd4a5adbedb9d997c5f410b200847f418a4 /source/blender
parentbee0a7587b4733c222edf336c73a7b200b77de02 (diff)
Fix T47661: cm (centimeter) unit breaks m (meter) unit in Metric.
`m` unit when used after `cm`/`mm`/etc. ones would get ignored, and the alt version of miles would be used instead. The root of the issue is that, in `unit_find_str`, once we get a 'hit' for a unit, we check it's actual unit (since 'm' would also hit on 'cm', 'mm', etc.). In case that hit is not a valid unit one, we would just return NULL, breaking the cycle of checks over that unit, and hence missing all later usages of it. So now, in case we have an 'invalid unit hit', we immediately retry to find it within remaining string.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/unit.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c
index e0f21201c78..e3ea5b9ba3f 100644
--- a/source/blender/blenkernel/intern/unit.c
+++ b/source/blender/blenkernel/intern/unit.c
@@ -460,29 +460,33 @@ BLI_INLINE bool isalpha_or_utf8(const int ch)
static const char *unit_find_str(const char *str, const char *substr)
{
- const char *str_found;
-
if (substr && substr[0] != '\0') {
- str_found = strstr(str, substr);
- if (str_found) {
- /* previous char cannot be a letter */
- if (str_found == str ||
- /* weak unicode support!, so "µm" won't match up be replaced by "m"
- * since non ascii utf8 values will NEVER return true */
- isalpha_or_utf8(*BLI_str_prev_char_utf8(str_found)) == 0)
- {
- /* next char cannot be alphanum */
- int len_name = strlen(substr);
-
- if (!isalpha_or_utf8(*(str_found + len_name))) {
- return str_found;
+ while (true) {
+ const char *str_found = strstr(str, substr);
+
+ if (str_found) {
+ /* Previous char cannot be a letter. */
+ if (str_found == str ||
+ /* weak unicode support!, so "µm" won't match up be replaced by "m"
+ * since non ascii utf8 values will NEVER return true */
+ isalpha_or_utf8(*BLI_str_prev_char_utf8(str_found)) == 0)
+ {
+ /* next char cannot be alphanum */
+ int len_name = strlen(substr);
+
+ if (!isalpha_or_utf8(*(str_found + len_name))) {
+ return str_found;
+ }
}
+ /* If str_found is not a valid unit, we have to check further in the string... */
+ str = str_found + 1;
+ }
+ else {
+ break;
}
}
-
}
return NULL;
-
}
/* Note that numbers are added within brackets