You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.6 KiB

using System;
using System.Collections.Generic;
namespace MsgReader.Mime.Decode
{
/// <summary>
/// Contains common operations needed while decoding.
/// </summary>
internal static class Utility
{
#region RemoveQuotesIfAny
/// <summary>
/// Remove quotes, if found, around the string.
/// </summary>
/// <param name="text">Text with quotes or without quotes</param>
/// <returns>Text without quotes</returns>
/// <exception cref="ArgumentNullException">If <paramref name="text"/> is <see langword="null"/></exception>
public static string RemoveQuotesIfAny(string text)
{
if (text == null)
throw new ArgumentNullException(nameof(text));
// Check if there are quotes at both ends and have at least two characters
if (text.Length > 1 && text[0] == '"' && text[text.Length - 1] == '"')
{
// Remove quotes at both ends
return text.Substring(1, text.Length - 2);
}
// If no quotes were found, the text is just returned
return text;
}
#endregion
#region SplitStringWithCharNotInsideQuotes
/// <summary>
/// Split a string into a list of strings using a specified character.<br/>
/// Everything inside quotes are ignored.
/// </summary>
/// <param name="input">A string to split</param>
/// <param name="toSplitAt">The character to use to split with</param>
/// <returns>A List of strings that was delimited by the <paramref name="toSplitAt"/> character</returns>
public static List<string> SplitStringWithCharNotInsideQuotes(string input, char toSplitAt)
{
var elements = new List<string>();
var lastSplitLocation = 0;
var insideQuote = false;
var characters = input.ToCharArray();
for (var i = 0; i < characters.Length; i++)
{
var character = characters[i];
if (character == '\"')
insideQuote = !insideQuote;
// Only split if we are not inside quotes
if (character != toSplitAt || insideQuote) continue;
// We need to split
var length = i - lastSplitLocation;
elements.Add(input.Substring(lastSplitLocation, length));
// Update last split location
// + 1 so that we do not include the character used to split with next time
lastSplitLocation = i + 1;
}
// Add the last part
elements.Add(input.Substring(lastSplitLocation, input.Length - lastSplitLocation));
return elements;
}
#endregion
}
}