Exemplo n.º 1
0
 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;
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }