Implement string.find (mostly) and string.sub

Wed, 24 Nov 2010 02:53:15 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Wed, 24 Nov 2010 02:53:15 +0000
changeset 139
055fe658d0b2
parent 138
f9bb0e212d28
child 140
2286f9b970b7

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

mercurial