Files
Dec2017-Script-Dump/System/Text/RegularExpressions/QuickSearch.cs
T
2026-06-04 11:42:34 +02:00

255 lines
4.6 KiB
C#

using System;
using System.Collections;
namespace System.Text.RegularExpressions
{
// Token: 0x020002D6 RID: 726
internal class QuickSearch
{
// Token: 0x06001A83 RID: 6787 RVA: 0x00061A00 File Offset: 0x0005FC00
public QuickSearch(string str, bool ignore)
: this(str, ignore, false)
{
}
// Token: 0x06001A84 RID: 6788 RVA: 0x00061A0C File Offset: 0x0005FC0C
public QuickSearch(string str, bool ignore, bool reverse)
{
this.str = str;
this.len = str.Length;
this.ignore = ignore;
this.reverse = reverse;
if (ignore)
{
str = str.ToLower();
}
if (this.len > QuickSearch.THRESHOLD)
{
this.SetupShiftTable();
}
}
// Token: 0x17000820 RID: 2080
// (get) Token: 0x06001A86 RID: 6790 RVA: 0x00061A6C File Offset: 0x0005FC6C
public string String
{
get
{
return this.str;
}
}
// Token: 0x17000821 RID: 2081
// (get) Token: 0x06001A87 RID: 6791 RVA: 0x00061A74 File Offset: 0x0005FC74
public int Length
{
get
{
return this.len;
}
}
// Token: 0x17000822 RID: 2082
// (get) Token: 0x06001A88 RID: 6792 RVA: 0x00061A7C File Offset: 0x0005FC7C
public bool IgnoreCase
{
get
{
return this.ignore;
}
}
// Token: 0x06001A89 RID: 6793 RVA: 0x00061A84 File Offset: 0x0005FC84
public int Search(string text, int start, int end)
{
int i = start;
if (this.reverse)
{
if (start < end)
{
return -1;
}
if (i > text.Length)
{
i = text.Length;
}
if (this.len == 1)
{
while (--i >= end)
{
if (this.str[0] == this.GetChar(text[i]))
{
return i;
}
}
return -1;
}
if (end < this.len)
{
end = this.len - 1;
}
for (i--; i >= end; i -= this.GetShiftDistance(text[i - this.len]))
{
int num = this.len - 1;
while (this.str[num] == this.GetChar(text[i - this.len + 1 + num]))
{
if (--num < 0)
{
return i - this.len + 1;
}
}
if (i <= end)
{
break;
}
}
}
else
{
if (this.len == 1)
{
while (i <= end)
{
if (this.str[0] == this.GetChar(text[i]))
{
return i;
}
i++;
}
return -1;
}
if (end > text.Length - this.len)
{
end = text.Length - this.len;
}
while (i <= end)
{
int num2 = this.len - 1;
while (this.str[num2] == this.GetChar(text[i + num2]))
{
if (--num2 < 0)
{
return i;
}
}
if (i >= end)
{
break;
}
i += this.GetShiftDistance(text[i + this.len]);
}
}
return -1;
}
// Token: 0x06001A8A RID: 6794 RVA: 0x00061C68 File Offset: 0x0005FE68
private void SetupShiftTable()
{
bool flag = this.len > 254;
byte b = 0;
for (int i = 0; i < this.len; i++)
{
char c = this.str[i];
if (c <= 'ÿ')
{
if ((byte)c > b)
{
b = (byte)c;
}
}
else
{
flag = true;
}
}
this.shift = new byte[(int)(b + 1)];
if (flag)
{
this.shiftExtended = new Hashtable();
}
int j = 0;
int num = this.len;
while (j < this.len)
{
char c2 = this.str[this.reverse ? (num - 1) : j];
if ((int)c2 >= this.shift.Length)
{
goto IL_DD;
}
if (num >= 255)
{
this.shift[(int)c2] = byte.MaxValue;
goto IL_DD;
}
this.shift[(int)c2] = (byte)num;
IL_F6:
j++;
num--;
continue;
IL_DD:
this.shiftExtended[c2] = num;
goto IL_F6;
}
}
// Token: 0x06001A8B RID: 6795 RVA: 0x00061D84 File Offset: 0x0005FF84
private int GetShiftDistance(char c)
{
if (this.shift == null)
{
return 1;
}
c = this.GetChar(c);
if ((int)c < this.shift.Length)
{
int num = (int)this.shift[(int)c];
if (num == 0)
{
return this.len + 1;
}
if (num != 255)
{
return num;
}
}
else if (c < 'ÿ')
{
return this.len + 1;
}
if (this.shiftExtended == null)
{
return this.len + 1;
}
object obj = this.shiftExtended[c];
return (obj == null) ? (this.len + 1) : ((int)obj);
}
// Token: 0x06001A8C RID: 6796 RVA: 0x00061E34 File Offset: 0x00060034
private char GetChar(char c)
{
return this.ignore ? char.ToLower(c) : c;
}
// Token: 0x040015A5 RID: 5541
private string str;
// Token: 0x040015A6 RID: 5542
private int len;
// Token: 0x040015A7 RID: 5543
private bool ignore;
// Token: 0x040015A8 RID: 5544
private bool reverse;
// Token: 0x040015A9 RID: 5545
private byte[] shift;
// Token: 0x040015AA RID: 5546
private Hashtable shiftExtended;
// Token: 0x040015AB RID: 5547
private static readonly int THRESHOLD = 5;
}
}