Files
2026-06-04 11:42:34 +02:00

240 lines
5.1 KiB
C#

using System;
namespace System.IO
{
// Token: 0x0200012A RID: 298
internal class SearchPattern2
{
// Token: 0x06000A5D RID: 2653 RVA: 0x0001D540 File Offset: 0x0001B740
public SearchPattern2(string pattern)
: this(pattern, false)
{
}
// Token: 0x06000A5E RID: 2654 RVA: 0x0001D54C File Offset: 0x0001B74C
public SearchPattern2(string pattern, bool ignore)
{
this.ignore = ignore;
this.pattern = pattern;
this.Compile(pattern);
}
// Token: 0x06000A60 RID: 2656 RVA: 0x0001D5AC File Offset: 0x0001B7AC
public bool IsMatch(string text, bool ignorecase)
{
if (this.hasWildcard)
{
return this.Match(this.ops, text, 0);
}
bool flag = string.Compare(this.pattern, text, ignorecase) == 0;
if (flag)
{
return true;
}
int num = text.LastIndexOf('/');
if (num == -1)
{
return false;
}
num++;
return num != text.Length && string.Compare(this.pattern, text.Substring(num), ignorecase) == 0;
}
// Token: 0x06000A61 RID: 2657 RVA: 0x0001D628 File Offset: 0x0001B828
public bool IsMatch(string text)
{
return this.IsMatch(text, this.ignore);
}
// Token: 0x170002A0 RID: 672
// (get) Token: 0x06000A62 RID: 2658 RVA: 0x0001D638 File Offset: 0x0001B838
public bool HasWildcard
{
get
{
return this.hasWildcard;
}
}
// Token: 0x06000A63 RID: 2659 RVA: 0x0001D640 File Offset: 0x0001B840
private void Compile(string pattern)
{
if (pattern == null || pattern.IndexOfAny(SearchPattern2.InvalidChars) >= 0)
{
throw new ArgumentException("Invalid search pattern: '" + pattern + "'");
}
if (pattern == "*")
{
this.ops = new SearchPattern2.Op(SearchPattern2.OpCode.True);
this.hasWildcard = true;
return;
}
this.ops = null;
int i = 0;
SearchPattern2.Op op = null;
while (i < pattern.Length)
{
char c = pattern[i];
SearchPattern2.Op op2;
if (c != '*')
{
if (c != '?')
{
op2 = new SearchPattern2.Op(SearchPattern2.OpCode.ExactString);
int num = pattern.IndexOfAny(SearchPattern2.WildcardChars, i);
if (num < 0)
{
num = pattern.Length;
}
op2.Argument = pattern.Substring(i, num - i);
if (this.ignore)
{
op2.Argument = op2.Argument.ToLower();
}
i = num;
}
else
{
op2 = new SearchPattern2.Op(SearchPattern2.OpCode.AnyChar);
i++;
this.hasWildcard = true;
}
}
else
{
op2 = new SearchPattern2.Op(SearchPattern2.OpCode.AnyString);
i++;
this.hasWildcard = true;
}
if (op == null)
{
this.ops = op2;
}
else
{
op.Next = op2;
}
op = op2;
}
if (op == null)
{
this.ops = new SearchPattern2.Op(SearchPattern2.OpCode.End);
}
else
{
op.Next = new SearchPattern2.Op(SearchPattern2.OpCode.End);
}
}
// Token: 0x06000A64 RID: 2660 RVA: 0x0001D79C File Offset: 0x0001B99C
private bool Match(SearchPattern2.Op op, string text, int ptr)
{
while (op != null)
{
switch (op.Code)
{
case SearchPattern2.OpCode.ExactString:
{
int length = op.Argument.Length;
if (ptr + length > text.Length)
{
return false;
}
string text2 = text.Substring(ptr, length);
if (this.ignore)
{
text2 = text2.ToLower();
}
if (text2 != op.Argument)
{
return false;
}
ptr += length;
break;
}
case SearchPattern2.OpCode.AnyChar:
if (++ptr > text.Length)
{
return false;
}
break;
case SearchPattern2.OpCode.AnyString:
while (ptr <= text.Length)
{
if (this.Match(op.Next, text, ptr))
{
return true;
}
ptr++;
}
return false;
case SearchPattern2.OpCode.End:
return ptr == text.Length;
case SearchPattern2.OpCode.True:
return true;
}
op = op.Next;
}
return true;
}
// Token: 0x04000ABF RID: 2751
private SearchPattern2.Op ops;
// Token: 0x04000AC0 RID: 2752
private bool ignore;
// Token: 0x04000AC1 RID: 2753
private bool hasWildcard;
// Token: 0x04000AC2 RID: 2754
private string pattern;
// Token: 0x04000AC3 RID: 2755
internal static readonly char[] WildcardChars = new char[] { '*', '?' };
// Token: 0x04000AC4 RID: 2756
internal static readonly char[] InvalidChars = new char[]
{
Path.DirectorySeparatorChar,
Path.AltDirectorySeparatorChar
};
// Token: 0x0200012B RID: 299
private class Op
{
// Token: 0x06000A65 RID: 2661 RVA: 0x0001D890 File Offset: 0x0001BA90
public Op(SearchPattern2.OpCode code)
{
this.Code = code;
this.Argument = null;
this.Next = null;
}
// Token: 0x04000AC5 RID: 2757
public SearchPattern2.OpCode Code;
// Token: 0x04000AC6 RID: 2758
public string Argument;
// Token: 0x04000AC7 RID: 2759
public SearchPattern2.Op Next;
}
// Token: 0x0200012C RID: 300
private enum OpCode
{
// Token: 0x04000AC9 RID: 2761
ExactString,
// Token: 0x04000ACA RID: 2762
AnyChar,
// Token: 0x04000ACB RID: 2763
AnyString,
// Token: 0x04000ACC RID: 2764
End,
// Token: 0x04000ACD RID: 2765
True
}
}
}