|
|
|
|
@@ -1,4 +1,6 @@
|
|
|
|
|
#if NET40_OR_GREATER || NETCOREAPP
|
|
|
|
|
using System.Collections.Concurrent;
|
|
|
|
|
#endif
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
@@ -20,7 +22,11 @@ namespace SabreTools.Matching
|
|
|
|
|
/// <param name="matchers">Enumerable of ContentMatchSets to be run on the file</param>
|
|
|
|
|
/// <param name="includeDebug">True to include positional data, false otherwise</param>
|
|
|
|
|
/// <returns>List of strings representing the matched protections, null or empty otherwise</returns>
|
|
|
|
|
#if NET20 || NET35
|
|
|
|
|
public static Queue<string>? GetAllMatches(string file, byte[]? stack, IEnumerable<ContentMatchSet>? matchers, bool includeDebug = false)
|
|
|
|
|
#else
|
|
|
|
|
public static ConcurrentQueue<string>? GetAllMatches(string file, byte[]? stack, IEnumerable<ContentMatchSet>? matchers, bool includeDebug = false)
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
return FindAllMatches(file, stack, matchers, includeDebug, false);
|
|
|
|
|
}
|
|
|
|
|
@@ -51,14 +57,22 @@ namespace SabreTools.Matching
|
|
|
|
|
/// <param name="includeDebug">True to include positional data, false otherwise</param>
|
|
|
|
|
/// <param name="stopAfterFirst">True to stop after the first match, false otherwise</param>
|
|
|
|
|
/// <returns>List of strings representing the matched protections, null or empty otherwise</returns>
|
|
|
|
|
#if NET20 || NET35
|
|
|
|
|
private static Queue<string>? FindAllMatches(string file, byte[]? stack, IEnumerable<ContentMatchSet>? matchers, bool includeDebug, bool stopAfterFirst)
|
|
|
|
|
#else
|
|
|
|
|
private static ConcurrentQueue<string>? FindAllMatches(string file, byte[]? stack, IEnumerable<ContentMatchSet>? matchers, bool includeDebug, bool stopAfterFirst)
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
// If there's no mappings, we can't match
|
|
|
|
|
if (matchers == null || !matchers.Any())
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
// Initialize the queue of matched protections
|
|
|
|
|
#if NET20 || NET35
|
|
|
|
|
var matchedProtections = new Queue<string>();
|
|
|
|
|
#else
|
|
|
|
|
var matchedProtections = new ConcurrentQueue<string>();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Loop through and try everything otherwise
|
|
|
|
|
foreach (var matcher in matchers)
|
|
|
|
|
@@ -75,7 +89,7 @@ namespace SabreTools.Matching
|
|
|
|
|
{
|
|
|
|
|
positionStrs.Add(pos.ToString());
|
|
|
|
|
}
|
|
|
|
|
string positionsString = string.Join(", ", positionStrs.ToArray());
|
|
|
|
|
string positionsString = string.Join(", ", [.. positionStrs]);
|
|
|
|
|
#else
|
|
|
|
|
string positionsString = string.Join(", ", positions);
|
|
|
|
|
#endif
|
|
|
|
|
@@ -117,7 +131,11 @@ namespace SabreTools.Matching
|
|
|
|
|
/// <param name="matchers">Enumerable of ContentMatchSets to be run on the file</param>
|
|
|
|
|
/// <param name="includeDebug">True to include positional data, false otherwise</param>
|
|
|
|
|
/// <returns>List of strings representing the matched protections, null or empty otherwise</returns>
|
|
|
|
|
#if NET20 || NET35
|
|
|
|
|
public static Queue<string>? GetAllMatches(string file, Stream? stack, IEnumerable<ContentMatchSet>? matchers, bool includeDebug = false)
|
|
|
|
|
#else
|
|
|
|
|
public static ConcurrentQueue<string>? GetAllMatches(string file, Stream? stack, IEnumerable<ContentMatchSet>? matchers, bool includeDebug = false)
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
return FindAllMatches(file, stack, matchers, includeDebug, false);
|
|
|
|
|
}
|
|
|
|
|
@@ -148,14 +166,22 @@ namespace SabreTools.Matching
|
|
|
|
|
/// <param name="includeDebug">True to include positional data, false otherwise</param>
|
|
|
|
|
/// <param name="stopAfterFirst">True to stop after the first match, false otherwise</param>
|
|
|
|
|
/// <returns>List of strings representing the matched protections, null or empty otherwise</returns>
|
|
|
|
|
#if NET20 || NET35
|
|
|
|
|
private static Queue<string>? FindAllMatches(string file, Stream? stack, IEnumerable<ContentMatchSet>? matchers, bool includeDebug, bool stopAfterFirst)
|
|
|
|
|
#else
|
|
|
|
|
private static ConcurrentQueue<string>? FindAllMatches(string file, Stream? stack, IEnumerable<ContentMatchSet>? matchers, bool includeDebug, bool stopAfterFirst)
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
// If there's no mappings, we can't match
|
|
|
|
|
if (matchers == null || !matchers.Any())
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
// Initialize the queue of matched protections
|
|
|
|
|
#if NET20 || NET35
|
|
|
|
|
var matchedProtections = new Queue<string>();
|
|
|
|
|
#else
|
|
|
|
|
var matchedProtections = new ConcurrentQueue<string>();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Loop through and try everything otherwise
|
|
|
|
|
foreach (var matcher in matchers)
|
|
|
|
|
@@ -172,7 +198,7 @@ namespace SabreTools.Matching
|
|
|
|
|
{
|
|
|
|
|
positionStrs.Add(pos.ToString());
|
|
|
|
|
}
|
|
|
|
|
string positionsString = string.Join(", ", positionStrs.ToArray());
|
|
|
|
|
string positionsString = string.Join(", ", [.. positionStrs]);
|
|
|
|
|
#else
|
|
|
|
|
string positionsString = string.Join(", ", positions);
|
|
|
|
|
#endif
|
|
|
|
|
@@ -213,7 +239,11 @@ namespace SabreTools.Matching
|
|
|
|
|
/// <param name="matchers">Enumerable of PathMatchSets to be run on the file</param>
|
|
|
|
|
/// <param name="any">True if any path match is a success, false if all have to match</param>
|
|
|
|
|
/// <returns>List of strings representing the matched protections, null or empty otherwise</returns>
|
|
|
|
|
#if NET20 || NET35
|
|
|
|
|
public static Queue<string> GetAllMatches(string file, IEnumerable<PathMatchSet>? matchers, bool any = false)
|
|
|
|
|
#else
|
|
|
|
|
public static ConcurrentQueue<string> GetAllMatches(string file, IEnumerable<PathMatchSet>? matchers, bool any = false)
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
return FindAllMatches(new List<string> { file }, matchers, any, false);
|
|
|
|
|
}
|
|
|
|
|
@@ -225,7 +255,11 @@ namespace SabreTools.Matching
|
|
|
|
|
/// <param name="matchers">Enumerable of PathMatchSets to be run on the file</param>
|
|
|
|
|
/// <param name="any">True if any path match is a success, false if all have to match</param>
|
|
|
|
|
/// <returns>List of strings representing the matched protections, null or empty otherwise</returns>
|
|
|
|
|
#if NET20 || NET35
|
|
|
|
|
public static Queue<string> GetAllMatches(IEnumerable<string>? files, IEnumerable<PathMatchSet>? matchers, bool any = false)
|
|
|
|
|
#else
|
|
|
|
|
public static ConcurrentQueue<string> GetAllMatches(IEnumerable<string>? files, IEnumerable<PathMatchSet>? matchers, bool any = false)
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
return FindAllMatches(files, matchers, any, false);
|
|
|
|
|
}
|
|
|
|
|
@@ -270,21 +304,29 @@ namespace SabreTools.Matching
|
|
|
|
|
/// <param name="any">True if any path match is a success, false if all have to match</param>
|
|
|
|
|
/// <param name="stopAfterFirst">True to stop after the first match, false otherwise</param>
|
|
|
|
|
/// <returns>List of strings representing the matched protections, null or empty otherwise</returns>
|
|
|
|
|
#if NET20 || NET35
|
|
|
|
|
private static Queue<string> FindAllMatches(IEnumerable<string>? files, IEnumerable<PathMatchSet>? matchers, bool any, bool stopAfterFirst)
|
|
|
|
|
#else
|
|
|
|
|
private static ConcurrentQueue<string> FindAllMatches(IEnumerable<string>? files, IEnumerable<PathMatchSet>? matchers, bool any, bool stopAfterFirst)
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
// If there's no mappings, we can't match
|
|
|
|
|
if (matchers == null || !matchers.Any())
|
|
|
|
|
return new ConcurrentQueue<string>();
|
|
|
|
|
return new();
|
|
|
|
|
|
|
|
|
|
// Initialize the list of matched protections
|
|
|
|
|
#if NET20 || NET35
|
|
|
|
|
var matchedProtections = new Queue<string>();
|
|
|
|
|
#else
|
|
|
|
|
var matchedProtections = new ConcurrentQueue<string>();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Loop through and try everything otherwise
|
|
|
|
|
foreach (var matcher in matchers)
|
|
|
|
|
{
|
|
|
|
|
// Determine if the matcher passes
|
|
|
|
|
bool passes;
|
|
|
|
|
var firstMatchedString = string.Empty;
|
|
|
|
|
string? firstMatchedString;
|
|
|
|
|
if (any)
|
|
|
|
|
{
|
|
|
|
|
(bool anyPasses, var matchedString) = matcher.MatchesAny(files);
|
|
|
|
|
|