private bool StartReadField(Token token, List<object> fieldValues, ParseContext parseContext) { if (!(token is EndOfStreamToken)) { parseContext.IncrementFieldNumber(); if (parseContext.SupportQuotedFields && token.Value.Equals("\"") && token is SpecialToken) { parseContext.ReadingQuotedField = true; parseContext.Handle = ReadQuotedField; } else { parseContext.ReadingQuotedField = false; parseContext.Handle = ReadUnquotedField; return ReadUnquotedField(token, fieldValues, parseContext); } } return false; }
private bool StartCollectingFieldSeparator(Token token, List<object> fieldValues, ParseContext parseContext) { parseContext.SeparatorLength = 0; var fieldSeparator = parseContext.FieldSeparator; var recordSeparator = parseContext.RecordSeparator; if (recordSeparator.Length > 0 && fieldSeparator[0].Equals(recordSeparator[0]) && recordSeparator.Length > fieldSeparator.Length) { parseContext.Handle = ContinueCollectRecordSeparator; } else { parseContext.Handle = ContinueCollectFieldSeparator; } return parseContext.Handle(token, fieldValues, parseContext); }
private bool StartCollectingRecordSeparator(Token token, List<object> fieldValues, ParseContext parseContext) { parseContext.SeparatorLength = 0; parseContext.Handle = ContinueCollectRecordSeparator; return ContinueCollectRecordSeparator(token, fieldValues, parseContext); }
private bool ReadUnquotedField(Token token, List<object> fieldValues, ParseContext parseContext) { if (token is SpecialToken) { var ch = token.Value[0]; var fieldSeparator = parseContext.FieldSeparator; if (fieldSeparator.Length > 0 && ch.Equals(fieldSeparator[0])) { return StartCollectingFieldSeparator(token, fieldValues, parseContext); } var recordSeparator = parseContext.RecordSeparator; if (recordSeparator.Length > 0 && ch.Equals(recordSeparator[0])) { return StartCollectingRecordSeparator(token, fieldValues, parseContext); } } parseContext.Capture.Append(token.Value); return false; }
private bool ReadQuotedField(Token token, List<object> fieldValues, ParseContext parseContext) { if (!(token is SpecialToken) || !token.First.Equals('"')) { parseContext.Capture.Append(token.Value); } else { parseContext.Handle = BranchReadEscapedQuoteOrStartCollectingSeparator; } return false; }
private bool HandleFailureToMatchExpectedSeparator(Token token, List<object> fieldValues, ParseContext parseContext, StringBuilder capture, string otherSeparator, Func<List<object>, ParseContext, bool> otherSeparatorHandler) { var startIndex = capture.Length - parseContext.SeparatorLength - token.Value.Length; if (otherSeparator.Length > 0) { if (capture.Length - startIndex < otherSeparator.Length) { return HandleFailureToMatchEitherSeparator(parseContext, capture, startIndex); } var potentialSeparator = capture.ToString(startIndex, otherSeparator.Length); if (potentialSeparator.Equals(otherSeparator)) { // pushback to the start of the separator var contentLength = capture.Length - startIndex - otherSeparator.Length; if (contentLength > 0) { _streamTokenizer.PushBack(capture.ToString(startIndex + otherSeparator.Length, contentLength)); } capture.Length = startIndex; return otherSeparatorHandler(fieldValues, parseContext); } } return HandleFailureToMatchEitherSeparator(parseContext, capture, startIndex); }
private bool ContinueCollectRecordSeparator(Token token, List<object> fieldValues, ParseContext parseContext) { var capture = parseContext.Capture; capture.Append(token.Value); if (!(token is SpecialToken)) { return HandleFailureToMatchExpectedSeparator(token, fieldValues, parseContext, capture, parseContext.FieldSeparator, HandleFieldSeparator); } var recordSeparator = parseContext.RecordSeparator; if (recordSeparator.Length.Equals(parseContext.SeparatorLength + 1)) { var separatorStartIndex = capture.Length - recordSeparator.Length; var potentialSeparator = capture.ToString(separatorStartIndex, recordSeparator.Length); if (potentialSeparator.Equals(recordSeparator)) { capture.Length = separatorStartIndex; return HandleRecordSeparator(fieldValues, parseContext); } return HandleFailureToMatchExpectedSeparator(token, fieldValues, parseContext, capture, parseContext.FieldSeparator, HandleFieldSeparator); } parseContext.SeparatorLength++; return false; }
private bool BranchReadEscapedQuoteOrStartCollectingSeparator(Token token, List<object> fieldValues, ParseContext parseContext) { if (token is SpecialToken) { var ch = token.First; if (token.Length.Equals(1) && ch.Equals('"')) { parseContext.Capture.Append(ch); parseContext.Handle = ReadQuotedField; } else { var fieldSeparator = parseContext.FieldSeparator; if (fieldSeparator.Length > 0 && ch.Equals(fieldSeparator[0])) { return StartCollectingFieldSeparator(token, fieldValues, parseContext); } var recordSeparator = parseContext.RecordSeparator; if (recordSeparator.Length > 0 && ch.Equals(recordSeparator[0])) { return StartCollectingRecordSeparator(token, fieldValues, parseContext); } ThrowUnescapedQuoteException(parseContext); } } else if (token is DataToken) { ThrowUnescapedQuoteException(parseContext); } return false; }