ChangeLog:
2006-07-21 Ito Kazumitsu <[EMAIL PROTECTED]>
Fixes bug #28413
* gnu/java/util/regex/RETokenEnd.java(check_java_line_terminators):
New field.
(RETokenEnd): New constructer to set check_java_line_terminators.
(matchThis): Checck line terminators if check_java_line_terminators.
* gnu/java/util/regex/RETokenStart.java: Likewise.
* gnu/regexp/RE.java(initialize): Use the new constructors for
RETokenEnd and RETokenStart if REG_MULTILINE is set.
* java/util/regex/Pattern.java(Patteren): Changed so that
gnu/regexp/RE.java may use the new the new constructors.
Index: classpath/gnu/java/util/regex/RE.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/util/regex/RE.java,v
retrieving revision 1.2
diff -u -r1.2 RE.java
--- classpath/gnu/java/util/regex/RE.java 19 Jul 2006 19:47:07 -0000
1.2
+++ classpath/gnu/java/util/regex/RE.java 21 Jul 2006 17:44:23 -0000
@@ -750,7 +750,20 @@
else if ((unit.ch == '^') && !(unit.bk || quot)) {
addToken(currentToken);
currentToken = null;
- addToken(new RETokenStart(subIndex,((cflags & REG_MULTILINE) > 0) ?
syntax.getLineSeparator() : null));
+ RETokenStart token = null;
+ if ((cflags & REG_MULTILINE) > 0) {
+ String sep = syntax.getLineSeparator();
+ if (sep == null) {
+ token = new RETokenStart(subIndex, null, true);
+ }
+ else {
+ token = new RETokenStart(subIndex, sep);
+ }
+ }
+ else {
+ token = new RETokenStart(subIndex, null);
+ }
+ addToken(token);
}
// END OF LINE OPERATOR
@@ -759,7 +772,20 @@
else if ((unit.ch == '$') && !(unit.bk || quot)) {
addToken(currentToken);
currentToken = null;
- addToken(new RETokenEnd(subIndex,((cflags & REG_MULTILINE) > 0) ?
syntax.getLineSeparator() : null));
+ RETokenEnd token = null;
+ if ((cflags & REG_MULTILINE) > 0) {
+ String sep = syntax.getLineSeparator();
+ if (sep == null) {
+ token = new RETokenEnd(subIndex, null, true);
+ }
+ else {
+ token = new RETokenEnd(subIndex, sep);
+ }
+ }
+ else {
+ token = new RETokenEnd(subIndex, null);
+ }
+ addToken(token);
}
// MATCH-ANY-CHARACTER OPERATOR (except possibly newline and null)
Index: classpath/gnu/java/util/regex/RETokenEnd.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/util/regex/RETokenEnd.java,v
retrieving revision 1.1
diff -u -r1.1 RETokenEnd.java
--- classpath/gnu/java/util/regex/RETokenEnd.java 7 Jun 2006 19:30:06
-0000 1.1
+++ classpath/gnu/java/util/regex/RETokenEnd.java 21 Jul 2006 17:44:23
-0000
@@ -43,10 +43,18 @@
* Indicates whether this token should match on a line break.
*/
private String newline;
+ private boolean check_java_line_terminators;
RETokenEnd(int subIndex,String newline) {
super(subIndex);
this.newline = newline;
+ this.check_java_line_terminators = false;
+ }
+
+ RETokenEnd(int subIndex, String newline, boolean b) {
+ super(subIndex);
+ this.newline = newline;
+ this.check_java_line_terminators = b;
}
int getMaximumLength() {
@@ -58,6 +66,18 @@
if (ch == CharIndexed.OUT_OF_BOUNDS)
return ((mymatch.eflags & RE.REG_NOTEOL)>0) ?
null : mymatch;
+ if (check_java_line_terminators) {
+ if (ch == '\n') {
+ char ch1 = input.charAt(mymatch.index - 1);
+ if (ch1 == '\r') return null;
+ return mymatch;
+ }
+ if (ch == '\r') return mymatch;
+ if (ch == '\u0085') return mymatch; // A next-line character
+ if (ch == '\u2028') return mymatch; // A line-separator character
+ if (ch == '\u2029') return mymatch; // A paragraph-separator
character
+ return null;
+ }
if (newline != null) {
char z;
int i = 0; // position in newline
Index: classpath/gnu/java/util/regex/RETokenStart.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/util/regex/RETokenStart.java,v
retrieving revision 1.1
diff -u -r1.1 RETokenStart.java
--- classpath/gnu/java/util/regex/RETokenStart.java 7 Jun 2006 19:30:06
-0000 1.1
+++ classpath/gnu/java/util/regex/RETokenStart.java 21 Jul 2006 17:44:23
-0000
@@ -39,10 +39,18 @@
class RETokenStart extends REToken {
private String newline; // matches after a newline
+ private boolean check_java_line_terminators;
RETokenStart(int subIndex, String newline) {
super(subIndex);
this.newline = newline;
+ this.check_java_line_terminators = false;
+ }
+
+ RETokenStart(int subIndex, String newline, boolean b) {
+ super(subIndex);
+ this.newline = newline;
+ this.check_java_line_terminators = b;
}
int getMaximumLength() {
@@ -53,6 +61,21 @@
// charAt(index-n) may be unknown on a Reader/InputStream. FIXME
// Match after a newline if in multiline mode
+ if (check_java_line_terminators) {
+ char ch = input.charAt(mymatch.index - 1);
+ if (ch != CharIndexed.OUT_OF_BOUNDS) {
+ if (ch == '\n') return mymatch;
+ if (ch == '\r') {
+ char ch1 = input.charAt(mymatch.index);
+ if (ch1 != '\n') return mymatch;
+ return null;
+ }
+ if (ch == '\u0085') return mymatch; // A next-line character
+ if (ch == '\u2028') return mymatch; // A line-separator
character
+ if (ch == '\u2029') return mymatch; // A paragraph-separator
character
+ }
+ }
+
if (newline != null) {
int len = newline.length();
if (mymatch.offset >= len) {
Index: classpath/java/util/regex/Pattern.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/util/regex/Pattern.java,v
retrieving revision 1.17
diff -u -r1.17 Pattern.java
--- classpath/java/util/regex/Pattern.java 7 Jun 2006 19:30:06 -0000
1.17
+++ classpath/java/util/regex/Pattern.java 21 Jul 2006 17:44:23 -0000
@@ -73,12 +73,17 @@
this.regex = regex;
this.flags = flags;
+ RESyntax syntax = RESyntax.RE_SYNTAX_JAVA_1_4;
int gnuFlags = 0;
gnuFlags |= RE.REG_ICASE_USASCII;
if ((flags & CASE_INSENSITIVE) != 0)
gnuFlags |= RE.REG_ICASE;
if ((flags & MULTILINE) != 0)
- gnuFlags |= RE.REG_MULTILINE;
+ {
+ gnuFlags |= RE.REG_MULTILINE;
+ syntax = new RESyntax(syntax);
+ syntax.setLineSeparator(null);
+ }
if ((flags & DOTALL) != 0)
gnuFlags |= RE.REG_DOT_NEWLINE;
if ((flags & UNICODE_CASE) != 0)
@@ -86,7 +91,6 @@
// not yet supported:
// if ((flags & CANON_EQ) != 0) gnuFlags =
- RESyntax syntax = RESyntax.RE_SYNTAX_JAVA_1_4;
if ((flags & UNIX_LINES) != 0)
{
// Use a syntax set with \n for linefeeds?