Author: ggregory Date: Sat Oct 13 15:41:56 2012 New Revision: 1397863 URL: http://svn.apache.org/viewvc?rev=1397863&view=rev Log: [CSV-94] Lexer should only use char fields.
Modified: commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/Lexer.java Modified: commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/Lexer.java URL: http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/Lexer.java?rev=1397863&r1=1397862&r2=1397863&view=diff ============================================================================== --- commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/Lexer.java (original) +++ commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/Lexer.java Sat Oct 13 15:41:56 2012 @@ -32,10 +32,17 @@ import java.io.IOException; */ abstract class Lexer { - private final Character delimiter; - private final Character escape; - private final Character encapsulator; - private final Character commmentStart; + /** + * Constant char to be used for disabling comments, escapes and encapsulation. The value -2 is used because it + * won't be confused with an EOF signal (-1), and because the Unicode value {@code FFFE} would be encoded as two chars + * (using surrogates) and thus there should never be a collision with a real text char. + */ + private static final char DISABLED = '\ufffe'; + + private final char delimiter; + private final char escape; + private final char encapsulator; + private final char commmentStart; final boolean ignoreSurroundingSpaces; final boolean ignoreEmptyLines; @@ -49,13 +56,17 @@ abstract class Lexer { this.format = format; this.in = in; this.delimiter = format.getDelimiter(); - this.escape = format.getEscape(); - this.encapsulator = format.getEncapsulator(); - this.commmentStart = format.getCommentStart(); + this.escape = nullMeansDisabled(format.getEscape()); + this.encapsulator = nullMeansDisabled(format.getEncapsulator()); + this.commmentStart = nullMeansDisabled(format.getCommentStart()); this.ignoreSurroundingSpaces = format.getIgnoreSurroundingSpaces(); this.ignoreEmptyLines = format.getIgnoreEmptyLines(); } + private final char nullMeansDisabled(Character c) { + return c == null ? DISABLED : c.charValue(); + } + int getLineNumber() { return in.getLineNumber(); } @@ -137,14 +148,14 @@ abstract class Lexer { } boolean isEscape(final int c) { - return escape != null && c == escape; + return c == escape; } boolean isEncapsulator(final int c) { - return encapsulator != null && c == encapsulator; + return c == encapsulator; } boolean isCommentStart(final int c) { - return commmentStart != null && c == commmentStart; + return c == commmentStart; } }