| //------------------------------------------------------------------------------------------------------- |
| // 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); |
| } |