private int readWithQuotes ( final char [ ] srcChars , final int start , final int len , final StrBuilder workArea , final List < String > tokenList , final int quoteStart , final int quoteLen ) { // Loop until we've found the end of the quoted // string or the end of the input workArea . clear ( ) ; int pos = start ; boolean quoting = quoteLen > 0 ; int trimStart = 0 ; while ( pos < len ) { // quoting mode can occur several times throughout a string // we must switch between quoting and non-quoting until we // encounter a non-quoted delimiter, or end of string if ( quoting ) { // In quoting mode // If we've found a quote character, see if it's // followed by a second quote. If so, then we need // to actually put the quote character into the token // rather than end the token. if ( isQuote ( srcChars , pos , len , quoteStart , quoteLen ) ) { if ( isQuote ( srcChars , pos + quoteLen , len , quoteStart , quoteLen ) ) { // matched pair of quotes, thus an escaped quote workArea . append ( srcChars , pos , quoteLen ) ; pos += quoteLen * 2 ; trimStart = workArea . size ( ) ; continue ; } // end of quoting quoting = false ; pos += quoteLen ; continue ; } // copy regular character from inside quotes workArea . append ( srcChars [ pos ++ ] ) ; trimStart = workArea . size ( ) ; } else { // Not in quoting mode // check for delimiter, and thus end of token final int delimLen = getDelimiterMatcher ( ) . isMatch ( srcChars , pos , start , len ) ; if ( delimLen > 0 ) { // return condition when end of token found addToken ( tokenList , workArea . substring ( 0 , trimStart ) ) ; return pos + delimLen ; } // check for quote, and thus back into quoting mode if ( quoteLen > 0 && isQuote ( srcChars , pos , len , quoteStart , quoteLen ) ) { quoting = true ; pos += quoteLen ; continue ; } // check for ignored (outside quotes), and ignore final int ignoredLen = getIgnoredMatcher ( ) . isMatch ( srcChars , pos , start , len ) ; if ( ignoredLen > 0 ) { pos += ignoredLen ; continue ; } // check for trimmed character // don't yet know if its at the end, so copy to workArea // use trimStart to keep track of trim at the end final int trimmedLen = getTrimmerMatcher ( ) . isMatch ( srcChars , pos , start , len ) ; if ( trimmedLen > 0 ) { workArea . append ( srcChars , pos , trimmedLen ) ; pos += trimmedLen ; continue ; } // copy regular character from outside quotes workArea . append ( srcChars [ pos ++ ] ) ; trimStart = workArea . size ( ) ; } } // return condition when end of string found addToken ( tokenList , workArea . substring ( 0 , trimStart ) ) ; return - 1 ; }
Reads a possibly quoted string token .