Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 33 additions & 17 deletions src/System.Management.Automation/engine/regex.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,24 +50,22 @@ public enum WildcardOptions
/// </summary>
public sealed class WildcardPattern
{
//
// char that escapes special chars
//
private const char escapeChar = '`';

//
// we convert a wildcard pattern to a predicate
//
private Predicate<string> _isMatch;

//
// chars that are considered special in a wildcard pattern
private static readonly char[] s_specialChars = new[] { '*', '?', '[', ']', '`' };

// static match-all delegate that is shared by all WildcardPattern instances
private static readonly Predicate<string> s_matchAll = _ => true;

// wildcard pattern
//
internal string Pattern { get; }

//
// options that control match behavior
//
internal WildcardOptions Options { get; } = WildcardOptions.None;

/// <summary>
Expand Down Expand Up @@ -145,18 +143,40 @@ public static WildcardPattern Get(string pattern, WildcardOptions options)
/// <returns>True on success, false otherwise.</returns>
private void Init()
{
if (_isMatch == null)
if (_isMatch != null)
{
return;
}

if (Pattern.Length == 1 && Pattern[0] == '*')
{
_isMatch = s_matchAll;
return;
}

if (Pattern.IndexOfAny(s_specialChars) == -1)
{
if (Pattern.Length == 1 && Pattern[0] == '*')
// No special characters present in the pattern, so we can just do a string comparison.
StringComparison stringComparison;
if (Options.HasFlag(WildcardOptions.IgnoreCase))
{
_isMatch = _ => true;
stringComparison = Options.HasFlag(WildcardOptions.CultureInvariant)
? StringComparison.InvariantCultureIgnoreCase
: StringComparison.CurrentCultureIgnoreCase;
}
else
{
var matcher = new WildcardPatternMatcher(this);
_isMatch = matcher.IsMatch;
stringComparison = Options.HasFlag(WildcardOptions.CultureInvariant)
? StringComparison.InvariantCulture
: StringComparison.CurrentCulture;
}

_isMatch = str => string.Equals(str, Pattern, stringComparison);
return;
}

var matcher = new WildcardPatternMatcher(this);
_isMatch = matcher.IsMatch;
}

/// <summary>
Expand All @@ -181,8 +201,6 @@ public bool IsMatch(string input)
/// </returns>
internal static string Escape(string pattern, char[] charsNotToEscape)
{
#pragma warning disable 56506

if (pattern == null)
{
throw PSTraceSource.NewArgumentNullException("pattern");
Expand Down Expand Up @@ -223,8 +241,6 @@ internal static string Escape(string pattern, char[] charsNotToEscape)
}

return s;

#pragma warning restore 56506
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1039,11 +1039,7 @@ internal static Collection<PSSnapInInfo> ReadEnginePSSnapIns()

string moduleName = Path.Combine(applicationBase, defaultMshSnapinInfo.AssemblyName + ".dll");

if (File.Exists(moduleName))
{
moduleName = Path.Combine(applicationBase, defaultMshSnapinInfo.AssemblyName + ".dll");
}
else
if (!File.Exists(moduleName))
{
moduleName = defaultMshSnapinInfo.AssemblyName;
}
Expand Down