holopy3/Assets/UniGLTF/UniJSON/Scripts/Json/JsonString.cs
Lena Biresch 490ef558ef CleanUp
2021-01-28 13:07:52 +01:00

150 lines
4.2 KiB
C#

using System;
using System.Linq;
using System.Text;
namespace UniJSON
{
public static class JsonString
{
#region Quote
public static void Escape(String s, IStore w)
{
if (String.IsNullOrEmpty(s))
{
return;
}
var it = s.ToCharArray().Cast<char>().GetEnumerator();
while(it.MoveNext())
{
switch(it.Current)
{
case '"':
case '\\':
case '/':
// \\ prefix
w.Write('\\');
w.Write(it.Current);
break;
case '\b':
w.Write('\\');
w.Write('b');
break;
case '\f':
w.Write('\\');
w.Write('f');
break;
case '\n':
w.Write('\\');
w.Write('n');
break;
case '\r':
w.Write('\\');
w.Write('r');
break;
case '\t':
w.Write('\\');
w.Write('t');
break;
default:
w.Write(it.Current);
break;
}
}
}
public static string Escape(String s)
{
var sb = new StringBuilder();
Escape(s, new StringBuilderStore(sb));
return sb.ToString();
}
public static void Quote(String s, IStore w)
{
w.Write('"');
Escape(s, w);
w.Write('"');
}
public static string Quote(string s)
{
var sb = new StringBuilder();
Quote(s, new StringBuilderStore(sb));
return sb.ToString();
}
#endregion
#region Unquote
public static void Unescape(string src, IStore w)
{
int i = 0;
int length = src.Length - 1;
while (i < length)
{
if (src[i] == '\\')
{
var c = src[i + 1];
switch (c)
{
case '\\':
case '/':
case '"':
// remove prefix
w.Write(c);
i += 2;
continue;
case 'b':
w.Write('\b');
i += 2;
continue;
case 'f':
w.Write('\f');
i += 2;
continue;
case 'n':
w.Write('\n');
i += 2;
continue;
case 'r':
w.Write('\r');
i += 2;
continue;
case 't':
w.Write('\t');
i += 2;
continue;
}
}
w.Write(src[i]);
i += 1;
}
while (i <= length)
{
w.Write(src[i++]);
}
}
public static string Unescape(string src)
{
var sb = new StringBuilder();
Unescape(src, new StringBuilderStore(sb));
return sb.ToString();
}
public static void Unquote(string src, IStore w)
{
Unescape(src.Substring(1, src.Length - 2), w);
}
public static string Unquote(string src)
{
var sb = new StringBuilder();
Unquote(src, new StringBuilderStore(sb));
var str = sb.ToString();
return str;
}
#endregion
}
}