Files
ZuneShell.dll/UIX/Microsoft/Iris/Data/StringUtility.cs
T

181 lines
6.0 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Microsoft.Iris.Data.StringUtility
// Assembly: UIX, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: A56C6C9D-B7F6-46A9-8BDE-B3D9B8D60B11
// Assembly location: C:\Program Files\Zune\UIX.dll
using System.Text;
namespace Microsoft.Iris.Data
{
internal static class StringUtility
{
public static string[] SplitAndTrim(char separator, string splitee)
{
string[] strArray = splitee.Split(separator);
for (int index = 0; index < strArray.Length; ++index)
strArray[index] = strArray[index].Trim();
return strArray;
}
public static string Unescape(string source, out int errorIndex, out string invalidSequence)
{
invalidSequence = null;
errorIndex = -1;
if (source.IndexOf('\\') == -1)
return source;
StringBuilder stringBuilder = new StringBuilder(source.Length);
int index = 0;
int startIndex = 0;
int length = source.Length;
bool flag = true;
while (flag && index < length)
{
startIndex = index;
char ch1 = source[index++];
if (ch1 != '\\')
{
stringBuilder.Append(ch1);
}
else
{
if (index == length)
{
flag = false;
break;
}
char mode = source[index++];
char ch2 = char.MinValue;
char ch3 = char.MinValue;
switch (mode)
{
case '"':
ch2 = '"';
break;
case '\'':
ch2 = '\'';
break;
case '0':
ch2 = char.MinValue;
break;
case 'U':
case 'u':
case 'x':
uint result;
flag = ReadHexSequence(mode, source, ref index, length, out result);
if (flag)
{
if (result <= ushort.MaxValue)
{
ch2 = (char)result;
break;
}
if (result <= 1114111U)
{
ch2 = (char)((result - 65536U) / 1024U + 55296U);
ch3 = (char)((result - 65536U) % 1024U + 56320U);
break;
}
flag = false;
break;
}
break;
case '\\':
ch2 = '\\';
break;
case 'a':
ch2 = '\a';
break;
case 'b':
ch2 = '\b';
break;
case 'f':
ch2 = '\f';
break;
case 'n':
ch2 = '\n';
break;
case 'r':
ch2 = '\r';
break;
case 't':
ch2 = '\t';
break;
case 'v':
ch2 = '\v';
break;
default:
flag = false;
break;
}
if (flag)
{
stringBuilder.Append(ch2);
if (ch3 != char.MinValue)
stringBuilder.Append(ch3);
}
}
}
string str;
if (!flag)
{
str = null;
errorIndex = startIndex;
invalidSequence = source.Substring(startIndex, index - startIndex);
}
else
{
str = stringBuilder.ToString();
errorIndex = -1;
}
return str;
}
private static bool ReadHexSequence(
char mode,
string source,
ref int index,
int indexLast,
out uint result)
{
int num1;
int num2;
switch (mode)
{
case 'u':
num1 = 4;
num2 = 4;
break;
case 'x':
num1 = 1;
num2 = 4;
break;
default:
num1 = 8;
num2 = 8;
break;
}
int num3 = 0;
uint num4 = 0;
for (; index < indexLast && num3 < num2; ++num3)
{
char ch = source[index];
uint num5;
if (ch >= '0' && ch <= '9')
num5 = ch - 48U;
else if (ch >= 'a' && ch <= 'f')
num5 = (uint)(10 + (ch - 97));
else if (ch >= 'A' && ch <= 'F')
num5 = (uint)(10 + (ch - 65));
else
break;
num4 = (num4 << 4) + num5;
++index;
}
bool flag = num3 >= num1;
result = flag ? num4 : 0U;
return flag;
}
}
}