コード例 #1
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());
        }
コード例 #2
0
ファイル: StringConverter.cs プロジェクト: dstimac/revenj
		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");
		}
コード例 #3
0
ファイル: StringConverter.cs プロジェクト: zhxjdwh/revenj
 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");
 }
コード例 #4
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;
 }
コード例 #5
0
ファイル: StringConverter.cs プロジェクト: dstimac/revenj
		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();
		}
コード例 #6
0
ファイル: HstoreConverter.cs プロジェクト: zhxjdwh/revenj
        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);
        }