| //------------------------------------------------------------------------------------------------------- | |
| // Copyright (C) Microsoft. All rights reserved. | |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. | |
| //------------------------------------------------------------------------------------------------------- | |
| // BEGIN PRELUDE | |
| function echo(o) { | |
| try { | |
| document.write(o + "<br/>"); | |
| echo = function(o) { document.write(o + "<br/>"); }; | |
| } catch (ex) { | |
| try { | |
| WScript.Echo("" + o); | |
| echo = function(o) { WScript.Echo("" + o); }; | |
| } catch (ex2) { | |
| print("" + o); | |
| echo = function(o) { print("" + o); }; | |
| } | |
| } | |
| } | |
| var suppressLastIndex = false; | |
| var suppressRegExp = false; | |
| var suppressIndex = false; | |
| function safeCall(f) { | |
| var args = []; | |
| for (var a = 1; a < arguments.length; ++a) | |
| args.push(arguments[a]); | |
| try { | |
| return f.apply(this, args); | |
| } catch (ex) { | |
| echo("EXCEPTION"); | |
| } | |
| } | |
| hex = "0123456789abcdef"; | |
| function dump(o) { | |
| var sb = []; | |
| if (o === null) | |
| sb.push("null"); | |
| else if (o === undefined) | |
| sb.push("undefined"); | |
| else if (o === true) | |
| sb.push("true"); | |
| else if (o === false) | |
| sb.push("false"); | |
| else if (typeof o === "number") | |
| sb.push(o.toString()); | |
| else if (typeof o == "string") { | |
| if (o.length > 8192) | |
| sb.push("<long string>"); | |
| else { | |
| sb.push("\""); | |
| var start = -1; | |
| for (var i = 0; i < o.length; i++) { | |
| var c = o.charCodeAt(i); | |
| if (c < 32 || c > 127 || c == '"'.charCodeAt(0) || c == '\\'.charCodeAt(0)) { | |
| if (start >= 0) | |
| sb.push(o.substring(start, i)); | |
| start = -1; | |
| sb.push("\\u"); | |
| sb.push(String.fromCharCode(hex.charCodeAt((c >> 12) & 0xf))); | |
| sb.push(String.fromCharCode(hex.charCodeAt((c >> 8) & 0xf))); | |
| sb.push(String.fromCharCode(hex.charCodeAt((c >> 4) & 0xf))); | |
| sb.push(String.fromCharCode(hex.charCodeAt((c >> 0) & 0xf))); | |
| } | |
| else { | |
| if (start < 0) | |
| start = i; | |
| } | |
| } | |
| if (start >= 0) | |
| sb.push(o.substring(start, o.length)); | |
| sb.push("\""); | |
| } | |
| } | |
| else if (o instanceof RegExp) { | |
| var body = o.source; | |
| sb.push("/"); | |
| var start = -1; | |
| for (var i = 0; i < body.length; i++) { | |
| var c = body.charCodeAt(i); | |
| if (c < 32 || c > 127) { | |
| if (start >= 0) | |
| sb.push(body.substring(start, i)); | |
| start = -1; | |
| sb.push("\\u"); | |
| sb.push(String.fromCharCode(hex.charCodeAt((c >> 12) & 0xf))); | |
| sb.push(String.fromCharCode(hex.charCodeAt((c >> 8) & 0xf))); | |
| sb.push(String.fromCharCode(hex.charCodeAt((c >> 4) & 0xf))); | |
| sb.push(String.fromCharCode(hex.charCodeAt((c >> 0) & 0xf))); | |
| } | |
| else { | |
| if (start < 0) | |
| start = i; | |
| } | |
| } | |
| if (start >= 0) | |
| sb.push(body.substring(start, body.length)); | |
| sb.push("/"); | |
| if (o.global) | |
| sb.push("g"); | |
| if (o.ignoreCase) | |
| sb.push("i"); | |
| if (o.multiline) | |
| sb.push("m"); | |
| if (!suppressLastIndex && o.lastIndex !== undefined) { | |
| sb.push(" /*lastIndex="); | |
| sb.push(o.lastIndex); | |
| sb.push("*/ "); | |
| } | |
| } | |
| else if (o.length !== undefined) { | |
| sb.push("["); | |
| for (var i = 0; i < o.length; i++) { | |
| if (i > 0) | |
| sb.push(","); | |
| sb.push(dump(o[i])); | |
| } | |
| sb.push("]"); | |
| if (!suppressIndex && (o.input !== undefined || o.index !== undefined)) | |
| { | |
| sb.push(" /*input="); | |
| sb.push(dump(o.input)); | |
| sb.push(", index="); | |
| sb.push(dump(o.index)); | |
| // IE only | |
| // sb.push(", lastIndex="); | |
| // sb.push(dump(o.lastIndex)); | |
| sb.push("*/ "); | |
| } | |
| } | |
| else if (o.toString !== undefined) { | |
| sb.push("<object with toString>"); | |
| } | |
| else | |
| sb.push(o.toString()); | |
| return sb.join(""); | |
| } | |
| function pre(w, origargs, n) { | |
| var sb = [w]; | |
| sb.push("("); | |
| for (var i = 0; i < n; i++) { | |
| if (i > 0) sb.push(", "); | |
| sb.push(dump(origargs[i])); | |
| } | |
| if (origargs.length > n) { | |
| sb.push(", "); | |
| sb.push(dump(origargs[n])); | |
| origargs[0].lastIndex = origargs[n]; | |
| } | |
| sb.push(");"); | |
| echo(sb.join("")); | |
| } | |
| function post(r) { | |
| if (!suppressLastIndex) { | |
| echo("r.lastIndex=" + dump(r.lastIndex)); | |
| } | |
| if (!suppressRegExp) { | |
| // IE only | |
| // echo("RegExp.index=" + dump(RegExp.index)); | |
| // echo("RegExp.lastIndex=" + dump(RegExp.lastIndex)); | |
| var sb = []; | |
| sb.push("RegExp.${_,1,...,9}=["); | |
| sb.push(dump(RegExp.$_)); | |
| for (var i = 1; i <= 9; i++) { | |
| sb.push(","); | |
| sb.push(dump(RegExp["$" + i])); | |
| } | |
| sb.push("]"); | |
| echo(sb.join("")); | |
| } | |
| } | |
| function exec(r, s) { | |
| pre("exec", arguments, 2); | |
| echo(dump(r.exec(s))); | |
| post(r); | |
| } | |
| function test(r, s) { | |
| pre("test", arguments, 2); | |
| echo(dump(r.test(s))); | |
| post(r); | |
| } | |
| function replace(r, s, o) { | |
| pre("replace", arguments, 3); | |
| echo(dump(s.replace(r, o))); | |
| post(r); | |
| } | |
| function split(r, s) { | |
| pre("split", arguments, 2); | |
| echo(dump(s.split(r))); | |
| post(r); | |
| } | |
| function match(r, s) { | |
| pre("match", arguments, 2); | |
| echo(dump(s.match(r))); | |
| post(r); | |
| } | |
| function search(r, s) { | |
| pre("search", arguments, 2); | |
| echo(dump(s.search(r))); | |
| post(r); | |
| } | |
| function bogus(r, o) { | |
| echo("bogus(" + dump(r) + ", " + dump(o) + ");"); | |
| try { new RegExp(r, o); echo("FAILED"); } catch (e) { echo("PASSED"); } | |
| } | |
| // END PRELUDE | |
| // 15.10.2.3 Disjunction | |
| exec(/a|ab/, "abc"); | |
| exec(/((a)|(ab))((c)|(bc))/, "abc"); | |
| // 15.10.2.5 Term | |
| exec(/a[a-z]{2,4}/, "abcdefghi"); | |
| exec(/a[a-z]{2,4}?/, "abcdefghi"); | |
| exec(/(aa|aabaac|ba|b|c)*/, "aabaac"); | |
| replace(/^(a+)\1*,\1+$/, "aaaaaaaaaa,aaaaaaaaaaaaaaa", "$1"); | |
| exec(/(z)((a+)?(b+)?(c))*/, "zaacbbbcac"); | |
| exec(/(a*)*/, "b"); | |
| exec(/(a*)b\1+/, "baaaac"); | |
| // 15.10.2.7 Quantifier | |
| exec(/(?=(a+))/, "baaabac"); | |
| exec(/(?=(a+))a*b\1/, "baaabac"); | |
| exec(/(.*?)a(?!(a+)b\2c)\2(.*)/, "baaabaac"); |