Wed, 24 Nov 2010 02:53:15 +0000
Implement string.find (mostly) and string.sub
lvm.js | file | annotate | diff | comparison | revisions |
--- a/lvm.js Wed Nov 24 02:52:37 2010 +0000 +++ b/lvm.js Wed Nov 24 02:53:15 2010 +0000 @@ -898,6 +898,36 @@ }; var string = { + "char": function () + { + var nArgs = arguments.length; + if(nArgs < 1) + throw "string.char(): Expects at least 1 parameter"; + var results = []; + for(var i=0; i<nArgs; i++) + { + var code = arguments[i]; + if(code.type != "number") + throw "string.char(): Argument #"+(i+1)+" expected number, got "+code.type; + results.push(String.fromCharCode(code.value)); + } + return [this.LValue(results.join(''))]; + }, + find: function (str, patt, init, plain) + { + if(arguments.length > 2) + throw "string.find(): No more than the first 2 arguments supported"; + var re = _patternToRegExp(patt.value); + var result = re.exec(str); + if(!result) + return [this.LValue(null)]; + var start = result.index+1; + var end = start + result[0].length - 1; + var ret = [this.LValue(start), this.LValue(end)]; + for(var i=1; i<result.length; i++) + ret.push(this.LValue(result[i])); + return ret; + }, gmatch: function (str, patt) { var re = _patternToRegExp(patt.value); @@ -908,6 +938,21 @@ return [this.LValue(matches[curr++])]; }; return [this.LValue(iter)]; + }, + sub: function (str, from, to) + { + var result; + switch(arguments.length) + { + case 0: + case 1: + throw "string.sub(): Expected 2 or more arguments"; + case 2: + result = str.value.substring(from.value); + case 3: + result = str.value.substring(from.value, to.value); + } + return [this.LValue(result)]; } }; testvm.registerLib(_G, null, baselib);