Fix balanced match for empty string (fixes issue #23)
This commit is contained in:
@@ -917,6 +917,9 @@ Files are no longer hosted at LuaForge.
|
|||||||
|
|
||||||
<tr valign="top"><td> <b>3.0-beta3</b></td><td><ul>
|
<tr valign="top"><td> <b>3.0-beta3</b></td><td><ul>
|
||||||
<li>Fix maven sample code.</li>
|
<li>Fix maven sample code.</li>
|
||||||
|
<li>Add sample code for Android Application that uses luaj.</li>
|
||||||
|
<li>Add sample code for Applet that uses luaj.</li>
|
||||||
|
<li>Fix balanced match for empty string (fixes issue #23).</li>
|
||||||
|
|
||||||
</ul></td></tr>
|
</ul></td></tr>
|
||||||
</table></td></tr></table>
|
</table></td></tr></table>
|
||||||
|
|||||||
@@ -387,6 +387,12 @@ public class LuaString extends LuaValue {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Take a substring using Java zero-based indexes for begin and end or range.
|
||||||
|
* @param beginIndex The zero-based index of the first character to include.
|
||||||
|
* @param endIndex The zero-based index of position after the last character.
|
||||||
|
* @return LuaString which is a substring whose first character is at offset
|
||||||
|
* beginIndex and extending for (endIndex - beginIndex ) characters.
|
||||||
|
*/
|
||||||
public LuaString substring( int beginIndex, int endIndex ) {
|
public LuaString substring( int beginIndex, int endIndex ) {
|
||||||
return valueOf( m_bytes, m_offset + beginIndex, endIndex - beginIndex );
|
return valueOf( m_bytes, m_offset + beginIndex, endIndex - beginIndex );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1155,19 +1155,20 @@ public class StringLib extends TwoArgFunction {
|
|||||||
if ( poff == plen || poff + 1 == plen ) {
|
if ( poff == plen || poff + 1 == plen ) {
|
||||||
error( "unbalanced pattern" );
|
error( "unbalanced pattern" );
|
||||||
}
|
}
|
||||||
if ( s.luaByte( soff ) != p.luaByte( poff ) )
|
final int slen = s.length();
|
||||||
|
if ( soff >= slen )
|
||||||
return -1;
|
return -1;
|
||||||
else {
|
final int b = p.luaByte( poff );
|
||||||
int b = p.luaByte( poff );
|
if ( s.luaByte( soff ) != b )
|
||||||
int e = p.luaByte( poff + 1 );
|
return -1;
|
||||||
|
final int e = p.luaByte( poff + 1 );
|
||||||
int cont = 1;
|
int cont = 1;
|
||||||
while ( ++soff < s.length() ) {
|
while ( ++soff < slen ) {
|
||||||
if ( s.luaByte( soff ) == e ) {
|
if ( s.luaByte( soff ) == e ) {
|
||||||
if ( --cont == 0 ) return soff + 1;
|
if ( --cont == 0 ) return soff + 1;
|
||||||
}
|
}
|
||||||
else if ( s.luaByte( soff ) == b ) cont++;
|
else if ( s.luaByte( soff ) == b ) cont++;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -349,4 +349,33 @@ public class StringTest extends TestCase {
|
|||||||
assertEquals(1, sub.indexOfAny(CdEFGHIJ));
|
assertEquals(1, sub.indexOfAny(CdEFGHIJ));
|
||||||
assertEquals(-1, sub.indexOfAny(EFGHIJKL));
|
assertEquals(-1, sub.indexOfAny(EFGHIJKL));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testMatchShortPatterns() {
|
||||||
|
LuaValue[] args = { LuaString.valueOf("%bxy") };
|
||||||
|
LuaString _ = LuaString.valueOf("");
|
||||||
|
|
||||||
|
LuaString a = LuaString.valueOf("a");
|
||||||
|
LuaString ax = LuaString.valueOf("ax");
|
||||||
|
LuaString axb = LuaString.valueOf("axb");
|
||||||
|
LuaString axby = LuaString.valueOf("axby");
|
||||||
|
LuaString xbya = LuaString.valueOf("xbya");
|
||||||
|
LuaString bya = LuaString.valueOf("bya");
|
||||||
|
LuaString xby = LuaString.valueOf("xby");
|
||||||
|
LuaString axbya = LuaString.valueOf("axbya");
|
||||||
|
LuaValue nil = LuaValue.NIL;
|
||||||
|
|
||||||
|
assertEquals(nil, _.invokemethod("match", args));
|
||||||
|
assertEquals(nil, a.invokemethod("match", args));
|
||||||
|
assertEquals(nil, ax.invokemethod("match", args));
|
||||||
|
assertEquals(nil, axb.invokemethod("match", args));
|
||||||
|
assertEquals(xby, axby.invokemethod("match", args));
|
||||||
|
assertEquals(xby, xbya.invokemethod("match", args));
|
||||||
|
assertEquals(nil, bya.invokemethod("match", args));
|
||||||
|
assertEquals(xby, xby.invokemethod("match", args));
|
||||||
|
assertEquals(xby, axbya.invokemethod("match", args));
|
||||||
|
assertEquals(xby, axbya.substring(0,4).invokemethod("match", args));
|
||||||
|
assertEquals(nil, axbya.substring(0,3).invokemethod("match", args));
|
||||||
|
assertEquals(xby, axbya.substring(1,5).invokemethod("match", args));
|
||||||
|
assertEquals(nil, axbya.substring(2,5).invokemethod("match", args));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user