code: private int readNextToken(final char[] srcChars, int start, final int len, final StrBuilder workArea, final List<String> tokenList) {
          // skip all leading whitespace, unless it is the
          // field delimiter or the quote character
          while (start < len) {
              final int removeLen = Math.max(
                      getIgnoredMatcher().isMatch(srcChars, start, start, len),
                      getTrimmerMatcher().isMatch(srcChars, start, start, len));
              if (removeLen == 0 ||
                  getDelimiterMatcher().isMatch(srcChars, start, start, len) > 0 ||
                  getQuoteMatcher().isMatch(srcChars, start, start, len) > 0) {
                  break;
              }
              start += removeLen;
          }
  
          // handle reaching end
          if (start >= len) {
              addToken(tokenList, StringUtils.EMPTY);
              return -1;
          }
  
          // handle empty token
          final int delimLen = getDelimiterMatcher().isMatch(srcChars, start, start, len);
          if (delimLen > 0) {
              addToken(tokenList, StringUtils.EMPTY);
              return start + delimLen;
          }
  
          // handle found token
          final int quoteLen = getQuoteMatcher().isMatch(srcChars, start, start, len);
          if (quoteLen > 0) {
              return readWithQuotes(srcChars, start + quoteLen, len, workArea, tokenList, start, quoteLen);
          }
          return readWithQuotes(srcChars, start, len, workArea, tokenList, 0, 0);
      }
docs: Reads character by character through the String to get the next token.
  
  @param srcChars  the character array being tokenized
  @param start  the first character of field
  @param len  the length of the character array being tokenized
  @param workArea  a temporary work area
  @param tokenList  the list of parsed tokens
  @return the starting position of the next field (the character
  immediately after the delimiter), or -1 if end of string found