using System;
using System.IO;
using System.Text;
public class Test
{
public static void Main()
{
var input = "joe \\\"dudes\\\"\"";
Console.WriteLine(input);
Console.WriteLine(ReadSingleLineStringLiteral(input));
}
private static string ReadSingleLineStringLiteral(string line)
{
using (var reader = new StringReader(line))
{
return ReadSingleLineStringLiteral(reader);
}
}
private static string ReadSingleLineStringLiteral(TextReader reader)
{
StringBuilder buffer = new StringBuilder ();
int nextChar = reader.Read ();
while (nextChar != -1) {
buffer.Append ((char)nextChar);
if (nextChar == '"' &&
(buffer.Length == 1 ||
buffer [buffer.Length - 1] != '\\' ||
(buffer.Length - buffer.ToString ().TrimEnd ('\\').Length) % 2 == 0)) {
break;
}
nextChar = reader.Read ();
}
if (buffer [buffer.Length - 1] != '"')
throw new ArgumentException ("unclosed string literal in hyperlisp file");
return buffer.ToString ().Substring (0, buffer.Length - 1)
.Replace ("\n", "\r\n") // normalizing carriage returns
.Replace ("\r\r\n", "\r\n")
.Replace ("\\\"", "\"")
.Replace ("\\\\", "\\");
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uSU87CnVzaW5nIFN5c3RlbS5UZXh0OwoKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCXZhciBpbnB1dCA9ICJqb2UgXFxcImR1ZGVzXFxcIlwiIjsKCQlDb25zb2xlLldyaXRlTGluZShpbnB1dCk7CgkJQ29uc29sZS5Xcml0ZUxpbmUoUmVhZFNpbmdsZUxpbmVTdHJpbmdMaXRlcmFsKGlucHV0KSk7Cgl9CgkKCXByaXZhdGUgc3RhdGljIHN0cmluZyBSZWFkU2luZ2xlTGluZVN0cmluZ0xpdGVyYWwoc3RyaW5nIGxpbmUpCgl7CgkgICAgdXNpbmcgKHZhciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKGxpbmUpKQoJICAgIHsKCSAgICAgICAgcmV0dXJuIFJlYWRTaW5nbGVMaW5lU3RyaW5nTGl0ZXJhbChyZWFkZXIpOwoJICAgIH0KCX0KCglwcml2YXRlIHN0YXRpYyBzdHJpbmcgUmVhZFNpbmdsZUxpbmVTdHJpbmdMaXRlcmFsKFRleHRSZWFkZXIgcmVhZGVyKQoJewoJICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIgKCk7CgkgICAgaW50IG5leHRDaGFyID0gcmVhZGVyLlJlYWQgKCk7CgkgICAgd2hpbGUgKG5leHRDaGFyICE9IC0xKSB7CgkgICAgICAgIGJ1ZmZlci5BcHBlbmQgKChjaGFyKW5leHRDaGFyKTsKCSAgICAgICAgaWYgKG5leHRDaGFyID09ICciJyAmJiAKCSAgICAgICAgICAgIChidWZmZXIuTGVuZ3RoID09IDEgfHwgCgkgICAgICAgICAgICAgICAgIGJ1ZmZlciBbYnVmZmVyLkxlbmd0aCAtIDFdICE9ICdcXCcgfHwgCgkgICAgICAgICAgICAgICAgIChidWZmZXIuTGVuZ3RoIC0gYnVmZmVyLlRvU3RyaW5nICgpLlRyaW1FbmQgKCdcXCcpLkxlbmd0aCkgJSAyID09IDApKSB7CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgfQoJICAgICAgICBuZXh0Q2hhciA9IHJlYWRlci5SZWFkICgpOwoJICAgIH0KCSAgICBpZiAoYnVmZmVyIFtidWZmZXIuTGVuZ3RoIC0gMV0gIT0gJyInKQoJICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24gKCJ1bmNsb3NlZCBzdHJpbmcgbGl0ZXJhbCBpbiBoeXBlcmxpc3AgZmlsZSIpOwoJICAgIHJldHVybiBidWZmZXIuVG9TdHJpbmcgKCkuU3Vic3RyaW5nICgwLCBidWZmZXIuTGVuZ3RoIC0gMSkKCSAgICAgICAgLlJlcGxhY2UgKCJcbiIsICJcclxuIikgLy8gbm9ybWFsaXppbmcgY2FycmlhZ2UgcmV0dXJucwoJICAgICAgICAuUmVwbGFjZSAoIlxyXHJcbiIsICJcclxuIikKCSAgICAgICAgLlJlcGxhY2UgKCJcXFwiIiwgIlwiIikKCSAgICAgICAgLlJlcGxhY2UgKCJcXFxcIiwgIlxcIik7Cgl9Cn0=