예제 #1
0
 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;
 }
예제 #2
0
        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);
        }
예제 #3
0
        private bool StartCollectingRecordSeparator(Token token, List<object> fieldValues, ParseContext parseContext)
        {
            parseContext.SeparatorLength = 0;
            parseContext.Handle = ContinueCollectRecordSeparator;

            return ContinueCollectRecordSeparator(token, fieldValues, parseContext);
        }
예제 #4
0
 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;
 }
예제 #5
0
 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;
 }
예제 #6
0
        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);
        }
예제 #7
0
        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;
        }
예제 #8
0
        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;
        }