mirror of
https://github.com/apache/commons-csv.git
synced 2025-02-08 02:59:26 +00:00
Bump commons-parent from 69 to 70
Fix PMD issues for port to PMD 7.1.0
This commit is contained in:
parent
bef059b932
commit
a36d5bcbb1
5
pom.xml
5
pom.xml
@ -20,7 +20,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-parent</artifactId>
|
||||
<version>69</version>
|
||||
<version>70</version>
|
||||
</parent>
|
||||
<artifactId>commons-csv</artifactId>
|
||||
<version>1.11.1-SNAPSHOT</version>
|
||||
@ -216,9 +216,6 @@
|
||||
<configuration>
|
||||
<targetJdk>${maven.compiler.target}</targetJdk>
|
||||
<skipEmptyReport>false</skipEmptyReport>
|
||||
<rulesets>
|
||||
<ruleset>${basedir}/src/site/resources/pmd/pmd-ruleset.xml</ruleset>
|
||||
</rulesets>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!-- We need to add our test data files to rat exclusions -->
|
||||
|
@ -43,8 +43,10 @@
|
||||
<release version="1.11.1" date="YYYY-MM-DD" description="Feature and bug fix release (Java 8 or above)">
|
||||
<!-- ADD -->
|
||||
<!-- FIX -->
|
||||
<action type="update" dev="ggregory" due-to="Gary Gregory">Fix PMD issues for port to PMD 7.1.0.</action>
|
||||
<!-- UPDATE -->
|
||||
<action type="update" dev="ggregory" due-to="Dependabot">Bump commons-codec:commons-codec from 1.16.1 to 1.17.0 #422.</action>
|
||||
<action type="update" dev="ggregory" due-to="Gary Gregory">Bump commons-parent from 69 to 70.</action>
|
||||
</release>
|
||||
<release version="1.11.0" date="2024-04-28" description="Feature and bug fix release (Java 8 or above)">
|
||||
<!-- ADD -->
|
||||
|
@ -17,17 +17,6 @@
|
||||
|
||||
package org.apache.commons.csv;
|
||||
|
||||
import static org.apache.commons.csv.Constants.BACKSLASH;
|
||||
import static org.apache.commons.csv.Constants.COMMA;
|
||||
import static org.apache.commons.csv.Constants.COMMENT;
|
||||
import static org.apache.commons.csv.Constants.CR;
|
||||
import static org.apache.commons.csv.Constants.CRLF;
|
||||
import static org.apache.commons.csv.Constants.DOUBLE_QUOTE_CHAR;
|
||||
import static org.apache.commons.csv.Constants.EMPTY;
|
||||
import static org.apache.commons.csv.Constants.LF;
|
||||
import static org.apache.commons.csv.Constants.PIPE;
|
||||
import static org.apache.commons.csv.Constants.SP;
|
||||
import static org.apache.commons.csv.Constants.TAB;
|
||||
import static org.apache.commons.io.IOUtils.EOF;
|
||||
|
||||
import java.io.File;
|
||||
@ -203,7 +192,7 @@ public final class CSVFormat implements Serializable {
|
||||
* @return a copy of the builder
|
||||
*/
|
||||
public static Builder create() {
|
||||
return new Builder(CSVFormat.DEFAULT);
|
||||
return new Builder(DEFAULT);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -850,57 +839,57 @@ public final class CSVFormat implements Serializable {
|
||||
/**
|
||||
* @see CSVFormat#DEFAULT
|
||||
*/
|
||||
Default(CSVFormat.DEFAULT),
|
||||
Default(DEFAULT),
|
||||
|
||||
/**
|
||||
* @see CSVFormat#EXCEL
|
||||
*/
|
||||
Excel(CSVFormat.EXCEL),
|
||||
Excel(EXCEL),
|
||||
|
||||
/**
|
||||
* @see CSVFormat#INFORMIX_UNLOAD
|
||||
* @since 1.3
|
||||
*/
|
||||
InformixUnload(CSVFormat.INFORMIX_UNLOAD),
|
||||
InformixUnload(INFORMIX_UNLOAD),
|
||||
|
||||
/**
|
||||
* @see CSVFormat#INFORMIX_UNLOAD_CSV
|
||||
* @since 1.3
|
||||
*/
|
||||
InformixUnloadCsv(CSVFormat.INFORMIX_UNLOAD_CSV),
|
||||
InformixUnloadCsv(INFORMIX_UNLOAD_CSV),
|
||||
|
||||
/**
|
||||
* @see CSVFormat#MONGODB_CSV
|
||||
* @since 1.7
|
||||
*/
|
||||
MongoDBCsv(CSVFormat.MONGODB_CSV),
|
||||
MongoDBCsv(MONGODB_CSV),
|
||||
|
||||
/**
|
||||
* @see CSVFormat#MONGODB_TSV
|
||||
* @since 1.7
|
||||
*/
|
||||
MongoDBTsv(CSVFormat.MONGODB_TSV),
|
||||
MongoDBTsv(MONGODB_TSV),
|
||||
|
||||
/**
|
||||
* @see CSVFormat#MYSQL
|
||||
*/
|
||||
MySQL(CSVFormat.MYSQL),
|
||||
MySQL(MYSQL),
|
||||
|
||||
/**
|
||||
* @see CSVFormat#ORACLE
|
||||
*/
|
||||
Oracle(CSVFormat.ORACLE),
|
||||
Oracle(ORACLE),
|
||||
|
||||
/**
|
||||
* @see CSVFormat#POSTGRESQL_CSV
|
||||
* @since 1.5
|
||||
*/
|
||||
PostgreSQLCsv(CSVFormat.POSTGRESQL_CSV),
|
||||
PostgreSQLCsv(POSTGRESQL_CSV),
|
||||
|
||||
/**
|
||||
* @see CSVFormat#POSTGRESQL_CSV
|
||||
*/
|
||||
PostgreSQLText(CSVFormat.POSTGRESQL_TEXT),
|
||||
PostgreSQLText(POSTGRESQL_TEXT),
|
||||
|
||||
/**
|
||||
* @see CSVFormat#RFC4180
|
||||
@ -945,8 +934,8 @@ public final class CSVFormat implements Serializable {
|
||||
*
|
||||
* @see Predefined#Default
|
||||
*/
|
||||
public static final CSVFormat DEFAULT = new CSVFormat(COMMA, DOUBLE_QUOTE_CHAR, null, null, null, false, true, CRLF, null, null, null, false, false, false,
|
||||
false, false, false, DuplicateHeaderMode.ALLOW_ALL, false, false);
|
||||
public static final CSVFormat DEFAULT = new CSVFormat(Constants.COMMA, Constants.DOUBLE_QUOTE_CHAR, null, null, null, false, true, Constants.CRLF, null,
|
||||
null, null, false, false, false, false, false, false, DuplicateHeaderMode.ALLOW_ALL, false, false);
|
||||
|
||||
/**
|
||||
* Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale-dependent, it might be necessary
|
||||
@ -1014,10 +1003,10 @@ public final class CSVFormat implements Serializable {
|
||||
*/
|
||||
// @formatter:off
|
||||
public static final CSVFormat INFORMIX_UNLOAD = DEFAULT.builder()
|
||||
.setDelimiter(PIPE)
|
||||
.setEscape(BACKSLASH)
|
||||
.setQuote(DOUBLE_QUOTE_CHAR)
|
||||
.setRecordSeparator(LF)
|
||||
.setDelimiter(Constants.PIPE)
|
||||
.setEscape(Constants.BACKSLASH)
|
||||
.setQuote(Constants.DOUBLE_QUOTE_CHAR)
|
||||
.setRecordSeparator(Constants.LF)
|
||||
.build();
|
||||
// @formatter:on
|
||||
|
||||
@ -1045,9 +1034,9 @@ public final class CSVFormat implements Serializable {
|
||||
*/
|
||||
// @formatter:off
|
||||
public static final CSVFormat INFORMIX_UNLOAD_CSV = DEFAULT.builder()
|
||||
.setDelimiter(COMMA)
|
||||
.setQuote(DOUBLE_QUOTE_CHAR)
|
||||
.setRecordSeparator(LF)
|
||||
.setDelimiter(Constants.COMMA)
|
||||
.setQuote(Constants.DOUBLE_QUOTE_CHAR)
|
||||
.setRecordSeparator(Constants.LF)
|
||||
.build();
|
||||
// @formatter:on
|
||||
|
||||
@ -1085,9 +1074,9 @@ public final class CSVFormat implements Serializable {
|
||||
*/
|
||||
// @formatter:off
|
||||
public static final CSVFormat MONGODB_CSV = DEFAULT.builder()
|
||||
.setDelimiter(COMMA)
|
||||
.setEscape(DOUBLE_QUOTE_CHAR)
|
||||
.setQuote(DOUBLE_QUOTE_CHAR)
|
||||
.setDelimiter(Constants.COMMA)
|
||||
.setEscape(Constants.DOUBLE_QUOTE_CHAR)
|
||||
.setQuote(Constants.DOUBLE_QUOTE_CHAR)
|
||||
.setQuoteMode(QuoteMode.MINIMAL)
|
||||
.setSkipHeaderRecord(false)
|
||||
.build();
|
||||
@ -1122,9 +1111,9 @@ public final class CSVFormat implements Serializable {
|
||||
*/
|
||||
// @formatter:off
|
||||
public static final CSVFormat MONGODB_TSV = DEFAULT.builder()
|
||||
.setDelimiter(TAB)
|
||||
.setEscape(DOUBLE_QUOTE_CHAR)
|
||||
.setQuote(DOUBLE_QUOTE_CHAR)
|
||||
.setDelimiter(Constants.TAB)
|
||||
.setEscape(Constants.DOUBLE_QUOTE_CHAR)
|
||||
.setQuote(Constants.DOUBLE_QUOTE_CHAR)
|
||||
.setQuoteMode(QuoteMode.MINIMAL)
|
||||
.setSkipHeaderRecord(false)
|
||||
.build();
|
||||
@ -1157,11 +1146,11 @@ public final class CSVFormat implements Serializable {
|
||||
*/
|
||||
// @formatter:off
|
||||
public static final CSVFormat MYSQL = DEFAULT.builder()
|
||||
.setDelimiter(TAB)
|
||||
.setEscape(BACKSLASH)
|
||||
.setDelimiter(Constants.TAB)
|
||||
.setEscape(Constants.BACKSLASH)
|
||||
.setIgnoreEmptyLines(false)
|
||||
.setQuote(null)
|
||||
.setRecordSeparator(LF)
|
||||
.setRecordSeparator(Constants.LF)
|
||||
.setNullString(Constants.SQL_NULL_STRING)
|
||||
.setQuoteMode(QuoteMode.ALL_NON_NULL)
|
||||
.build();
|
||||
@ -1196,10 +1185,10 @@ public final class CSVFormat implements Serializable {
|
||||
*/
|
||||
// @formatter:off
|
||||
public static final CSVFormat ORACLE = DEFAULT.builder()
|
||||
.setDelimiter(COMMA)
|
||||
.setEscape(BACKSLASH)
|
||||
.setDelimiter(Constants.COMMA)
|
||||
.setEscape(Constants.BACKSLASH)
|
||||
.setIgnoreEmptyLines(false)
|
||||
.setQuote(DOUBLE_QUOTE_CHAR)
|
||||
.setQuote(Constants.DOUBLE_QUOTE_CHAR)
|
||||
.setNullString(Constants.SQL_NULL_STRING)
|
||||
.setTrim(true)
|
||||
.setRecordSeparator(System.lineSeparator())
|
||||
@ -1235,12 +1224,12 @@ public final class CSVFormat implements Serializable {
|
||||
*/
|
||||
// @formatter:off
|
||||
public static final CSVFormat POSTGRESQL_CSV = DEFAULT.builder()
|
||||
.setDelimiter(COMMA)
|
||||
.setDelimiter(Constants.COMMA)
|
||||
.setEscape(null)
|
||||
.setIgnoreEmptyLines(false)
|
||||
.setQuote(DOUBLE_QUOTE_CHAR)
|
||||
.setRecordSeparator(LF)
|
||||
.setNullString(EMPTY)
|
||||
.setQuote(Constants.DOUBLE_QUOTE_CHAR)
|
||||
.setRecordSeparator(Constants.LF)
|
||||
.setNullString(Constants.EMPTY)
|
||||
.setQuoteMode(QuoteMode.ALL_NON_NULL)
|
||||
.build();
|
||||
// @formatter:off
|
||||
@ -1273,11 +1262,11 @@ public final class CSVFormat implements Serializable {
|
||||
*/
|
||||
// @formatter:off
|
||||
public static final CSVFormat POSTGRESQL_TEXT = DEFAULT.builder()
|
||||
.setDelimiter(TAB)
|
||||
.setEscape(BACKSLASH)
|
||||
.setDelimiter(Constants.TAB)
|
||||
.setEscape(Constants.BACKSLASH)
|
||||
.setIgnoreEmptyLines(false)
|
||||
.setQuote(null)
|
||||
.setRecordSeparator(LF)
|
||||
.setRecordSeparator(Constants.LF)
|
||||
.setNullString(Constants.SQL_NULL_STRING)
|
||||
.setQuoteMode(QuoteMode.ALL_NON_NULL)
|
||||
.build();
|
||||
@ -1319,7 +1308,7 @@ public final class CSVFormat implements Serializable {
|
||||
*/
|
||||
// @formatter:off
|
||||
public static final CSVFormat TDF = DEFAULT.builder()
|
||||
.setDelimiter(TAB)
|
||||
.setDelimiter(Constants.TAB)
|
||||
.setIgnoreSurroundingSpaces(true)
|
||||
.build();
|
||||
// @formatter:on
|
||||
@ -1356,7 +1345,7 @@ public final class CSVFormat implements Serializable {
|
||||
* @return true if {@code c} contains a line break character.
|
||||
*/
|
||||
private static boolean containsLineBreak(final String source) {
|
||||
return contains(source, CR) || contains(source, LF);
|
||||
return contains(source, Constants.CR) || contains(source, Constants.LF);
|
||||
}
|
||||
|
||||
static boolean isBlank(final String value) {
|
||||
@ -1371,7 +1360,7 @@ public final class CSVFormat implements Serializable {
|
||||
* @return true if {@code c} is a line break character.
|
||||
*/
|
||||
private static boolean isLineBreak(final char c) {
|
||||
return c == LF || c == CR;
|
||||
return c == Constants.LF || c == Constants.CR;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1387,7 +1376,7 @@ public final class CSVFormat implements Serializable {
|
||||
|
||||
/** Same test as in as {@link String#trim()}. */
|
||||
private static boolean isTrimChar(final char ch) {
|
||||
return ch <= SP;
|
||||
return ch <= Constants.SP;
|
||||
}
|
||||
|
||||
/** Same test as in as {@link String#trim()}. */
|
||||
@ -2121,7 +2110,7 @@ public final class CSVFormat implements Serializable {
|
||||
if (value == null) {
|
||||
// https://issues.apache.org/jira/browse/CSV-203
|
||||
if (null == nullString) {
|
||||
charSequence = EMPTY;
|
||||
charSequence = Constants.EMPTY;
|
||||
} else if (QuoteMode.ALL == quoteMode) {
|
||||
charSequence = quotedNullString;
|
||||
} else {
|
||||
@ -2259,8 +2248,8 @@ public final class CSVFormat implements Serializable {
|
||||
while (pos < end) {
|
||||
char c = charSeq.charAt(pos);
|
||||
final boolean isDelimiterStart = isDelimiter(c, charSeq, pos, delimArray, delimLength);
|
||||
final boolean isCr = c == CR;
|
||||
final boolean isLf = c == LF;
|
||||
final boolean isCr = c == Constants.CR;
|
||||
final boolean isLf = c == Constants.LF;
|
||||
if (isCr || isLf || c == escape || isDelimiterStart) {
|
||||
// write out segment up until this char
|
||||
if (pos > start) {
|
||||
@ -2308,8 +2297,8 @@ public final class CSVFormat implements Serializable {
|
||||
Arrays.fill(lookAheadBuffer, (char) 0);
|
||||
final String test = builder.toString() + new String(bufferedReader.lookAhead(lookAheadBuffer));
|
||||
final boolean isDelimiterStart = isDelimiter((char) c, test, pos, delimArray, delimLength);
|
||||
final boolean isCr = c == CR;
|
||||
final boolean isLf = c == LF;
|
||||
final boolean isCr = c == Constants.CR;
|
||||
final boolean isLf = c == Constants.LF;
|
||||
if (isCr || isLf || c == escape || isDelimiterStart) {
|
||||
// write out segment up until this char
|
||||
if (pos > start) {
|
||||
@ -2381,7 +2370,7 @@ public final class CSVFormat implements Serializable {
|
||||
}
|
||||
} else {
|
||||
char c = charSeq.charAt(pos);
|
||||
if (c <= COMMENT) {
|
||||
if (c <= Constants.COMMENT) {
|
||||
// Some other chars at the start of a value caused the parser to fail, so for now
|
||||
// encapsulate if we start in anything less than '#'. We are being conservative
|
||||
// by including the default comment char too.
|
||||
@ -2389,7 +2378,7 @@ public final class CSVFormat implements Serializable {
|
||||
} else {
|
||||
while (pos < len) {
|
||||
c = charSeq.charAt(pos);
|
||||
if (c == LF || c == CR || c == quoteChar || c == escapeChar || isDelimiter(c, charSeq, pos, delim, delimLength)) {
|
||||
if (c == Constants.LF || c == Constants.CR || c == quoteChar || c == escapeChar || isDelimiter(c, charSeq, pos, delim, delimLength)) {
|
||||
quote = true;
|
||||
break;
|
||||
}
|
||||
|
@ -17,16 +17,6 @@
|
||||
|
||||
package org.apache.commons.csv;
|
||||
|
||||
import static org.apache.commons.csv.Constants.BACKSPACE;
|
||||
import static org.apache.commons.csv.Constants.CR;
|
||||
import static org.apache.commons.csv.Constants.FF;
|
||||
import static org.apache.commons.csv.Constants.LF;
|
||||
import static org.apache.commons.csv.Constants.TAB;
|
||||
import static org.apache.commons.csv.Constants.UNDEFINED;
|
||||
import static org.apache.commons.csv.Token.Type.COMMENT;
|
||||
import static org.apache.commons.csv.Token.Type.EORECORD;
|
||||
import static org.apache.commons.csv.Token.Type.INVALID;
|
||||
import static org.apache.commons.csv.Token.Type.TOKEN;
|
||||
import static org.apache.commons.io.IOUtils.EOF;
|
||||
|
||||
import java.io.Closeable;
|
||||
@ -37,8 +27,8 @@ import java.io.IOException;
|
||||
*/
|
||||
final class Lexer implements Closeable {
|
||||
|
||||
private static final String CR_STRING = Character.toString(CR);
|
||||
private static final String LF_STRING = Character.toString(LF);
|
||||
private static final String CR_STRING = Character.toString(Constants.CR);
|
||||
private static final String LF_STRING = Character.toString(Constants.LF);
|
||||
|
||||
/**
|
||||
* Constant char to use for disabling comments, escapes, and encapsulation. The value -2 is used because it
|
||||
@ -202,7 +192,7 @@ final class Lexer implements Closeable {
|
||||
* @return true if the character is at the start of a line.
|
||||
*/
|
||||
boolean isStartOfLine(final int ch) {
|
||||
return ch == LF || ch == CR || ch == UNDEFINED;
|
||||
return ch == Constants.LF || ch == Constants.CR || ch == Constants.UNDEFINED;
|
||||
}
|
||||
|
||||
private char mapNullToDisabled(final Character c) {
|
||||
@ -257,11 +247,11 @@ final class Lexer implements Closeable {
|
||||
}
|
||||
final String comment = line.trim();
|
||||
token.content.append(comment);
|
||||
token.type = COMMENT;
|
||||
token.type = Token.Type.COMMENT;
|
||||
return token;
|
||||
}
|
||||
// Important: make sure a new char gets consumed in each iteration
|
||||
while (token.type == INVALID) {
|
||||
while (token.type == Token.Type.INVALID) {
|
||||
// ignore whitespaces at beginning of a token
|
||||
if (ignoreSurroundingSpaces) {
|
||||
while (Character.isWhitespace((char) c) && !isDelimiter(c) && !eol) {
|
||||
@ -272,11 +262,11 @@ final class Lexer implements Closeable {
|
||||
// ok, start of token reached: encapsulated, or token
|
||||
if (isDelimiter(c)) {
|
||||
// empty token return TOKEN("")
|
||||
token.type = TOKEN;
|
||||
token.type = Token.Type.TOKEN;
|
||||
} else if (eol) {
|
||||
// empty token return EORECORD("")
|
||||
// noop: token.content.append("");
|
||||
token.type = EORECORD;
|
||||
token.type = Token.Type.EORECORD;
|
||||
} else if (isQuoteChar(c)) {
|
||||
// consume encapsulated token
|
||||
parseEncapsulatedToken(token);
|
||||
@ -334,7 +324,7 @@ final class Lexer implements Closeable {
|
||||
while (true) {
|
||||
c = reader.read();
|
||||
if (isDelimiter(c)) {
|
||||
token.type = TOKEN;
|
||||
token.type = Token.Type.TOKEN;
|
||||
return token;
|
||||
}
|
||||
if (isEndOfFile(c)) {
|
||||
@ -343,7 +333,7 @@ final class Lexer implements Closeable {
|
||||
return token;
|
||||
}
|
||||
if (readEndOfLine(c)) {
|
||||
token.type = EORECORD;
|
||||
token.type = Token.Type.EORECORD;
|
||||
return token;
|
||||
}
|
||||
if (trailingData) {
|
||||
@ -406,7 +396,7 @@ final class Lexer implements Closeable {
|
||||
// Faster to use while(true)+break than while(token.type == INVALID)
|
||||
while (true) {
|
||||
if (readEndOfLine(ch)) {
|
||||
token.type = EORECORD;
|
||||
token.type = Token.Type.EORECORD;
|
||||
break;
|
||||
}
|
||||
if (isEndOfFile(ch)) {
|
||||
@ -415,7 +405,7 @@ final class Lexer implements Closeable {
|
||||
break;
|
||||
}
|
||||
if (isDelimiter(ch)) {
|
||||
token.type = TOKEN;
|
||||
token.type = Token.Type.TOKEN;
|
||||
break;
|
||||
}
|
||||
// continue
|
||||
@ -450,7 +440,7 @@ final class Lexer implements Closeable {
|
||||
*/
|
||||
boolean readEndOfLine(int ch) throws IOException {
|
||||
// check if we have \r\n...
|
||||
if (ch == CR && reader.lookAhead() == LF) {
|
||||
if (ch == Constants.CR && reader.lookAhead() == Constants.LF) {
|
||||
// note: does not change ch outside of this method!
|
||||
ch = reader.read();
|
||||
// Save the EOL state
|
||||
@ -460,14 +450,14 @@ final class Lexer implements Closeable {
|
||||
}
|
||||
// save EOL state here.
|
||||
if (firstEol == null) {
|
||||
if (ch == LF) {
|
||||
if (ch == Constants.LF) {
|
||||
this.firstEol = LF_STRING;
|
||||
} else if (ch == CR) {
|
||||
} else if (ch == Constants.CR) {
|
||||
this.firstEol = CR_STRING;
|
||||
}
|
||||
}
|
||||
|
||||
return ch == LF || ch == CR;
|
||||
return ch == Constants.LF || ch == Constants.CR;
|
||||
}
|
||||
|
||||
// TODO escape handling needs more work
|
||||
@ -487,20 +477,20 @@ final class Lexer implements Closeable {
|
||||
final int ch = reader.read();
|
||||
switch (ch) {
|
||||
case 'r':
|
||||
return CR;
|
||||
return Constants.CR;
|
||||
case 'n':
|
||||
return LF;
|
||||
return Constants.LF;
|
||||
case 't':
|
||||
return TAB;
|
||||
return Constants.TAB;
|
||||
case 'b':
|
||||
return BACKSPACE;
|
||||
return Constants.BACKSPACE;
|
||||
case 'f':
|
||||
return FF;
|
||||
case CR:
|
||||
case LF:
|
||||
case FF: // TODO is this correct?
|
||||
case TAB: // TODO is this correct? Do tabs need to be escaped?
|
||||
case BACKSPACE: // TODO is this correct?
|
||||
return Constants.FF;
|
||||
case Constants.CR:
|
||||
case Constants.LF:
|
||||
case Constants.FF: // TODO is this correct?
|
||||
case Constants.TAB: // TODO is this correct? Do tabs need to be escaped?
|
||||
case Constants.BACKSPACE: // TODO is this correct?
|
||||
return ch;
|
||||
case EOF:
|
||||
throw new IOException("EOF whilst processing escape sequence");
|
||||
|
Loading…
x
Reference in New Issue
Block a user