Fix ExprMatch stackoverflow

This commit is contained in:
Raul Santos 2020-09-16 15:44:52 +02:00
parent 6f4384f206
commit d425cf6fed
No known key found for this signature in database
GPG key ID: B532473AE3A803E4

View file

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