/// <summary> /// Reads until a delimiter or line ending is found. /// </summary> /// <returns>True if the end of the line was found, otherwise false.</returns> protected virtual bool ReadField() { if (c != context.ParserConfiguration.Delimiter[0] && c != '\r' && c != '\n') { if (fieldReader.IsBufferEmpty && !fieldReader.FillBuffer()) { // End of file. fieldReader.SetFieldEnd(); if (c == ' ' && (context.ParserConfiguration.TrimOptions & TrimOptions.Trim) == TrimOptions.Trim) { fieldReader.SetFieldStart(); } context.RecordBuilder.Add(fieldReader.GetField()); return(true); } c = fieldReader.GetChar(); } var inSpaces = false; while (true) { if (c == context.ParserConfiguration.Quote && !context.ParserConfiguration.IgnoreQuotes) { context.IsFieldBad = true; } // Trim end outside of quotes. if (!inSpaces && c == ' ' && (context.ParserConfiguration.TrimOptions & TrimOptions.Trim) == TrimOptions.Trim) { inSpaces = true; fieldReader.SetFieldEnd(-1); fieldReader.AppendField(); fieldReader.SetFieldStart(-1); fieldReader.SetRawRecordStart(-1); } else if (inSpaces && c != ' ') { // Hit a non-space char. // Need to determine if it's the end of the field or another char. inSpaces = false; if (c == context.ParserConfiguration.Delimiter[0] || c == '\r' || c == '\n') { fieldReader.SetFieldStart(-1); } } if (c == context.ParserConfiguration.Delimiter[0]) { fieldReader.SetFieldEnd(-1); // End of field. if (ReadDelimiter()) { // Set the end of the field to the char before the delimiter. context.RecordBuilder.Add(fieldReader.GetField()); return(false); } } else if (c == '\r' || c == '\n') { // End of line. fieldReader.SetFieldEnd(-1); var offset = ReadLineEnding(); fieldReader.SetRawRecordEnd(offset); context.RecordBuilder.Add(fieldReader.GetField()); fieldReader.SetFieldStart(offset); fieldReader.SetBufferPosition(offset); return(true); } if (fieldReader.IsBufferEmpty && !fieldReader.FillBuffer()) { // End of file. fieldReader.SetFieldEnd(); if (c == ' ' && (context.ParserConfiguration.TrimOptions & TrimOptions.Trim) == TrimOptions.Trim) { fieldReader.SetFieldStart(); } context.RecordBuilder.Add(fieldReader.GetField()); return(true); } c = fieldReader.GetChar(); } }