From: Josh Law <objecting@objecting.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Brendan Higgins <brendan.higgins@linux.dev>,
David Gow <david@davidgow.net>, Rae Moar <raemoar63@gmail.com>,
linux-kselftest@vger.kernel.org, kunit-dev@googlegroups.com,
linux-kernel@vger.kernel.org, Josh Law <objecting@objecting.org>
Subject: [PATCH v3 3/8] lib/glob: accept [^...] as character class negation syntax
Date: Sun, 15 Mar 2026 21:16:33 +0000 [thread overview]
Message-ID: <20260315211641.408318-6-objecting@objecting.org> (raw)
In-Reply-To: <20260315211641.408318-1-objecting@objecting.org>
glob(7) specifies [!...] for negated character classes, but many
users are more familiar with the regex-style [^...] syntax. Tools
like git, rsync, and bash all accept both forms, and the difference
is a common source of confusion when writing glob patterns.
Accept '^' as an alias for '!' at the start of a character class so
that both [!a-z] and [^a-z] work as expected.
Signed-off-by: Josh Law <objecting@objecting.org>
---
lib/glob.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/lib/glob.c b/lib/glob.c
index df7f00619b1b..c5508be0d215 100644
--- a/lib/glob.c
+++ b/lib/glob.c
@@ -33,9 +33,9 @@ MODULE_LICENSE("Dual MIT/GPL");
* Like !fnmatch(@pat, @str, 0) and unlike the shell, this does NOT
* treat / or leading . specially; it isn't actually used for pathnames.
*
- * Note that according to glob(7) (and unlike bash), character classes
- * are complemented by a leading !; this does not support the regex-style
- * [^a-z] syntax.
+ * Note that according to glob(7), character classes are complemented by
+ * a leading !. The regex-style [^a-z] syntax is also accepted as an
+ * alias.
*
* An opening bracket without a matching close is matched literally.
*/
@@ -72,7 +72,7 @@ bool __pure glob_match(char const *pat, char const *str)
case '[': { /* Character class */
if (c == '\0') /* No possible match */
return false;
- bool match = false, inverted = (*pat == '!');
+ bool match = false, inverted = (*pat == '!' || *pat == '^');
char const *class = inverted ? pat + 1 : pat;
unsigned char a = *class++;
--
2.34.1
next prev parent reply other threads:[~2026-03-15 21:16 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-15 21:16 [PATCH v3 0/8] lib/glob: bug fixes, new features, and tests Josh Law
2026-03-15 21:16 ` [PATCH v2 1/5] lib/glob: add case-insensitive glob_match_nocase() Josh Law
2026-03-15 21:16 ` [PATCH v3 1/8] lib/glob: normalize inverted character class ranges Josh Law
2026-03-15 21:16 ` [PATCH v2 2/5] lib/glob: add glob_validate() for pattern syntax checking Josh Law
2026-03-15 21:16 ` [PATCH v3 2/8] lib/glob: treat trailing backslash as literal character Josh Law
2026-03-15 21:16 ` Josh Law [this message]
2026-03-15 21:16 ` [PATCH v2 3/5] lib/tests: add glob test cases for escapes, edge cases, and new features Josh Law
2026-03-15 21:16 ` [PATCH v3 4/8] lib/glob: add case-insensitive glob_match_nocase() Josh Law
2026-03-15 21:16 ` [PATCH v2 4/5] lib/tests: add kunit tests for glob_match_nocase() and glob_validate() Josh Law
2026-03-15 21:16 ` [PATCH v2 5/5] kunit: validate glob filter patterns before use Josh Law
2026-03-15 21:16 ` [PATCH v3 5/8] lib/glob: add glob_validate() for pattern syntax checking Josh Law
2026-03-15 21:16 ` [PATCH v3 6/8] lib/tests: add glob test cases for escapes, edge cases, and new features Josh Law
2026-03-15 21:16 ` [PATCH v3 7/8] lib/tests: add kunit tests for glob_match_nocase() and glob_validate() Josh Law
2026-03-15 21:16 ` [PATCH v3 8/8] kunit: validate glob filter patterns before use Josh Law
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260315211641.408318-6-objecting@objecting.org \
--to=objecting@objecting.org \
--cc=akpm@linux-foundation.org \
--cc=brendan.higgins@linux.dev \
--cc=david@davidgow.net \
--cc=kunit-dev@googlegroups.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=raemoar63@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.