| //------------------------------------------------------------------------------------------------------- | |
| // 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 | |
| suppressLastIndex = true; | |
| var a = "#$%&"; | |
| a+="0123456789"; | |
| a+="<=>?@" | |
| a+="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | |
| a+="[\]^_`"; | |
| a+="abcdefghijklmnopqrstuvwXYZ"; | |
| a+="{|}~"; | |
| var regexNoCase = | |
| [ /[K-Z]+/gi, | |
| /[C-\{]+/gi, | |
| /[L-e]+/gi, | |
| /[F-e]+/gi, | |
| /[K-_]+/gi, | |
| /[e-p]+/gi, | |
| /[r-\~]+/gi, | |
| /[9-Z]+/gi, | |
| /[9-k]+/gi, | |
| /[\]-k]+/gi, | |
| /[\{-\}]+/gi, | |
| /[0-z]+/gi, | |
| /[0-K]+/gi, | |
| /[5-\}]+/gi, | |
| /[a-zA-Z]+/gi, | |
| /[afkl]+/gi, | |
| /[a-z0-9_]+/gi, | |
| /[abc]+/gi, | |
| /[E-f]+/gi, | |
| /[abc]+/gi, | |
| /[E-fk-o]+/gi, | |
| /[a-dk-lx-z]+/gi, | |
| /[\[\]]+/gi, | |
| /[\[\}]+/gi, | |
| /[0-\}]+/gi, | |
| /[A-z]+/gi, | |
| /[@-k]+/gi, | |
| /[0-_]+/gi, | |
| /[Z-z]+/gi, | |
| /[A-a]+/gi, | |
| /[X-kK-b]+/gi | |
| ]; | |
| var regexCase = | |
| [ /[K-Z]+/g, | |
| /[C-\{]+/g, | |
| /[L-e]+/g, | |
| /[F-e]+/g, | |
| /[K-_]+/g, | |
| /[e-p]+/g, | |
| /[r-\~]+/g, | |
| /[9-Z]+/g, | |
| /[9-k]+/g, | |
| /[\]-k]+/g, | |
| /[\{-\}]+/g, | |
| /[0-z]+/g, | |
| /[0-K]+/g, | |
| /[5-\}]+/g, | |
| /[a-zA-Z]+/g, | |
| /[afkl]+/g, | |
| /[a-z0-9_]+/g, | |
| /[abc]+/g, | |
| /[E-f]+/g, | |
| /[abc]+/g, | |
| /[E-fk-o]+/g, | |
| /[a-dk-lx-z]+/g, | |
| /[\[\]]+/g, | |
| /[\[\}]+/g, | |
| /[0-\}]+/g, | |
| /[A-z]+/g, | |
| /[@-k]+/g, | |
| /[0-_]+/g, | |
| /[Z-z]+/g, | |
| /[A-a]+/g, | |
| /[X-kK-b]+/g | |
| ]; | |
| for (var i in regexNoCase) | |
| { | |
| exec(regexNoCase[i], a); | |
| match(regexNoCase[i], a); | |
| } | |
| for (var j in regexCase) | |
| { | |
| exec(regexCase[j], a); | |
| match(regexCase[j], a); | |
| } |