public object ResetAndDecode(byte[] value, CsvDecoderCallback decoder) { this.Reset(); this.buffer = value; this.end = value.Length; return(this.Decode(0, value.Length, decoder)); }
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); }
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)); }
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)); }
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); }