Fix balanced match for empty string (fixes issue #23)

This commit is contained in:
James Roseborough
2014-03-09 15:33:44 +00:00
parent f17e9d7018
commit 7b97573ac8
4 changed files with 49 additions and 10 deletions

View File

@@ -917,6 +917,9 @@ Files are no longer hosted at LuaForge.
<tr valign="top"><td>&nbsp;&nbsp;<b>3.0-beta3</b></td><td><ul> <tr valign="top"><td>&nbsp;&nbsp;<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>

View File

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

View File

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

View File

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