using System;
using System.Text.RegularExpressions;
namespace ffmpeg_decrypt
{
// from: http://csharptest.net/529/how-to-correctly-escape-command-line-arguments-in-c/index.html
public static class Escaper
{
///
/// Quotes all arguments that contain whitespace, or begin with a quote and returns a single
/// argument string for use with Process.Start().
///
/// A list of strings for arguments, may not contain null, '\0', '\r', or '\n'
/// The combined list of escaped/quoted strings
/// Raised when one of the arguments is null
/// Raised if an argument contains '\0', '\r', or '\n'
public static string EscapeArguments(params string[] args)
{
var arguments = new System.Text.StringBuilder();
var invalidChar = new Regex("[\x00\x0a\x0d]");// these can not be escaped
var needsQuotes = new Regex(@"\s|""");// contains whitespace or two quote characters
var escapeQuote = new Regex(@"(\\*)(""|$)");// one or more '\' followed with a quote or end of string
for (int carg = 0; args != null && carg < args.Length; carg++)
{
if (args[carg] == null)
throw new ArgumentNullException("args[" + carg + "]");
if (invalidChar.IsMatch(args[carg]))
throw new ArgumentOutOfRangeException("args[" + carg + "]");
if (args[carg] == string.Empty)
arguments.Append("\"\"");
else if (!needsQuotes.IsMatch(args[carg]))
arguments.Append(args[carg]);
else
{
arguments.Append('"');
arguments.Append(escapeQuote.Replace(args[carg], m =>
m.Groups[1].Value + m.Groups[1].Value +
(m.Groups[2].Value == "\"" ? "\\\"" : "")
));
arguments.Append('"');
}
if (carg + 1 < args.Length)
arguments.Append(' ');
}
return arguments.ToString();
}
}
}