示例#1
0
 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);
     }
 }
示例#2
0
		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");
			}
		}
示例#3
0
        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);
            }
        }
示例#4
0
 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());
 }
示例#5
0
 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));
 }
示例#6
0
		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);
		}
示例#7
0
 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()));
 }
示例#8
0
 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, ')');
 }
示例#9
0
        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());
        }
示例#10
0
        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, ')'));
        }
示例#11
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;
 }
示例#12
0
		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");
		}
示例#13
0
 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");
 }
示例#14
0
        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");
            }
        }
示例#15
0
 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;
 }
示例#16
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);
        }
示例#17
0
		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();
		}
示例#18
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);
        }
示例#19
0
        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);
        }