in src/main/java/org/apache/commons/csv/Lexer.java [336:390]
private Token parseEncapsulatedToken(final Token token) throws IOException {
token.isQuoted = true;
// Save current line number in case needed for IOE
final long startLineNumber = getCurrentLineNumber();
int c;
while (true) {
c = reader.read();
if (isQuoteChar(c)) {
if (isQuoteChar(reader.peek())) {
// double or escaped encapsulator -> add single encapsulator to token
c = reader.read();
token.content.append((char) c);
} else {
// token finish mark (encapsulator) reached: ignore whitespace till delimiter
while (true) {
c = reader.read();
if (isDelimiter(c)) {
token.type = Token.Type.TOKEN;
return token;
}
if (isEndOfFile(c)) {
token.type = Token.Type.EOF;
token.isReady = true; // There is data at EOF
return token;
}
if (readEndOfLine(c)) {
token.type = Token.Type.EORECORD;
return token;
}
if (trailingData) {
token.content.append((char) c);
} else if (!Character.isWhitespace((char) c)) {
// error invalid char between token and next delimiter
throw new CSVException("Invalid character between encapsulated token and delimiter at line: %,d, position: %,d",
getCurrentLineNumber(), getCharacterPosition());
}
}
}
} else if (isEscape(c)) {
appendNextEscapedCharacterToToken(token);
} else if (isEndOfFile(c)) {
if (lenientEof) {
token.type = Token.Type.EOF;
token.isReady = true; // There is data at EOF
return token;
}
// error condition (end of file before end of token)
throw new CSVException("(startline %,d) EOF reached before encapsulated token finished", startLineNumber);
} else {
// consume character
token.content.append((char) c);
}
}
}