Merge pull request #42120 from raulsntos/fix-expr-match

Fix C# Match stackoverflow
This commit is contained in:
Rémi Verschelde 2020-09-17 08:43:48 +02:00 committed by GitHub
commit fdfcce1c03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 23 additions and 18 deletions

View File

@ -624,41 +624,46 @@ namespace Godot
return instance.Length; return instance.Length;
} }
// <summary> /// <summary>
// Do a simple expression match, where '*' matches zero or more arbitrary characters and '?' matches any single character except '.'. /// Do a simple expression match, where '*' matches zero or more arbitrary characters and '?' matches any single character except '.'.
// </summary> /// </summary>
public static bool ExprMatch(this string instance, string expr, bool caseSensitive) private static bool ExprMatch(this string instance, string expr, bool caseSensitive)
{ {
if (expr.Length == 0 || instance.Length == 0) // case '\0':
return false; if (expr.Length == 0)
return instance.Length == 0;
switch (expr[0]) switch (expr[0])
{ {
case '\0':
return instance[0] == 0;
case '*': case '*':
return ExprMatch(expr + 1, instance, caseSensitive) || instance[0] != 0 && ExprMatch(expr, instance + 1, caseSensitive); return ExprMatch(instance, expr.Substring(1), caseSensitive) || (instance.Length > 0 && ExprMatch(instance.Substring(1), expr, caseSensitive));
case '?': case '?':
return instance[0] != 0 && instance[0] != '.' && ExprMatch(expr + 1, instance + 1, caseSensitive); return instance.Length > 0 && instance[0] != '.' && ExprMatch(instance.Substring(1), expr.Substring(1), caseSensitive);
default: default:
return (caseSensitive ? instance[0] == expr[0] : char.ToUpper(instance[0]) == char.ToUpper(expr[0])) && if (instance.Length == 0) return false;
ExprMatch(expr + 1, instance + 1, caseSensitive); return (caseSensitive ? instance[0] == expr[0] : char.ToUpper(instance[0]) == char.ToUpper(expr[0])) && ExprMatch(instance.Substring(1), expr.Substring(1), caseSensitive);
} }
} }
// <summary> /// <summary>
// Do a simple case sensitive expression match, using ? and * wildcards (see [method expr_match]). /// Do a simple case sensitive expression match, using ? and * wildcards (see [method expr_match]).
// </summary> /// </summary>
public static bool Match(this string instance, string expr, bool caseSensitive = true) public static bool Match(this string instance, string expr, bool caseSensitive = true)
{ {
if (instance.Length == 0 || expr.Length == 0)
return false;
return instance.ExprMatch(expr, caseSensitive); return instance.ExprMatch(expr, caseSensitive);
} }
// <summary> /// <summary>
// Do a simple case insensitive expression match, using ? and * wildcards (see [method expr_match]). /// Do a simple case insensitive expression match, using ? and * wildcards (see [method expr_match]).
// </summary> /// </summary>
public static bool MatchN(this string instance, string expr) public static bool MatchN(this string instance, string expr)
{ {
if (instance.Length == 0 || expr.Length == 0)
return false;
return instance.ExprMatch(expr, caseSensitive: false); return instance.ExprMatch(expr, caseSensitive: false);
} }