public static Guid Deserialize(BufferedTextReader sr, int nextToken) { if (nextToken != '"') { throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); } var buffer = sr.SmallBuffer; var i = sr.Read(buffer, 0, 33); nextToken = buffer[i - 1]; for (; nextToken != '"' && i < buffer.Length; i++) { nextToken = sr.Read(); buffer[i] = (char)nextToken; } if (nextToken != '"') { throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); } if (i == 33) { return(ParseGuid32(buffer)); } else if (i == 37) { return(ParseGuid36(buffer)); } return(new Guid(new string(buffer, 0, i - 1))); }
public static List<DateTime?> ParseNullableCollection(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; var escaped = cur == '"' || cur == '\\'; if (escaped) reader.Read(context); var list = new List<DateTime?>(); cur = reader.Peek(); if (cur == '}') reader.Read(); while (cur != -1 && cur != '}') { cur = reader.Read(); if (cur == 'N') { cur = reader.Read(4); list.Add(null); } else { list.Add(ParseDate(reader, cur)); cur = reader.Read(); } } if (escaped) reader.Read(context + 1); else reader.Read(); return list; }
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 byte[] Parse(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(null); } var len = context + (context << 1); if (len == 0) { len = 1; } cur = reader.Read(len + 1); var list = new List <byte>(1024); while (cur != -1 && cur != '\\' && cur != '"') { list.Add((byte)((CharLookup[cur] << 4) + CharLookup[reader.Read()])); cur = reader.Read(); } reader.Read(context); return(list.ToArray()); }
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 DateTimeOffset DeserializeOffset(BufferedTextReader sr, int nextToken) { if (nextToken != '"') { throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); } int i = 0; var buffer = sr.SmallBuffer; nextToken = sr.Read(); for (; i < buffer.Length && nextToken != '"'; i++, nextToken = sr.Read()) { buffer[i] = (char)nextToken; } try { if (i > 0 && buffer[i - 1] == 'Z') { return(DateTimeOffset.Parse(new string(buffer, 0, i), Invariant, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal)); } return(DateTimeOffset.Parse(new string(buffer, 0, i), Invariant)); } catch (Exception ex) { throw new SerializationException("Error parsing timestamp at " + JsonSerialization.PositionInStream(sr) + ". " + ex.Message, ex); } }
public static IPAddress DeserializeIP(BufferedTextReader sr, int nextToken) { if (nextToken != '"') { throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); } nextToken = sr.Read(); var buffer = sr.SmallBuffer; int i = 0; for (; nextToken != '"' && i < buffer.Length; i++, nextToken = sr.Read()) { buffer[i] = (char)nextToken; } if (nextToken == '"') { try { return(IPAddress.Parse(new string(buffer, 0, i))); } catch (Exception ex) { throw new SerializationException("Error parsing IP address at " + JsonSerialization.PositionInStream(sr) + ". " + ex.Message, ex); } } throw new SerializationException("Invalid value found at position " + JsonSerialization.PositionInStream(sr) + " for ip value. Expecting \""); }
private static decimal ParseDecimal(BufferedTextReader reader, ref int cur, char matchEnd) { var neg = cur == '-'; if (neg) cur = reader.Read(); var buf = reader.SmallBuffer; buf[0] = (char)cur; var size = reader.ReadUntil(buf, 1, ',', matchEnd) + 1; cur = reader.Read(); if (cur >= '0' && cur <= '9' || cur == '.') throw new FrameworkException("Too long decimal number: " + new string(buf, 0, size)); if (size > 18) { if (neg) return -decimal.Parse(new string(buf, 0, size), Invariant); return decimal.Parse(new string(buf, 0, size), Invariant); } long value = 0; int scale = 0; char ch; for (int i = 0; i < size && i < buf.Length; i++) { ch = buf[i]; if (ch == '.') scale = size - i - 1; else value = (value << 3) + (value << 1) + ch - 48; } return new decimal((int)value, (int)(value >> 32), 0, neg, (byte)scale); }
public static int CalcHash(BufferedTextReader sr, int nextToken) { if (nextToken != '"') { throw new SerializationException("Expecting '\"' at position " + PositionInStream(sr) + ". Found " + (char)nextToken); } nextToken = sr.Read(); char c = (char)nextToken; var buffer = sr.SmallBuffer; int i = 0; var hash = 0x811C9DC5; for (; i < buffer.Length && c != '"'; i++, c = (char)sr.Read()) { buffer[i] = c; hash = (hash ^ c) * 0x1000193; } nextToken = c; if (i < buffer.Length) { buffer[i] = '\0'; } if (nextToken != '"') { throw new SerializationException("Expecting '\"' at position " + PositionInStream(sr) + ". Found " + (char)nextToken); } return((int)hash); }
public static bool Parse(BufferedTextReader reader) { var cur = reader.Read(); if (cur == ',' || cur == ')') return false; reader.Read(); return cur == 't'; }
public static bool? ParseNullable(BufferedTextReader reader) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; reader.Read(); return cur == 't'; }
public static DateTime Parse(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') return DateTime.MinValue; var dt = ParseTimestampUtc(reader, context); reader.Read(); return dt.ToLocalTime(); }
public static DateTime? ParseNullable(BufferedTextReader reader) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; var res = ParseDate(reader, cur); reader.Read(); return res; }
public static S3 Parse(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; var s3 = ParseS3(reader, context, context == 0 ? 1 : context << 1, null); reader.Read(); return s3; }
public static DateTime Parse(BufferedTextReader reader) { var cur = reader.Read(); if (cur == ',' || cur == ')') return DateTime.MinValue; var res = ParseDate(reader, cur); reader.Read(); return res; }
public static XElement DeserializeNullable(BufferedTextReader sr, ref int nextToken) { if (nextToken == 'n') { if (sr.Read() == 'u' && sr.Read() == 'l' && sr.Read() == 'l') return null; throw new SerializationException("Invalid null value found at " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); } return Deserialize(sr, ref nextToken); }
public static int GetNextToken(BufferedTextReader sr) { int c = sr.Read(); while (IsWhiteSpace(c)) { c = sr.Read(); } return(c); }
public static DateTime DeserializeDate(BufferedTextReader sr, int nextToken) { if (nextToken != '"') throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); nextToken = sr.Read(); int year = 0; //TODO: 6!? for (int i = 0; i < 6 && (nextToken != '-'); i++, nextToken = sr.Read()) year = year * 10 + (nextToken - '0'); nextToken = sr.Read(); int month = nextToken - 48; nextToken = sr.Read(); if (nextToken != '-') { month = month * 10 + (nextToken - '0'); if ((nextToken = sr.Read()) != '-') throw new SerializationException("Expecting '-' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); } nextToken = sr.Read(); int day = nextToken - 48; nextToken = sr.Read(); if (nextToken != '"' && nextToken != ' ' && nextToken != 'T') { day = day * 10 + (nextToken - '0'); nextToken = sr.Read(); } for (int i = 0; i < 24 && nextToken != '"'; i++) nextToken = sr.Read(); if (nextToken != '"') throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); return new DateTime(year, month, day); }
public static bool?ParseNullable(BufferedTextReader reader) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(null); } reader.Read(); return(cur == 't'); }
public static bool Parse(BufferedTextReader reader) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(false); } reader.Read(); return(cur == 't'); }
private static int MemoizeGetNextToken(BufferedTextReader sr, TextWriter sw) { int c = sr.Read(); sw.Write((char)c); while (IsWhiteSpace(c)) { c = sr.Read(); sw.Write((char)c); } return(c); }
private static int SkipString(BufferedTextReader sr) { var c = sr.Read(); var prev = c; while ((c != '"' || prev == '\\') && c != -1) { prev = c; c = sr.Read(); } return(GetNextToken(sr)); }
public static TreePath?DeserializeNullable(BufferedTextReader sr, int nextToken) { if (nextToken == 'n') { if (sr.Read() == 'u' && sr.Read() == 'l' && sr.Read() == 'l') { return(null); } throw new SerializationException("Invalid null value found at " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); } return(Deserialize(sr, nextToken)); }
public static byte[] Deserialize(BufferedTextReader sr, int nextToken) { if (nextToken != '"') { throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); } nextToken = sr.Read(); if (nextToken == '"') { return(EmptyBytes); } var base64 = sr.LargeTempBuffer; var res = new List <byte[]>(); int total = 0; int i = 1; base64[0] = (char)nextToken; int len; while ((len = sr.ReadUntil(base64, i, '"')) > 0) { i += len; if (i == base64.Length) { var bytes = Convert.FromBase64CharArray(base64, 0, base64.Length); res.Add(bytes); i = 0; total += bytes.Length; } } nextToken = sr.Read(); if (i > 0) { var bytes = Convert.FromBase64CharArray(base64, 0, i); res.Add(bytes); total += bytes.Length; } if (nextToken != '"') { throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found end of stream."); } var result = new byte[total]; var cur = 0; for (i = 0; i < res.Count; i++) { var item = res[i]; Array.Copy(item, 0, result, cur, item.Length); cur += item.Length; } return(result); }
public static DateTime?ParseNullable(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(null); } var dt = ParseTimestampUtc(reader, context); reader.Read(); return(dt.ToLocalTime()); }
public static DateTime ParseUtc(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(MinUtc); } var dt = ParseTimestampUtc(reader, context); reader.Read(); return(dt); }
public static S3 Parse(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(null); } var s3 = ParseS3(reader, context, context == 0 ? 1 : context << 1, null); reader.Read(); return(s3); }
public static DateTime?ParseNullable(BufferedTextReader reader) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(null); } var res = ParseDate(reader, cur); reader.Read(); return(res); }
public static DateTime Parse(BufferedTextReader reader) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(DateTime.MinValue); } var res = ParseDate(reader, cur); reader.Read(); return(res); }
private static Guid ParseCollectionGuid(BufferedTextReader reader, int cur) { var buf = reader.SmallBuffer; buf[0] = (char)cur; int read = reader.Read(buf, 1, 35); for (int i = read + 1; i < 36; i++) { buf[i] = (char)reader.Read(); } return(ParseGuid36(buf)); }
private static Guid ParseGuid(BufferedTextReader reader, int cur) { var buf = reader.SmallBuffer; buf[0] = (char)cur; int read = reader.Read(buf, 1, 36); for (int i = read + 1; i < 37 && i < buf.Length; i++) { buf[i] = (char)reader.Read(); } return(ParseGuid36(buf)); }
public static void DeserializeColorNullableCollection(BufferedTextReader sr, int nextToken, ICollection<Color?> res) { if (nextToken == 'n') { if (sr.Read() == 'u' && sr.Read() == 'l' && sr.Read() == 'l') res.Add(null); else throw new SerializationException("Invalid value found at position " + JsonSerialization.PositionInStream(sr) + " for Color value. Expecting number, string or null"); nextToken = sr.Read(); } else res.Add(DeserializeColor(sr, ref nextToken)); while ((nextToken = JsonSerialization.MoveToNextToken(sr, nextToken)) == ',') { nextToken = JsonSerialization.GetNextToken(sr); if (nextToken == 'n') { if (sr.Read() == 'u' && sr.Read() == 'l' && sr.Read() == 'l') res.Add(null); else throw new SerializationException("Invalid value found at position " + JsonSerialization.PositionInStream(sr) + " for Color value. Expecting number, string or null"); nextToken = sr.Read(); } else res.Add(DeserializeColor(sr, ref nextToken)); } if (nextToken != ']') { if (nextToken == -1) throw new SerializationException("Unexpected end of json in collection."); else throw new SerializationException("Expecting ']' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); } }
private static S3 ParseS3(BufferedTextReader reader, int context, int innerContext, IServiceProvider locator) { for (int i = 0; i < context; i++) reader.Read(); var bucket = StringConverter.Parse(reader, innerContext); var key = StringConverter.Parse(reader, innerContext); var length = LongConverter.Parse(reader); var name = StringConverter.Parse(reader, innerContext); var mimeType = StringConverter.Parse(reader, innerContext); var metadata = HstoreConverter.Parse(reader, innerContext); for (int i = 0; i < context; i++) reader.Read(); return new S3 { Bucket = bucket, Key = key, Length = length, Name = name, MimeType = mimeType, Metadata = metadata }; }
private static DateTime ParseDate(BufferedTextReader reader, int cur) { //TODO: BC after date for year < 0 ... not supported by .NET if (cur == '\\' || cur == '"') throw new NotSupportedException("Negative dates are not supported by .NET."); var buf = reader.SmallBuffer; buf[0] = (char)cur; var read = reader.Read(buf, 1, 9); for (int i = read + 1; i < 10; i++) buf[i] = (char)reader.Read(); if (buf[4] != '-') return ParseDateSlow(buf, reader); return new DateTime(NumberConverter.Read4(buf, 0), NumberConverter.Read2(buf, 5), NumberConverter.Read2(buf, 8)); }
public static List <DateTime> ParseCollectionUtc(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(null); } var escaped = cur != '{'; if (escaped) { reader.Read(context); } int innerContext = context == 0 ? 1 : context << 1; cur = reader.Peek(); if (cur == '}') { if (escaped) { reader.Read(context + 2); } else { reader.Read(2); } return(new List <DateTime>(0)); } var list = new List <DateTime>(); do { cur = reader.Read(); if (cur == 'N') { cur = reader.Read(4); list.Add(MinUtc); } else { list.Add(ParseTimestampUtc(reader, innerContext)); cur = reader.Read(); } } while (cur == ','); if (escaped) { reader.Read(context + 1); } else { reader.Read(); } return(list); }
public static List<bool?> ParseNullableCollection(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; var espaced = cur != '{'; if (espaced) reader.Read(context); var list = new List<bool?>(); cur = reader.Peek(); if (cur == '}') reader.Read(); while (cur != -1 && cur != '}') { cur = reader.Read(); if (cur == 't') list.Add(true); else if (cur == 'f') list.Add(false); else { reader.Read(3); list.Add(null); } cur = reader.Read(); } if (espaced) reader.Read(context + 1); else reader.Read(); return list; }
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 List <double> ParseCollection(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(null); } var espaced = cur != '{'; if (espaced) { reader.Read(context); } var list = new List <double>(); cur = reader.Peek(); if (cur == '}') { reader.Read(); } while (cur != -1 && cur != '}') { cur = reader.Read(); if (cur == 'N') { cur = reader.Read(); if (cur == 'U') { cur = reader.Read(3); list.Add(0); } else { list.Add(double.NaN); cur = reader.Read(2); } } else { list.Add(ParseDouble(reader, ref cur, '}')); } } if (espaced) { reader.Read(context + 1); } else { reader.Read(); } return(list); }
public static List <Guid> ParseCollection(BufferedTextReader reader, int context) { 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 <Guid>(0)); } var list = new List <Guid>(); do { cur = reader.Read(); if (cur == 'N') { cur = reader.Read(4); list.Add(Guid.Empty); } else { list.Add(ParseCollectionGuid(reader, cur)); cur = reader.Read(); } } while (cur == ','); if (espaced) { reader.Read(context + 1); } else { reader.Read(); } return(list); }
public static float Parse(BufferedTextReader reader) { var cur = reader.Read(); if (cur == ',' || cur == ')') return 0; return ParseFloat(reader, ref cur, ')'); }
private static DateTime ParseDateSlow(char[] buf, BufferedTextReader reader) { int foundAt = 4; for (; foundAt < buf.Length; foundAt++) { if (buf[foundAt] == '-') { break; } } if (foundAt == buf.Length) { throw new NotSupportedException("Invalid date value."); } var year = IntConverter.ParsePositive(buf, 0, foundAt); var newBuf = reader.CharBuffer; for (int i = foundAt + 1; i < buf.Length; i++) { newBuf[i - foundAt - 1] = buf[i]; } for (int i = buf.Length - foundAt - 1; i < 5; i++) { newBuf[i] = (char)reader.Read(); } return(new DateTime(year, NumberConverter.Read2(newBuf, 0), NumberConverter.Read2(newBuf, 3))); }
public static double Parse(BufferedTextReader reader) { var cur = reader.Read(); if (cur == ',' || cur == ')') return 0; return ParseDouble(reader, ref cur, ')'); }
public static long? ParseNullable(BufferedTextReader reader) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; return ParseLong(reader, ref cur); }
public static List<long> ParseCollection(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; var espaced = cur != '{'; if (espaced) reader.Read(context); var list = new List<long>(); cur = reader.Peek(); if (cur == '}') reader.Read(); while (cur != -1 && cur != '}') { cur = reader.Read(); if (cur == 'N') { cur = reader.Read(4); list.Add(0); } else { list.Add(ParseLong(reader, ref cur)); } } if (espaced) reader.Read(context + 1); else reader.Read(); return list; }
public static Dictionary<string, string> Parse(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; return ParseDictionary(reader, context, context > 0 ? context << 1 : 1, ref cur, ')'); }
public static int? ParseNullable(BufferedTextReader reader) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; return ParseInt(reader, ref cur, ')'); }
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 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<Dictionary<string, string>> ParseCollection(BufferedTextReader reader, int context, bool allowNulls) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; var espaced = cur != '{'; if (espaced) reader.Read(context); var innerContext = context << 1; var list = new List<Dictionary<string, string>>(); cur = reader.Peek(); if (cur == '}') reader.Read(); while (cur != -1 && cur != '}') { cur = reader.Read(); if (cur == 'N') { cur = reader.Read(4); list.Add(allowNulls ? null : new Dictionary<string, string>()); } else { list.Add(ParseDictionary(reader, innerContext, innerContext << 1, ref cur, '}')); } } if (espaced) reader.Read(context + 1); else reader.Read(); return list; }
private static int MemoizeSkipString(BufferedTextReader sr, TextWriter sw) { var c = sr.Read(); sw.Write((char)c); while (c != '"' && c != -1) { c = sr.Read(); sw.Write((char)c); if (c == '\\') { c = sr.Read(); sw.Write((char)c); c = (char)0; } } return(MemoizeGetNextToken(sr, sw)); }
public static DateTime? ParseNullable(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; var dt = ParseTimestampUtc(reader, context); reader.Read(); return dt.ToLocalTime(); }
public static byte[] Parse(BufferedTextReader reader, int context) { var cur = reader.Read(); if (cur == ',' || cur == ')') return null; var len = context + (context << 1); if (len == 0) len = 1; cur = reader.Read(len + 1); var list = new List<byte>(1024); while (cur != -1 && cur != '\\' && cur != '"') { list.Add((byte)((CharLookup[cur] << 4) + CharLookup[reader.Read()])); cur = reader.Read(); } reader.Read(context); return list.ToArray(); }
private static decimal ParseDecimal(BufferedTextReader reader, ref int cur, char matchEnd) { var neg = cur == '-'; if (neg) { cur = reader.Read(); } var buf = reader.SmallBuffer; buf[0] = (char)cur; var size = reader.ReadUntil(buf, 1, ',', matchEnd) + 1; cur = reader.Read(); if (cur >= '0' && cur <= '9' || cur == '.') { throw new FrameworkException("Too long decimal number: " + new string(buf, 0, size)); } if (size > 18) { if (neg) { return(-decimal.Parse(new string(buf, 0, size), Invariant)); } return(decimal.Parse(new string(buf, 0, size), Invariant)); } long value = 0; int scale = 0; char ch; for (int i = 0; i < size && i < buf.Length; i++) { ch = buf[i]; if (ch == '.') { scale = size - i - 1; } else { value = (value << 3) + (value << 1) + ch - 48; } } return(new decimal((int)value, (int)(value >> 32), 0, neg, (byte)scale)); }
public static Guid Parse(BufferedTextReader reader) { var cur = reader.Read(); if (cur == ',' || cur == ')') { return(Guid.Empty); } return(ParseGuid(reader, cur)); }
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 IPAddress DeserializeIP(BufferedTextReader sr, int nextToken) { if (nextToken != '"') throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken); nextToken = sr.Read(); var buffer = sr.SmallBuffer; int i = 0; for (; nextToken != '"' && i < buffer.Length; i++, nextToken = sr.Read()) buffer[i] = (char)nextToken; if (nextToken == '"') { try { return IPAddress.Parse(new string(buffer, 0, i)); } catch (Exception ex) { throw new SerializationException("Error parsing IP address at " + JsonSerialization.PositionInStream(sr) + ". " + ex.Message, ex); } } throw new SerializationException("Invalid value found at position " + JsonSerialization.PositionInStream(sr) + " for ip value. Expecting \""); }
public static List<decimal?> ParseNullableCollection(BufferedTextReader reader, int context) { 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<decimal?>(0); } var list = new List<decimal?>(); do { cur = reader.Read(); if (cur == 'N') { list.Add(null); cur = reader.Read(4); } else list.Add(ParseDecimal(reader, ref cur, '}')); } while (cur == ','); if (espaced) reader.Read(context + 1); else reader.Read(); return list; }