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; }
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); }
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); }