715 { |
715 { |
716 return [this.LValue(Math.floor(x.value))]; |
716 return [this.LValue(Math.floor(x.value))]; |
717 } |
717 } |
718 }; |
718 }; |
719 |
719 |
|
720 var _patternClasses = { |
|
721 "a": "[A-Za-z]", "A": "[^A-Za-z]", |
|
722 "p": "[\x21-\x2f\x3a-\x40\x5b-\x60\x7b-\x7e]", |
|
723 "P": "[^\x21-\x2f\x3a-\x40\x5b-\x60\x7b-\x7e]", |
|
724 "s": "[\x09-\x0d\x20]", "S": "[^\x09-\x0d\x20]", |
|
725 "u": "[A-Z]", "U": "[^A-Z]", |
|
726 "d": "[0-9]", "D": "[^0-9]", |
|
727 "w": "[0-9A-Za-z]", "W": "[^0-9A-Za-z]", |
|
728 "x": "[0-9A-Fa-f]", "X": "[^0-9A-Fa-f]", |
|
729 "z": "[\x00]", "Z": "[^\x00]", |
|
730 "l": "[a-z]", "L": "[^a-z]", |
|
731 "c": "[\x00-\x1f\x7f]", "C": "[^\x00-\x1f\x7f]", |
|
732 }; |
|
733 |
|
734 var _patternToRegExp = function (patt) |
|
735 { |
|
736 var regexp = ""; |
|
737 for(var i=0;i<patt.length;i++) |
|
738 { |
|
739 var c = patt[i]; |
|
740 if(c == "%") |
|
741 { |
|
742 c = patt[++i]; |
|
743 if(c == "b") |
|
744 { |
|
745 throw "%b not supported in patterns"; |
|
746 } |
|
747 else if(c >= "0" && c <= "9") |
|
748 { |
|
749 regexp += ("\\"+c); |
|
750 continue; |
|
751 } |
|
752 else |
|
753 { |
|
754 var cls = _patternClasses[c]; |
|
755 if(cls) |
|
756 { |
|
757 regexp += cls; |
|
758 continue; |
|
759 } |
|
760 } |
|
761 } |
|
762 else if(c == "\\" || c == "/") |
|
763 regexp += "\\"; // Escape escapes |
|
764 regexp += c; |
|
765 } |
|
766 return new RegExp(regexp, "g"); |
|
767 }; |
|
768 |
|
769 var string = { |
|
770 gmatch: function (str, patt) |
|
771 { |
|
772 var re = _patternToRegExp(patt.value); |
|
773 var matches = str.value.match(re)||[]; |
|
774 sys.puts("MATCHES: "+str+" "+matches.length); |
|
775 var curr = 0; |
|
776 var iter = function () |
|
777 { |
|
778 return [this.LValue(matches[curr++])]; |
|
779 }; |
|
780 return [this.LValue(iter)]; |
|
781 } |
|
782 }; |
720 testvm.registerLib(_G, null, baselib); |
783 testvm.registerLib(_G, null, baselib); |
721 testvm.registerLib(_G, "math", math); |
784 testvm.registerLib(_G, "math", math); |
|
785 testvm.registerLib(_G, "string", string); |
722 |
786 |
723 // Metatable on environment to print out nil global accesses |
787 // Metatable on environment to print out nil global accesses |
724 var mt = testvm.LValue({}); |
788 var mt = testvm.LValue({}); |
725 mt.setIndex( |
789 mt.setIndex( |
726 testvm.LValue("__index"), |
790 testvm.LValue("__index"), |