diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2016-03-02 19:57:03 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2016-03-02 20:02:19 +0300 |
commit | 9c0de0084bfed50a78798c1f0df51fef0ce9e2bd (patch) | |
tree | 8563efd4a5adbedb9d997c5f410b200847f418a4 /source/blender/blenkernel/intern | |
parent | bee0a7587b4733c222edf336c73a7b200b77de02 (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/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/unit.c | 38 |
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 |