Author: vgritsenko
Date: Wed Mar  7 07:37:42 2007
New Revision: 515613

URL: http://svn.apache.org/viewvc?view=rev&rev=515613
Log:
Fix bug #37275: RE incorrectly processes nested {n,m} closures

Modified:
    jakarta/regexp/trunk/build.xml
    jakarta/regexp/trunk/docs/RETest.txt
    jakarta/regexp/trunk/docs/applet.html
    jakarta/regexp/trunk/docs/changes.html
    jakarta/regexp/trunk/docs/index.html
    jakarta/regexp/trunk/docs/jakarta-regexp.jar
    jakarta/regexp/trunk/src/java/org/apache/regexp/RECompiler.java
    jakarta/regexp/trunk/xdocs/RETest.txt
    jakarta/regexp/trunk/xdocs/changes.xml

Modified: jakarta/regexp/trunk/build.xml
URL: 
http://svn.apache.org/viewvc/jakarta/regexp/trunk/build.xml?view=diff&rev=515613&r1=515612&r2=515613
==============================================================================
--- jakarta/regexp/trunk/build.xml (original)
+++ jakarta/regexp/trunk/build.xml Wed Mar  7 07:37:42 2007
@@ -215,6 +215,7 @@
                 style="${jakarta-site.dir}/xdocs/stylesheets/site.xsl"
                 includes="**/*.xml"
                 excludes="**/stylesheets/** empty.xml">
+          <param name="sitenav-path" 
expression="${basedir}/xdocs/stylesheets/site.xml"/>
         </xslt>
 
         <copy todir="${docs.dest}" filtering="no">
@@ -222,6 +223,7 @@
                 <include name="RETest.txt"/>
             </fileset>
         </copy>
+
         <copy tofile="${docs.dest}/jakarta-regexp.jar"
               file="${build.dir}/${final.name}.jar"/>
     </target>

Modified: jakarta/regexp/trunk/docs/RETest.txt
URL: 
http://svn.apache.org/viewvc/jakarta/regexp/trunk/docs/RETest.txt?view=diff&rev=515613&r1=515612&r2=515613
==============================================================================
--- jakarta/regexp/trunk/docs/RETest.txt (original)
+++ jakarta/regexp/trunk/docs/RETest.txt Wed Mar  7 07:37:42 2007
@@ -1516,3 +1516,22 @@
 [^\D\S]
 @0 1   _1AByz
 NO
+
+#225
+(a{1}){0,2}
+aa
+YES
+3
+aa
+a
+a
+
+#226
+(a{1,3}b){1,3}
+abaabaaab
+YES
+4
+abaabaaab
+ab
+aab
+aaab

Modified: jakarta/regexp/trunk/docs/applet.html
URL: 
http://svn.apache.org/viewvc/jakarta/regexp/trunk/docs/applet.html?view=diff&rev=515613&r1=515612&r2=515613
==============================================================================
--- jakarta/regexp/trunk/docs/applet.html (original)
+++ jakarta/regexp/trunk/docs/applet.html Wed Mar  7 07:37:42 2007
@@ -1,11 +1,12 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
 <html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
 <title>Jakarta Regexp - Jakarta Regexp Applet</title>
-<link rel="stylesheet" href="/style/style.css" type="text/css" />
-<meta name="author" value="Vadim Gritsenko" />
-<meta name="email" value="[EMAIL PROTECTED]" />
+<link rel="stylesheet" href="/style/style.css" type="text/css"/>
+<link rel="alternate" href="http://jakarta.apache.org/site/rss.xml"; 
type="application/rss+xml" title="Apache Jakarta News"/>
+<meta name="author" value="Vadim Gritsenko"/>
+<meta name="email" value="[EMAIL PROTECTED]"/>
 </head>
 <body>
 <table class="page-header" border="0" width="100%" cellspacing="0">
@@ -14,10 +15,14 @@
 <td colspan="2">
 <!--JAKARTA LOGO-->
 <a href="http://jakarta.apache.org/";>
-<img src="http://jakarta.apache.org/images/jakarta-logo.gif"; alt="The Jakarta 
Project" border="0" />
+<img src="http://jakarta.apache.org/images/jakarta-logo.gif"; alt="The Jakarta 
Project" border="0"/>
+</a>
+</td>
+<td align="right">
+<a href="http://apachecon.com/2007/EU/";>
+<img alt="ApacheCon Europe 2007" border="0" 
src="http://www.apache.org/ads/ApacheCon/2007-europe-234x60.png"/>
 </a>
 </td>
-<td />
 </tr>
 </table>
 <table border="0" width="100%" cellspacing="4">
@@ -91,18 +96,18 @@
 </div>
 </td>
 <!--RIGHT SIDE NAVIGATION-->
-<td class="right-navbar" valign="top" nowrap="nowrap" />
+<td class="right-navbar" valign="top" nowrap="nowrap"/>
 </tr>
 <!--FOOTER SEPARATOR-->
 <tr>
 <td colspan="3">
-<hr noshade="noshade" size="1" />
+<hr noshade="noshade" size="1"/>
 </td>
 </tr>
 <tr>
 <td colspan="3">
 <div class="page-footer">
-<em> Copyright &copy; 1999-2005, The Apache
+<em> Copyright &copy; 1999-2007, The Apache
                   Software Foundation. <a 
href="http://jakarta.apache.org/site/legal.html";>Legal information</a>. </em>
 </div>
 </td>

Modified: jakarta/regexp/trunk/docs/changes.html
URL: 
http://svn.apache.org/viewvc/jakarta/regexp/trunk/docs/changes.html?view=diff&rev=515613&r1=515612&r2=515613
==============================================================================
--- jakarta/regexp/trunk/docs/changes.html (original)
+++ jakarta/regexp/trunk/docs/changes.html Wed Mar  7 07:37:42 2007
@@ -1,13 +1,14 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
 <html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
 <title>Jakarta Regexp - Jakarta Regexp History of Changes</title>
-<link rel="stylesheet" href="/style/style.css" type="text/css" />
-<meta name="author" value="Jon S. Stevens" />
-<meta name="email" value="[EMAIL PROTECTED]" />
-<meta name="author" value="Vadim Gritsenko" />
-<meta name="email" value="[EMAIL PROTECTED]" />
+<link rel="stylesheet" href="/style/style.css" type="text/css"/>
+<link rel="alternate" href="http://jakarta.apache.org/site/rss.xml"; 
type="application/rss+xml" title="Apache Jakarta News"/>
+<meta name="author" value="Jon S. Stevens"/>
+<meta name="email" value="[EMAIL PROTECTED]"/>
+<meta name="author" value="Vadim Gritsenko"/>
+<meta name="email" value="[EMAIL PROTECTED]"/>
 </head>
 <body>
 <table class="page-header" border="0" width="100%" cellspacing="0">
@@ -16,10 +17,14 @@
 <td colspan="2">
 <!--JAKARTA LOGO-->
 <a href="http://jakarta.apache.org/";>
-<img src="http://jakarta.apache.org/images/jakarta-logo.gif"; alt="The Jakarta 
Project" border="0" />
+<img src="http://jakarta.apache.org/images/jakarta-logo.gif"; alt="The Jakarta 
Project" border="0"/>
+</a>
+</td>
+<td align="right">
+<a href="http://apachecon.com/2007/EU/";>
+<img alt="ApacheCon Europe 2007" border="0" 
src="http://www.apache.org/ads/ApacheCon/2007-europe-234x60.png"/>
 </a>
 </td>
-<td />
 </tr>
 </table>
 <table border="0" width="100%" cellspacing="4">
@@ -86,6 +91,9 @@
 
 <h3>Version 1.5-dev</h3>
 <ul>
+<li>Fixed Bug
+    <a 
href="http://issues.apache.org/bugzilla/show_bug.cgi?id=37275";>37275</a>:
+    RE incorrectly processes nested {n,m} closures (ex: (A{1}){0,2}) (VG)</li>
 <li>Added accessor for REProgram.prefix (VG)</li>
 </ul>
 
@@ -239,18 +247,18 @@
 </div>
 </td>
 <!--RIGHT SIDE NAVIGATION-->
-<td class="right-navbar" valign="top" nowrap="nowrap" />
+<td class="right-navbar" valign="top" nowrap="nowrap"/>
 </tr>
 <!--FOOTER SEPARATOR-->
 <tr>
 <td colspan="3">
-<hr noshade="noshade" size="1" />
+<hr noshade="noshade" size="1"/>
 </td>
 </tr>
 <tr>
 <td colspan="3">
 <div class="page-footer">
-<em> Copyright &copy; 1999-2005, The Apache
+<em> Copyright &copy; 1999-2007, The Apache
                   Software Foundation. <a 
href="http://jakarta.apache.org/site/legal.html";>Legal information</a>. </em>
 </div>
 </td>

Modified: jakarta/regexp/trunk/docs/index.html
URL: 
http://svn.apache.org/viewvc/jakarta/regexp/trunk/docs/index.html?view=diff&rev=515613&r1=515612&r2=515613
==============================================================================
--- jakarta/regexp/trunk/docs/index.html (original)
+++ jakarta/regexp/trunk/docs/index.html Wed Mar  7 07:37:42 2007
@@ -1,11 +1,12 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
 <html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
 <title>Jakarta Regexp - Jakarta Regexp</title>
-<link rel="stylesheet" href="/style/style.css" type="text/css" />
-<meta name="author" value="Jon S. Stevens" />
-<meta name="email" value="[EMAIL PROTECTED]" />
+<link rel="stylesheet" href="/style/style.css" type="text/css"/>
+<link rel="alternate" href="http://jakarta.apache.org/site/rss.xml"; 
type="application/rss+xml" title="Apache Jakarta News"/>
+<meta name="author" value="Jon S. Stevens"/>
+<meta name="email" value="[EMAIL PROTECTED]"/>
 </head>
 <body>
 <table class="page-header" border="0" width="100%" cellspacing="0">
@@ -14,10 +15,14 @@
 <td colspan="2">
 <!--JAKARTA LOGO-->
 <a href="http://jakarta.apache.org/";>
-<img src="http://jakarta.apache.org/images/jakarta-logo.gif"; alt="The Jakarta 
Project" border="0" />
+<img src="http://jakarta.apache.org/images/jakarta-logo.gif"; alt="The Jakarta 
Project" border="0"/>
+</a>
+</td>
+<td align="right">
+<a href="http://apachecon.com/2007/EU/";>
+<img alt="ApacheCon Europe 2007" border="0" 
src="http://www.apache.org/ads/ApacheCon/2007-europe-234x60.png"/>
 </a>
 </td>
-<td />
 </tr>
 </table>
 <table border="0" width="100%" cellspacing="4">
@@ -135,18 +140,18 @@
 </div>
 </td>
 <!--RIGHT SIDE NAVIGATION-->
-<td class="right-navbar" valign="top" nowrap="nowrap" />
+<td class="right-navbar" valign="top" nowrap="nowrap"/>
 </tr>
 <!--FOOTER SEPARATOR-->
 <tr>
 <td colspan="3">
-<hr noshade="noshade" size="1" />
+<hr noshade="noshade" size="1"/>
 </td>
 </tr>
 <tr>
 <td colspan="3">
 <div class="page-footer">
-<em> Copyright &copy; 1999-2005, The Apache
+<em> Copyright &copy; 1999-2007, The Apache
                   Software Foundation. <a 
href="http://jakarta.apache.org/site/legal.html";>Legal information</a>. </em>
 </div>
 </td>

Modified: jakarta/regexp/trunk/docs/jakarta-regexp.jar
URL: 
http://svn.apache.org/viewvc/jakarta/regexp/trunk/docs/jakarta-regexp.jar?view=diff&rev=515613&r1=515612&r2=515613
==============================================================================
Binary files - no diff available.

Modified: jakarta/regexp/trunk/src/java/org/apache/regexp/RECompiler.java
URL: 
http://svn.apache.org/viewvc/jakarta/regexp/trunk/src/java/org/apache/regexp/RECompiler.java?view=diff&rev=515613&r1=515612&r2=515613
==============================================================================
--- jakarta/regexp/trunk/src/java/org/apache/regexp/RECompiler.java (original)
+++ jakarta/regexp/trunk/src/java/org/apache/regexp/RECompiler.java Wed Mar  7 
07:37:42 2007
@@ -16,7 +16,6 @@
 
 package org.apache.regexp;
 
-import org.apache.regexp.RE;
 import java.util.Hashtable;
 
 /**
@@ -66,7 +65,7 @@
     int[] bracketOpt = null;                            // Additional optional 
matches
 
     // Lookup table for POSIX character class names
-    static Hashtable hashPOSIX = new Hashtable();
+    static final Hashtable hashPOSIX = new Hashtable();
     static
     {
         hashPOSIX.put("alnum",     new Character(RE.POSIX_CLASS_ALNUM));
@@ -280,7 +279,7 @@
      * Match bracket {m,n} expression put results in bracket member variables
      * @exception RESyntaxException Thrown if the regular expression has 
invalid syntax.
      */
-    void bracket() throws RESyntaxException
+    void bracket(int bracket) throws RESyntaxException
     {
         // Current character must be a '{'
         if (idx >= len || pattern.charAt(idx++) != '{')
@@ -302,7 +301,7 @@
         }
         try
         {
-            bracketMin[brackets] = Integer.parseInt(number.toString());
+            bracketMin[bracket] = Integer.parseInt(number.toString());
         }
         catch (NumberFormatException e)
         {
@@ -319,7 +318,7 @@
         if (pattern.charAt(idx) == '}')
         {
             idx++;
-            bracketOpt[brackets] = 0;
+            bracketOpt[bracket] = 0;
             return;
         }
 
@@ -339,7 +338,7 @@
         if (pattern.charAt(idx) == '}')
         {
             idx++;
-            bracketOpt[brackets] = bracketUnbounded;
+            bracketOpt[bracket] = bracketUnbounded;
             return;
         }
 
@@ -357,7 +356,7 @@
         }
         try
         {
-            bracketOpt[brackets] = Integer.parseInt(number.toString()) - 
bracketMin[brackets];
+            bracketOpt[bracket] = Integer.parseInt(number.toString()) - 
bracketMin[bracket];
         }
         catch (NumberFormatException e)
         {
@@ -365,7 +364,7 @@
         }
 
         // Optional repetitions must be >= 0
-        if (bracketOpt[brackets] < 0)
+        if (bracketOpt[bracket] < 0)
         {
             syntaxError("Bad range");
         }
@@ -564,7 +563,7 @@
         // Parse class declaration
         char CHAR_INVALID = Character.MAX_VALUE;
         char last = CHAR_INVALID;
-        char simpleChar = 0;
+        char simpleChar;
         boolean include = true;
         boolean definingRange = false;
         int idxFirst = idx;
@@ -965,6 +964,7 @@
         {
             return ret;
         }
+
         boolean greedy = true;
         char closureType = pattern.charAt(idx);
         switch (closureType)
@@ -1017,6 +1017,10 @@
                     {
                         if (bracketStart[i] == idx)
                         {
+                            // Re-initialize bracketMin, bracketOpt since they 
are all used up by now
+                            if (bracketMin[i] == -1) {
+                                bracket(i);
+                            }
                             found = true;
                             break;
                         }
@@ -1030,31 +1034,22 @@
                             reallocBrackets();
                         }
                         bracketStart[brackets] = idx;
-                        bracket();
+                        bracket(brackets);
                         bracketEnd[brackets] = idx;
                         i = brackets++;
                     }
 
                     // Process min first
-                    if (bracketMin[i]-- > 0)
+                    if (bracketMin[i] > 0)
                     {
-                        if (bracketMin[i] > 0 || bracketOpt[i] != 0) {
+                        if (--bracketMin[i] > 0 || bracketOpt[i] != 0) {
                             // Rewind stream and run it through again - more 
matchers coming
-                            for (int j = 0; j < brackets; j++) {
-                                if (j != i && bracketStart[j] < idx
-                                    && bracketStart[j] >= idxBeforeTerminal)
-                                {
-                                    brackets--;
-                                    bracketStart[j] = bracketStart[brackets];
-                                    bracketEnd[j] = bracketEnd[brackets];
-                                    bracketMin[j] = bracketMin[brackets];
-                                    bracketOpt[j] = bracketOpt[brackets];
-                                }
+                            for (int j = 0; j < i; j++) {
+                                bracketMin[j] = -1;
                             }
-
                             idx = idxBeforeTerminal;
                         } else {
-                            // Bug #1030: No optinal matches - no need to 
rewind
+                            // Bug #1030: No optional matches - no need to 
rewind
                             idx = bracketEnd[i];
                         }
                         break;
@@ -1072,9 +1067,11 @@
                     else
                         if (bracketOpt[i]-- > 0)
                         {
-                            if (bracketOpt[i] > 0)
-                            {
+                            if (bracketOpt[i] > 0) {
                                 // More optional matchers - 'play it again 
sam!'
+                                for (int j = 0; j < i; j++) {
+                                    bracketMin[j] = -1;
+                                }
                                 idx = idxBeforeTerminal;
                             } else {
                                 // Bug #1030: We are done - this one is last 
and optional
@@ -1464,7 +1461,6 @@
                 if (minRange[i] >= min && maxRange[i] <= max)
                 {
                     delete(i);
-                    i--;
                     return;
                 }
 

Modified: jakarta/regexp/trunk/xdocs/RETest.txt
URL: 
http://svn.apache.org/viewvc/jakarta/regexp/trunk/xdocs/RETest.txt?view=diff&rev=515613&r1=515612&r2=515613
==============================================================================
--- jakarta/regexp/trunk/xdocs/RETest.txt (original)
+++ jakarta/regexp/trunk/xdocs/RETest.txt Wed Mar  7 07:37:42 2007
@@ -1516,3 +1516,22 @@
 [^\D\S]
 @0 1   _1AByz
 NO
+
+#225
+^(a{1}){0,2}$
+aa
+YES
+3
+aa
+a
+a
+
+#226
+(a{1,3}b){1,3}
+abaabaaab
+YES
+4
+abaabaaab
+ab
+aab
+aaab

Modified: jakarta/regexp/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/regexp/trunk/xdocs/changes.xml?view=diff&rev=515613&r1=515612&r2=515613
==============================================================================
--- jakarta/regexp/trunk/xdocs/changes.xml (original)
+++ jakarta/regexp/trunk/xdocs/changes.xml Wed Mar  7 07:37:42 2007
@@ -34,6 +34,9 @@
 
 <h3>Version 1.5-dev</h3>
 <ul>
+<li>Fixed Bug
+    <a 
href="http://issues.apache.org/bugzilla/show_bug.cgi?id=37275";>37275</a>:
+    RE incorrectly processes nested {n,m} closures (ex: (A{1}){0,2}) (VG)</li>
 <li>Added accessor for REProgram.prefix (VG)</li>
 </ul>
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to