/// <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 (context.C != context.ParserConfiguration.Delimiter[0] && context.C != '\r' && context.C != '\n') { if (fieldReader.IsBufferEmpty && !fieldReader.FillBuffer()) { // End of file. fieldReader.SetFieldEnd(); if (context.C == ' ' && (context.ParserConfiguration.TrimOptions & TrimOptions.Trim) == TrimOptions.Trim) { fieldReader.SetFieldStart(); } context.RecordBuilder.Add(fieldReader.GetField()); return(true); } context.C = fieldReader.GetChar(); } var inSpaces = false; while (true) { if (context.C == context.ParserConfiguration.Quote && !context.ParserConfiguration.IgnoreQuotes) { context.IsFieldBad = true; } // Trim end outside of quotes. if (!inSpaces && context.C == ' ' && (context.ParserConfiguration.TrimOptions & TrimOptions.Trim) == TrimOptions.Trim) { inSpaces = true; fieldReader.SetFieldEnd(-1); fieldReader.AppendField(); fieldReader.SetFieldStart(-1); fieldReader.SetRawRecordStart(-1); } else if (inSpaces && context.C != ' ') { // Hit a non-space char. // Need to determine if it's the end of the field or another char. inSpaces = false; if (context.C == context.ParserConfiguration.Delimiter[0] || context.C == '\r' || context.C == '\n') { fieldReader.SetFieldStart(-1); } } if (context.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 (context.C == '\r' || context.C == '\n') { // End of line. fieldReader.SetFieldEnd(-1); var offset = ReadLineEnding(); fieldReader.SetRawRecordEnd(offset); context.RecordBuilder.Add(fieldReader.GetField()); fieldReader.SetFieldStart(offset); return(true); } if (fieldReader.IsBufferEmpty && !fieldReader.FillBuffer()) { // End of file. fieldReader.SetFieldEnd(); if (context.C == ' ' && (context.ParserConfiguration.TrimOptions & TrimOptions.Trim) == TrimOptions.Trim) { fieldReader.SetFieldStart(); } context.RecordBuilder.Add(fieldReader.GetField()); return(true); } context.C = fieldReader.GetChar(); } }