public static string Deserialize(BufferedTextReader sr, int nextToken) { if (nextToken != '"') { throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); } sr.InitBuffer(); nextToken = sr.FillUntil('"', '\\'); if (nextToken == '"') { sr.Read(); return(sr.BufferToString()); } var tmp = sr.SmallBuffer; do { nextToken = sr.Read(2); switch (nextToken) { case 'b': sr.AddToBuffer('\b'); break; case 't': sr.AddToBuffer('\t'); break; case 'r': sr.AddToBuffer('\r'); break; case 'n': sr.AddToBuffer('\n'); break; case 'f': sr.AddToBuffer('\f'); break; case 'u': var len = sr.Read(tmp, 0, 4); if (len < 4) { sr.Read(tmp, len, 4 - len); //the second one must succeed } sr.AddToBuffer((char)Convert.ToInt32(new string(tmp, 0, 4), 16)); //TODO: optimize to no allocation break; default: sr.AddToBuffer((char)nextToken); break; } nextToken = sr.FillUntil('"', '\\'); } while (nextToken == '\\'); sr.Read(); return(sr.BufferToString()); }
private static string ParseEscapedString(BufferedTextReader reader, int context, ref int cur, char matchEnd) { cur = reader.Read(context); reader.InitBuffer(); do { if (cur == '\\' || cur == '"') { cur = reader.Read(context); if (cur == ',' || cur == matchEnd) return reader.BufferToString(); for (int i = 0; i < context - 1; i++) cur = reader.Read(); } reader.AddToBuffer((char)cur); reader.FillUntil('\\', '"'); cur = reader.Read(); } while (cur != -1); throw new FrameworkException("Unable to find end of string"); }
private static string ParseEscapedString(BufferedTextReader reader, int context, ref int cur, char matchEnd) { cur = reader.Read(context); reader.InitBuffer(); do { if (cur == '\\' || cur == '"') { cur = reader.Read(context); if (cur == ',' || cur == matchEnd) { return(reader.BufferToString()); } for (int i = 0; i < context - 1; i++) { cur = reader.Read(); } } reader.AddToBuffer((char)cur); reader.FillUntil('\\', '"'); cur = reader.Read(); } while (cur != -1); throw new FrameworkException("Unable to find end of string"); }
private static Dictionary<string, string> ParseDictionary( BufferedTextReader reader, int context, int quoteContext, ref int cur, char matchEnd) { cur = reader.Read(quoteContext); if (cur == ',' || cur == matchEnd) return new Dictionary<string, string>(0); var dict = new Dictionary<string, string>(); for (int i = 0; i < context; i++) cur = reader.Read(); reader.InitBuffer(); do { do { if (cur == '\\' || cur == '"') { cur = reader.Read(quoteContext); if (cur == '=') break; for (int i = 0; i < quoteContext - 1; i++) cur = reader.Read(); } reader.AddToBuffer((char)cur); reader.FillUntil('\\', '"'); cur = reader.Read(); } while (cur != -1); var name = reader.BufferToString(); cur = reader.Read(2); if (cur == 'N') { dict.Add(name, null); cur = reader.Read(4); if (cur == '\\' || cur == '"') { reader.Read(context); return dict; } if (cur == ',' && reader.Peek() != ' ') return dict; do { cur = reader.Read(); } while (cur == ' '); } else { cur = reader.Read(quoteContext); do { if (cur == '\\' || cur == '"') { cur = reader.Read(quoteContext); if (cur == ',') { dict.Add(name, reader.BufferToString()); do { cur = reader.Read(); } while (cur == ' '); cur = reader.Read(quoteContext); break; } for (int i = 0; i < context; i++) cur = reader.Read(); if (cur == ',' || cur == -1 || cur == matchEnd) { dict.Add(name, reader.BufferToString()); return dict; } for (int i = 0; i < context - 1; i++) cur = reader.Read(); } reader.AddToBuffer((char)cur); reader.FillUntil('\\', '"'); cur = reader.Read(); } while (cur != -1); } } while (cur != -1); return dict; }
public static string Deserialize(BufferedTextReader sr, int nextToken) { if (nextToken != '"') throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); sr.InitBuffer(); nextToken = sr.FillUntil('"', '\\'); if (nextToken == '"') { sr.Read(); return sr.BufferToString(); } var tmp = sr.SmallBuffer; do { nextToken = sr.Read(2); switch (nextToken) { case 'b': sr.AddToBuffer('\b'); break; case 't': sr.AddToBuffer('\t'); break; case 'r': sr.AddToBuffer('\r'); break; case 'n': sr.AddToBuffer('\n'); break; case 'f': sr.AddToBuffer('\f'); break; case 'u': var len = sr.Read(tmp, 0, 4); if (len < 4) sr.Read(tmp, len, 4 - len);//the second one must succeed sr.AddToBuffer((char)Convert.ToInt32(new string(tmp, 0, 4), 16));//TODO: optimize to no allocation break; default: sr.AddToBuffer((char)nextToken); break; } nextToken = sr.FillUntil('"', '\\'); } while (nextToken == '\\'); sr.Read(); return sr.BufferToString(); }
private static Dictionary <string, string> ParseDictionary( BufferedTextReader reader, int context, int quoteContext, ref int cur, char matchEnd) { cur = reader.Read(quoteContext); if (cur == ',' || cur == matchEnd) { return(new Dictionary <string, string>(0)); } var dict = new Dictionary <string, string>(); for (int i = 0; i < context; i++) { cur = reader.Read(); } reader.InitBuffer(); do { do { if (cur == '\\' || cur == '"') { cur = reader.Read(quoteContext); if (cur == '=') { break; } for (int i = 0; i < quoteContext - 1; i++) { cur = reader.Read(); } } reader.AddToBuffer((char)cur); reader.FillUntil('\\', '"'); cur = reader.Read(); } while (cur != -1); var name = reader.BufferToString(); cur = reader.Read(2); if (cur == 'N') { dict.Add(name, null); cur = reader.Read(4); if (cur == '\\' || cur == '"') { reader.Read(context); return(dict); } if (cur == ',' && reader.Peek() != ' ') { return(dict); } do { cur = reader.Read(); }while (cur == ' '); } else { cur = reader.Read(quoteContext); do { if (cur == '\\' || cur == '"') { cur = reader.Read(quoteContext); if (cur == ',') { dict.Add(name, reader.BufferToString()); do { cur = reader.Read(); }while (cur == ' '); cur = reader.Read(quoteContext); break; } for (int i = 0; i < context; i++) { cur = reader.Read(); } if (cur == ',' || cur == -1 || cur == matchEnd) { dict.Add(name, reader.BufferToString()); return(dict); } for (int i = 0; i < context - 1; i++) { cur = reader.Read(); } } reader.AddToBuffer((char)cur); reader.FillUntil('\\', '"'); cur = reader.Read(); } while (cur != -1); } } while (cur != -1); return(dict); }