public static decimal DeserializeDecimal(BufferedTextReader sr, ref int nextToken) { if (nextToken == '"') { sr.InitBuffer(); sr.FillUntil('"'); nextToken = sr.Read(2); try { return sr.BufferToValue(ConvertToDecimal); } catch (Exception ex) { throw new SerializationException("Error parsing decimal at " + JsonSerialization.PositionInStream(sr) + ". " + ex.Message, ex); } } var buf = sr.SmallBuffer; buf[0] = (char)nextToken; var size = sr.ReadNumber(buf, 1) + 1; nextToken = sr.Read(); try { return ConvertToDecimal(buf, size, sr); } catch (Exception ex) { throw new SerializationException("Error parsing decimal at " + JsonSerialization.PositionInStream(sr) + ". " + ex.Message, ex); } }
public static void Skip(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') return; if (cur != '"' && cur != '\\') { reader.InitBuffer(); reader.FillUntil(',', ')'); reader.Read(); } else { cur = reader.Read(context); while (cur != -1) { if (cur == '\\' || cur == '"') { cur = reader.Read(context); if (cur == ',' || cur == ')') return; cur = reader.Read(context); } else cur = reader.Read(); } throw new FrameworkException("Unable to find end of string"); } }
public static double DeserializeDouble(BufferedTextReader sr, ref int nextToken) { if (nextToken == '"') { sr.InitBuffer(); sr.FillUntil('"'); nextToken = sr.Read(2); try { return(sr.BufferToValue(ConvertToDouble)); } catch (Exception ex) { throw new SerializationException("Error parsing double at " + JsonSerialization.PositionInStream(sr) + ". " + ex.Message, ex); } } var buf = sr.SmallBuffer; buf[0] = (char)nextToken; var size = sr.ReadNumber(buf, 1) + 1; nextToken = sr.Read(); try { return(ConvertToDouble(buf, size)); } catch (Exception ex) { throw new SerializationException("Error parsing double at " + JsonSerialization.PositionInStream(sr) + ". " + ex.Message, ex); } }
public static TreePath Deserialize(BufferedTextReader sr, int nextToken) { if (nextToken != '"') throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); sr.InitBuffer(); nextToken = sr.FillUntil('"'); sr.Read(); return TreePath.Create(sr.BufferToString()); }
private static double ParseDouble(BufferedTextReader reader, ref int cur, char matchEnd) { reader.InitBuffer((char)cur); reader.FillUntil(',', matchEnd); cur = reader.Read(); //TODO: optimize return(double.Parse(reader.BufferToString(), NumberStyles.Float, CultureInfo.InvariantCulture)); }
private static double ParseDouble(BufferedTextReader reader, ref int cur, char matchEnd) { reader.InitBuffer((char)cur); reader.FillUntil(',', matchEnd); cur = reader.Read(); //TODO: optimize return double.Parse(reader.BufferToString(), NumberStyles.Float, CultureInfo.InvariantCulture); }
public static TreePath Deserialize(BufferedTextReader sr, int nextToken) { if (nextToken != '"') { throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); } sr.InitBuffer(); nextToken = sr.FillUntil('"'); sr.Read(); return(TreePath.Create(sr.BufferToString())); }
public static string Parse(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; if (cur != '"' && cur != '\\') { reader.InitBuffer((char)cur); reader.FillUntil(',', ')'); reader.Read(); return reader.BufferToString(); } return ParseEscapedString(reader, context, ref cur, ')'); }
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()); }
public static string Parse(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(null); } if (cur != '"' && cur != '\\') { reader.InitBuffer((char)cur); reader.FillUntil(',', ')'); reader.Read(); return(reader.BufferToString()); } return(ParseEscapedString(reader, context, ref cur, ')')); }
public static List<string> ParseCollection(BufferedTextReader reader, int context, bool allowNull) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; var espaced = cur != '{'; if (espaced) reader.Read(context); var innerContext = context << 1; cur = reader.Peek(); if (cur == '}') { if (espaced) reader.Read(context + 2); else reader.Read(2); return new List<string>(0); } var list = new List<string>(); var emptyCol = allowNull ? null : string.Empty; do { cur = reader.Read(); if (cur == '"' || cur == '\\') list.Add(ParseEscapedString(reader, innerContext, ref cur, '}')); else { reader.InitBuffer((char)cur); reader.FillUntil(',', '}'); cur = reader.Read(); if (reader.BufferMatches("NULL")) list.Add(emptyCol); else list.Add(reader.BufferToString()); } } while (cur == ','); if (espaced) reader.Read(context + 1); else reader.Read(); return list; }
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"); }
public static void Skip(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return; } if (cur != '"' && cur != '\\') { reader.InitBuffer(); reader.FillUntil(',', ')'); reader.Read(); } else { cur = reader.Read(context); while (cur != -1) { if (cur == '\\' || cur == '"') { cur = reader.Read(context); if (cur == ',' || cur == ')') { return; } cur = reader.Read(context); } else { cur = reader.Read(); } } 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 List <T?> ParseNullableCollection <T>(BufferedTextReader reader, int context, Func <BufferedTextReader, T> factory) where T : struct { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(null); } var espaced = cur != '{'; if (espaced) { reader.Read(context); } cur = reader.Peek(); if (cur == '}') { if (espaced) { reader.Read(context); } else { reader.Read(2); } return(new List <T?>(0)); } var innerContext = context == 0 ? 1 : context << 1; var list = new List <T?>(); do { cur = reader.Read(); if (cur == '"' || cur == '\\') { cur = reader.Read(innerContext); reader.InitBuffer((char)cur); reader.FillUntil('\\', '"'); list.Add(factory(reader)); cur = reader.Read(innerContext + 1); } else { reader.InitBuffer((char)cur); reader.FillUntil(',', '}'); cur = reader.Read(); if (reader.BufferMatches("NULL")) { list.Add(null); } else { list.Add(factory(reader)); } } } while (cur == ','); if (espaced) { reader.Read(context + 1); } else { reader.Read(); } return(list); }
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(); }
public static List <string> ParseCollection(BufferedTextReader reader, int context, bool allowNull) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(null); } var espaced = cur != '{'; if (espaced) { reader.Read(context); } cur = reader.Peek(); if (cur == '}') { if (espaced) { reader.Read(context + 2); } else { reader.Read(2); } return(new List <string>(0)); } var innerContext = context << 1; var list = new List <string>(); var emptyCol = allowNull ? null : string.Empty; do { cur = reader.Read(); if (cur == '"' || cur == '\\') { list.Add(ParseEscapedString(reader, innerContext, ref cur, '}')); } else { reader.InitBuffer((char)cur); reader.FillUntil(',', '}'); cur = reader.Read(); if (reader.BufferMatches("NULL")) { list.Add(emptyCol); } else { list.Add(reader.BufferToString()); } } } while (cur == ','); if (espaced) { reader.Read(context + 1); } else { reader.Read(); } return(list); }
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); }