private void InitializeMembers(CsvTable table, Version schemaVersion, Stream data, int readSize) { this.table = table; this.schemaVersion = schemaVersion; this.data = data; this.decoder = new CsvDecoderCallback[table.Fields.Length]; if (this.data.CanSeek) { this.position = this.data.Position; } this.readSize = readSize; for (int i = 0; i < table.Fields.Length; i++) { this.decoder[i] = CsvDecoder.GetDecoder(table.Fields[i].Type); } this.cacheVersion = new long[table.Fields.Length]; this.cache = new object[table.Fields.Length]; this.row = new CsvRowBuffer(readSize); this.unsupportedFields = table.GetFieldsAddedAfterVersion(this.schemaVersion); }
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); }