From e18a74849c2dda52b25e0ca35127f511999a471c Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 24 Sep 2014 20:26:21 +0200 Subject: Fix T41933: Node Editor: Crash occurs with Select by Suffix Wrong usage of `BLI_str_partition_ex_utf8`... This is to be backported to 2.72 branch. --- source/blender/editors/space_node/node_select.c | 38 ++++++++++++++++--------- 1 file changed, 25 insertions(+), 13 deletions(-) (limited to 'source/blender/editors/space_node/node_select.c') diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index 5a78ea6ebd8..de580f612a0 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -248,22 +248,34 @@ static bool node_select_grouped_name(SpaceNode *snode, bNode *node_act, const bo bNode *node; bool changed = false; const unsigned int delims[] = {'.', '-', '_', '\0'}; - size_t index_act, index_curr; + size_t pref_len_act, pref_len_curr; char *sep, *suf_act, *suf_curr; - index_act = BLI_str_partition_ex_utf8(node_act->name, delims, &sep, &suf_act, from_right); + pref_len_act = BLI_str_partition_ex_utf8(node_act->name, delims, &sep, &suf_act, from_right); - if (index_act > 0) { - for (node = snode->edittree->nodes.first; node; node = node->next) { - if ((node->flag & SELECT) == 0) { - index_curr = BLI_str_partition_ex_utf8(node->name, delims, &sep, &suf_curr, from_right); - if ((from_right && STREQ(suf_act, suf_curr)) || - (!from_right && (index_act == index_curr) && STREQLEN(node_act->name, node->name, index_act))) - { - nodeSetSelected(node, true); - changed = true; - } - } + /* Note: in case we are searching for suffix, and found none, use whole name as suffix. */ + if (from_right && !(sep && suf_act)) { + pref_len_act = 0; + suf_act = node_act->name; + } + + for (node = snode->edittree->nodes.first; node; node = node->next) { + if (node->flag & SELECT) { + continue; + } + pref_len_curr = BLI_str_partition_ex_utf8(node->name, delims, &sep, &suf_curr, from_right); + + /* Same as with active node name! */ + if (from_right && !(sep && suf_curr)) { + pref_len_curr = 0; + suf_curr = node->name; + } + + if ((from_right && STREQ(suf_act, suf_curr)) || + (!from_right && (pref_len_act == pref_len_curr) && STREQLEN(node_act->name, node->name, pref_len_act))) + { + nodeSetSelected(node, true); + changed = true; } } -- cgit v1.2.3