Git fork

wildmatch: avoid using of the comma operator

The comma operator is a somewhat obscure C feature that is often used by
mistake and can even cause unintentional code flow. That is why the
`-Wcomma` option of clang was introduced: To identify unintentional uses
of the comma operator.

In this instance, the usage is intentional because it allows storing the
value of the current character as `prev_ch` before making the next
character the current one, all of which happens in the loop condition
that lets the loop stop at a closing bracket.

However, it is hard to read.

The chosen alternative to using the comma operator is to move those
assignments from the condition into the loop body; In this particular
case that requires special care because the loop body contains a
`continue` for the case where a character class is found that starts
with `[:` but does not end in `:]` (and the assignments should occur
even when that code path is taken), which needs to be turned into a
`goto`.

Helped-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Acked-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

authored by

Johannes Schindelin and committed by
Junio C Hamano
752fe9dc be7a517c

+5 -2
+5 -2
wildmatch.c
··· 223 223 p_ch = '['; 224 224 if (t_ch == p_ch) 225 225 matched = 1; 226 - continue; 226 + goto next; 227 227 } 228 228 if (CC_EQ(s,i, "alnum")) { 229 229 if (ISALNUM(t_ch)) ··· 268 268 p_ch = 0; /* This makes "prev_ch" get set to 0. */ 269 269 } else if (t_ch == p_ch) 270 270 matched = 1; 271 - } while (prev_ch = p_ch, (p_ch = *++p) != ']'); 271 + next: 272 + prev_ch = p_ch; 273 + p_ch = *++p; 274 + } while (p_ch != ']'); 272 275 if (matched == negated || 273 276 ((flags & WM_PATHNAME) && t_ch == '/')) 274 277 return WM_NOMATCH;