Example #1
0
 public object ResetAndDecode(byte[] value, CsvDecoderCallback decoder)
 {
     this.Reset();
     this.buffer = value;
     this.end    = value.Length;
     return(this.Decode(0, value.Length, decoder));
 }
Example #2
0
        private static CsvDecoderCallback MapSafe(Type type, CsvDecoderCallback callback)
        {
            CsvDecoderCallback result;

            lock (CsvDecoder.decodersMutex)
            {
                CsvDecoderCallback csvDecoderCallback;
                if (CsvDecoder.decoders.TryGetValue(type, out csvDecoderCallback))
                {
                    result = csvDecoderCallback;
                }
                else
                {
                    CsvDecoder.decoders = new Dictionary <Type, CsvDecoderCallback>(CsvDecoder.decoders)
                    {
                        {
                            type,
                            callback
                        }
                    };
                    result = callback;
                }
            }
            return(result);
        }
Example #3
0
 private object Decode(int offset, int end, CsvDecoderCallback decoder)
 {
     if (offset < end && this.buffer[offset] == 34)
     {
         int  num  = 0;
         bool flag = true;
         offset++;
         while (offset < end && num < this.conversionBuffer.Length)
         {
             byte b = this.buffer[offset++];
             if (b == 34)
             {
                 flag = !flag;
             }
             if (flag)
             {
                 this.conversionBuffer[num++] = b;
             }
             if (num == this.conversionBuffer.Length && this.conversionBuffer.Length < 10485760)
             {
                 byte[] dst = new byte[Math.Min(this.conversionBuffer.Length * 2, 10485760)];
                 Buffer.BlockCopy(this.conversionBuffer, 0, dst, 0, this.conversionBuffer.Length);
                 this.conversionBuffer = dst;
             }
         }
         return(decoder(this.conversionBuffer, 0, num));
     }
     return(decoder(this.buffer, offset, end - offset));
 }
Example #4
0
        public object Decode(int index, CsvDecoderCallback decoder)
        {
            ExTraceGlobals.CommonTracer.TraceDebug <int>((long)this.GetHashCode(), "CsvRowbuffer Decode index {0}", index);
            int num  = this.GetOffset(index) + this.rowBase;
            int num2 = num + this.GetLength(index);

            return(this.Decode(num, num2, decoder));
        }
Example #5
0
        public object Decode(byte[] src, int offset, int count)
        {
            CsvDecoderCallback decoder = CsvDecoder.GetDecoder(this.elementType);
            List <object>      list    = new List <object>();

            new CsvParser(59, 39);
            byte[] array = new byte[4096];
            int    i     = offset;
            int    num   = offset + count;

            CsvArrayDecoder.State state = CsvArrayDecoder.State.Whitespace;
            int num2 = 0;

            while (i < num)
            {
                byte b = src[i++];
                switch (state)
                {
                case CsvArrayDecoder.State.Whitespace:
                    if (b == 39)
                    {
                        state = CsvArrayDecoder.State.QuotedField;
                        num2  = 0;
                    }
                    else
                    {
                        byte b2 = b;
                        switch (b2)
                        {
                        case 9:
                        case 10:
                        case 13:
                            continue;

                        case 11:
                        case 12:
                            break;

                        default:
                            if (b2 == 32)
                            {
                                continue;
                            }
                            break;
                        }
                        state = CsvArrayDecoder.State.Field;
                        i--;
                        num2 = i;
                    }
                    break;

                case CsvArrayDecoder.State.Field:
                    if (b == 59)
                    {
                        state = CsvArrayDecoder.State.Whitespace;
                        list.Add(decoder(src, num2, i - num2 - 1));
                        num2 = 0;
                    }
                    break;

                case CsvArrayDecoder.State.QuotedField:
                    if (b == 39)
                    {
                        state = CsvArrayDecoder.State.EndQuote;
                    }
                    else if (num2 < array.Length)
                    {
                        array[num2++] = b;
                    }
                    break;

                case CsvArrayDecoder.State.EndQuote:
                    if (b == 39)
                    {
                        state = CsvArrayDecoder.State.QuotedField;
                        if (num2 < array.Length)
                        {
                            array[num2++] = 39;
                        }
                    }
                    else
                    {
                        state = CsvArrayDecoder.State.EndQuoteIgnore;
                        i--;
                        list.Add(decoder(array, 0, num2));
                    }
                    break;

                case CsvArrayDecoder.State.EndQuoteIgnore:
                    if (b == 59)
                    {
                        state = CsvArrayDecoder.State.Whitespace;
                        num2  = 0;
                    }
                    break;
                }
            }
            switch (state)
            {
            case CsvArrayDecoder.State.Whitespace:
            case CsvArrayDecoder.State.QuotedField:
            case CsvArrayDecoder.State.EndQuote:
                list.Add(decoder(array, 0, num2));
                break;

            case CsvArrayDecoder.State.Field:
                list.Add(decoder(src, num2, i - num2));
                break;
            }
            Array array2 = Array.CreateInstance(this.elementType, list.Count);

            for (int j = 0; j < array2.Length; j++)
            {
                object obj = list[j];
                if (obj == null)
                {
                    if (this.elementType.IsValueType)
                    {
                        return(null);
                    }
                }
                else if (!this.elementType.Equals(obj.GetType()))
                {
                    return(null);
                }
                array2.SetValue(obj, j);
            }
            return(array2);
        }