Add string lib, with gmatch function only for now

Sun, 21 Nov 2010 16:28:17 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Sun, 21 Nov 2010 16:28:17 +0000
changeset 104
c481f6bfb19b
parent 103
5a0db53fc898
child 105
fdcc139587a3

Add string lib, with gmatch function only for now

lvm.js file | annotate | diff | comparison | revisions
--- a/lvm.js	Sun Nov 21 16:27:41 2010 +0000
+++ b/lvm.js	Sun Nov 21 16:28:17 2010 +0000
@@ -717,8 +717,72 @@
 	}
 };
 
+var _patternClasses = {
+	"a": "[A-Za-z]", "A": "[^A-Za-z]",
+	"p": "[\x21-\x2f\x3a-\x40\x5b-\x60\x7b-\x7e]",
+	"P": "[^\x21-\x2f\x3a-\x40\x5b-\x60\x7b-\x7e]",
+	"s": "[\x09-\x0d\x20]", "S": "[^\x09-\x0d\x20]",
+	"u": "[A-Z]", "U": "[^A-Z]",
+	"d": "[0-9]", "D": "[^0-9]",
+	"w": "[0-9A-Za-z]", "W": "[^0-9A-Za-z]",
+	"x": "[0-9A-Fa-f]", "X": "[^0-9A-Fa-f]",
+	"z": "[\x00]", "Z": "[^\x00]",
+	"l": "[a-z]", "L": "[^a-z]",
+	"c": "[\x00-\x1f\x7f]", "C": "[^\x00-\x1f\x7f]",
+};
+
+var _patternToRegExp = function (patt)
+{
+	var regexp = "";
+	for(var i=0;i<patt.length;i++)
+	{
+		var c = patt[i];
+		if(c == "%")
+		{
+			c = patt[++i];
+			if(c == "b")
+			{
+				throw "%b not supported in patterns";
+			}
+			else if(c >= "0" && c <= "9")
+			{
+				regexp += ("\\"+c);
+				continue;
+			}
+			else
+			{
+				var cls = _patternClasses[c];
+				if(cls)
+				{
+					regexp += cls;
+					continue;
+				}
+			}
+		}
+		else if(c == "\\" || c == "/")
+			regexp += "\\"; // Escape escapes
+		regexp += c;
+	}
+	return new RegExp(regexp, "g");
+};
+
+var string = {
+	gmatch: function (str, patt)
+	{
+		var re = _patternToRegExp(patt.value);
+		var matches = str.value.match(re)||[];
+		sys.puts("MATCHES: "+str+"  "+matches.length);
+		var curr = 0;
+		var iter = function ()
+		{
+			return [this.LValue(matches[curr++])];
+		};
+		return [this.LValue(iter)];
+	}
+};
 testvm.registerLib(_G, null, baselib);
 testvm.registerLib(_G, "math", math);
+testvm.registerLib(_G, "string", string);
 
 // Metatable on environment to print out nil global accesses
 var mt = testvm.LValue({});

mercurial