]> git.ipfire.org Git - thirdparty/git.git/commitdiff
wildmatch: avoid using of the comma operator
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Thu, 27 Mar 2025 11:53:00 +0000 (11:53 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sat, 29 Mar 2025 00:38:11 +0000 (17:38 -0700)
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>
wildmatch.c

index 8ea29141bd7c5233a25c89aa55ceeafcf7e7529d..69a2ae7000d5120e4b37c2bcce4bc46beb78cf6f 100644 (file)
@@ -223,7 +223,7 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
                                                p_ch = '[';
                                                if (t_ch == p_ch)
                                                        matched = 1;
-                                               continue;
+                                               goto next;
                                        }
                                        if (CC_EQ(s,i, "alnum")) {
                                                if (ISALNUM(t_ch))
@@ -268,7 +268,10 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
                                        p_ch = 0; /* This makes "prev_ch" get set to 0. */
                                } else if (t_ch == p_ch)
                                        matched = 1;
-                       } while (prev_ch = p_ch, (p_ch = *++p) != ']');
+next:
+                               prev_ch = p_ch;
+                               p_ch = *++p;
+                       } while (p_ch != ']');
                        if (matched == negated ||
                            ((flags & WM_PATHNAME) && t_ch == '/'))
                                return WM_NOMATCH;