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;
}
}
|