From d65729f1d77e166cdaa7abdc448de4824cf8cdd5 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Wed, 26 Sep 2007 05:19:25 +0000 Subject: [PATCH] Add gmatch implementation --- .../java/lua/addon/luacompat/StrLib.java | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/addon/java/lua/addon/luacompat/StrLib.java b/src/addon/java/lua/addon/luacompat/StrLib.java index 07e1afd5..a0963c68 100644 --- a/src/addon/java/lua/addon/luacompat/StrLib.java +++ b/src/addon/java/lua/addon/luacompat/StrLib.java @@ -143,11 +143,38 @@ public class StrLib { * as this would prevent the iteration. */ static void gmatch( VM vm ) { - LString s = vm.getArgAsLuaString(0); - LString pattern = vm.getArgAsLuaString(1); - vm.setResult(); + vm.setResult( new GMatchAux(vm) ); } + static class GMatchAux extends LFunction { + private final LString src,pat; + private final int srclen; + private final MatchState ms; + private int soffset; + public GMatchAux(VM vm) { + this.src = vm.getArgAsLuaString(0); + this.pat = vm.getArgAsLuaString(1); + this.srclen = src.length(); + this.ms = new MatchState(vm, src, pat); + this.soffset = 0; + } + public boolean luaStackCall(VM vm) { + vm.setResult(); + for ( ; soffset=0 ) { + int soff = soffset; + soffset = res; + ms.push_captures( true, soff, res ); + return false; + } + } + vm.push( LNil.NIL ); + return false; + } + } + + /** * string.gsub (s, pattern, repl [, n]) * Returns a copy of s in which all (or the first n, if given) occurrences of the