summaryrefslogtreecommitdiff
path: root/strings
diff options
context:
space:
mode:
authorWilliam A. Rowe Jr <wrowe@apache.org>2011-05-14 11:25:47 +0000
committerWilliam A. Rowe Jr <wrowe@apache.org>2011-05-14 11:25:47 +0000
commit6a6fb7301b96ef004779086670b06506da823601 (patch)
tree0149da8aaf5f00defef152a475a1284c8b7dd586 /strings
parente240c3407218a5eaaab98fc14d26588c150a33dd (diff)
downloadapr-6a6fb7301b96ef004779086670b06506da823601.tar.gz
Refactor a complex test into a very simple test and
optimize the exception cases to bust the loop early. Clean up documentation a bit. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1103046 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'strings')
-rw-r--r--strings/apr_fnmatch.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/strings/apr_fnmatch.c b/strings/apr_fnmatch.c
index c3eea03d9..5d319133a 100644
--- a/strings/apr_fnmatch.c
+++ b/strings/apr_fnmatch.c
@@ -116,17 +116,22 @@ static APR_INLINE int fnmatch_ch(const char **pattern, const char **string, int
break;
leadingclosebrace:
- /* Look at only well-formed range patterns; ']' is allowed only if escaped,
- * while '/' is not allowed at all in FNM_PATHNAME mode.
+ /* Look at only well-formed range patterns;
+ * "x-]" is not allowed unless escaped ("x-\]")
*/
/* XXX: Fix for locale/MBCS character width */
- if (((*pattern)[1] == '-') && (*pattern)[2]
- && (!(escape && ((*pattern)[2] == '\\'))
- ? (((*pattern)[2] != ']') && (!slash || ((*pattern)[2] != '/')))
- : (((*pattern)[3]) && (!slash || ((*pattern)[3] != '/'))))) {
+ if (((*pattern)[1] == '-') && ((*pattern)[2] != ']'))
+ {
startch = *pattern;
*pattern += (escape && ((*pattern)[2] == '\\')) ? 3 : 2;
+ /* NOT a properly balanced [expr] pattern, EOS terminated
+ * or ranges containing a slash in FNM_PATHNAME mode pattern
+ * fall out to to the rewind and test '[' literal code path
+ */
+ if (!**pattern || (slash && (**pattern == '\\')))
+ break;
+
/* XXX: handle locale/MBCS comparison, advance by MBCS char width */
if ((**string >= *startch) && (**string <= **pattern))
result = 0;
@@ -150,7 +155,9 @@ leadingclosebrace:
++*pattern;
}
- /* NOT a properly balanced [expr] pattern; Rewind to test '[' literal */
+ /* NOT a properly balanced [expr] pattern; Rewind
+ * and reset result to test '[' literal
+ */
*pattern = mismatch;
result = APR_FNM_NOMATCH;
}