TeamCity.MSBuild.Logger/StringService.cs (66 lines of code) (raw):
namespace TeamCity.MSBuild.Logger
{
using System;
using System.Globalization;
using JetBrains.Annotations;
// ReSharper disable once ClassNeverInstantiated.Global
internal class StringService : IStringService
{
// ReSharper disable once IdentifierTypo
public string UnescapeAll(string escapedString)
{
return UnescapeAll(escapedString, out _);
}
public string FormatResourceString(string resourceName, params object[] args)
{
if (args == null) throw new ArgumentNullException(nameof(args));
var formatString = Properties.Resources.ResourceManager.GetString(resourceName, CultureInfo.InvariantCulture);
return string.IsNullOrEmpty(formatString) ? string.Empty : FormatString(formatString, args);
}
[CanBeNull]
// ReSharper disable once IdentifierTypo
private static string UnescapeAll([CanBeNull] string escapedString, out bool escapingWasNecessary)
{
escapingWasNecessary = false;
if (string.IsNullOrEmpty(escapedString))
{
return escapedString;
}
var num = escapedString.IndexOf('%');
if (num == -1)
{
return escapedString;
}
var sb = StringBuilderCache.Acquire(escapedString.Length);
var startIndex = 0;
for (; num != -1; num = escapedString.IndexOf('%', num + 1))
{
// ReSharper disable once InvertIf
if (num <= escapedString.Length - 3 && IsHexDigit(escapedString[num + 1]) && IsHexDigit(escapedString[num + 2]))
{
sb.Append(escapedString, startIndex, num - startIndex);
var ch = (char)int.Parse(escapedString.Substring(num + 1, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
sb.Append(ch);
startIndex = num + 3;
escapingWasNecessary = true;
}
}
sb.Append(escapedString, startIndex, escapedString.Length - startIndex);
return StringBuilderCache.GetStringAndRelease(sb);
}
private static bool IsHexDigit(char character)
{
if (character >= 48 && character <= 57 || character >= 65 && character <= 70)
{
return true;
}
if (character >= 97)
{
return character <= 102;
}
return false;
}
private static string FormatString([NotNull] string formatString, [NotNull] params object[] args)
{
if (formatString == null) throw new ArgumentNullException(nameof(formatString));
if (args == null) throw new ArgumentNullException(nameof(args));
return string.Format(formatString, args);
}
}
}