# HG changeset patch # User Matthew Wild # Date 1290356897 0 # Node ID c481f6bfb19bc7278c3265d8dc1bb2bbb19e46b3 # Parent 5a0db53fc898116678179cd2bf8df6fb92fc6b08 Add string lib, with gmatch function only for now diff -r 5a0db53fc898 -r c481f6bfb19b lvm.js --- 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= "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({});