18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The contents of this file are subject to the Netscape Public
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* License Version 1.1 (the "License"); you may not use this file
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* except in compliance with the License. You may obtain a copy of
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* the License at http://www.mozilla.org/NPL/
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Software distributed under the License is distributed on an "AS  IS"
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* basis, WITHOUT WARRANTY OF ANY KIND, either expressed
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* or implied. See the License for the specific language governing
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* rights and limitations under the License.
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The Original Code is mozilla.org code.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The Initial Developer of the Original Code is Netscape
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Communications Corporation.  Portions created by Netscape are
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Copyright (C) 1998 Netscape Communications Corporation.
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* All Rights Reserved.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Contributor(s): bedney@technicalpursuit.com, pschwartau@netscape.com
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Date: 04 October 2001
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* SUMMARY:  Arose from Bugzilla bug 103087:
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* "The RegExp MarkupSPE in demo crashes Mozilla"
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* See http://bugzilla.mozilla.org/show_bug.cgi?id=103087
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The SpiderMonkey shell crashed on some of these regexps.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The reported crash was on i=24 below ('MarkupSPE' regexp)
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* I crashed on that, and also on i=43 ('XML_SPE' regexp)
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-----------------------------------------------------------------------------
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar UBound = 0;
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar bug = 103087;
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar summary = "Testing that we don't crash on any of these regexps -";
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar re = '';
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar lm = '';
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar lc = '';
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar rc = '';
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the regexps are built in pieces  -
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar NameStrt = "[A-Za-z_:]|[^\\x00-\\x7F]";
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar NameChar = "[A-Za-z0-9_:.-]|[^\\x00-\\x7F]";
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar Name = "(" + NameStrt + ")(" + NameChar + ")*";
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TextSE = "[^<]+";
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar UntilHyphen = "[^-]*-";
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar Until2Hyphens = UntilHyphen + "([^-]" + UntilHyphen + ")*-";
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar CommentCE = Until2Hyphens + ">?";
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar UntilRSBs = "[^]]*]([^]]+])*]+";
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar CDATA_CE = UntilRSBs + "([^]>]" + UntilRSBs + ")*>";
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar S = "[ \\n\\t\\r]+";
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar QuoteSE = '"[^"]' + "*" + '"' + "|'[^']*'";
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar DT_IdentSE = S + Name + "(" + S + "(" + Name + "|" + QuoteSE + "))*";
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar MarkupDeclCE = "([^]\"'><]+|" + QuoteSE + ")*>";
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar S1 = "[\\n\\r\\t ]";
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar UntilQMs = "[^?]*\\?+";
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar PI_Tail = "\\?>|" + S1 + UntilQMs + "([^>?]" + UntilQMs + ")*>";
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar DT_ItemSE = "<(!(--" + Until2Hyphens + ">|[^-]" + MarkupDeclCE + ")|\\?" + Name + "(" + PI_Tail + "))|%" + Name + ";|" + S;
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar DocTypeCE = DT_IdentSE + "(" + S + ")?(\\[(" + DT_ItemSE + ")*](" + S + ")?)?>?";
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar DeclCE = "--(" + CommentCE + ")?|\\[CDATA\\[(" + CDATA_CE + ")?|DOCTYPE(" + DocTypeCE + ")?";
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar PI_CE = Name + "(" + PI_Tail + ")?";
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar EndTagCE = Name + "(" + S + ")?>?";
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar AttValSE = '"[^<"]' + "*" + '"' + "|'[^<']*'";
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar ElemTagCE = Name + "(" + S + Name + "(" + S + ")?=(" + S + ")?(" + AttValSE + "))*(" + S + ")?/?>?";
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar MarkupSPE = "<(!(" + DeclCE + ")?|\\?(" + PI_CE + ")?|/(" + EndTagCE + ")?|(" + ElemTagCE + ")?)";
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar XML_SPE = TextSE + "|" + MarkupSPE;
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar CommentRE = "<!--" + Until2Hyphens + ">";
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar CommentSPE = "<!--(" + CommentCE + ")?";
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar PI_RE = "<\\?" + Name + "(" + PI_Tail + ")";
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar Erroneous_PI_SE = "<\\?[^?]*(\\?[^>]+)*\\?>";
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar PI_SPE = "<\\?(" + PI_CE + ")?";
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar CDATA_RE = "<!\\[CDATA\\[" + CDATA_CE;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar CDATA_SPE = "<!\\[CDATA\\[(" + CDATA_CE + ")?";
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar ElemTagSE = "<(" + NameStrt + ")([^<>\"']+|" + AttValSE + ")*>";
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar ElemTagRE = "<" + Name + "(" + S + Name + "(" + S + ")?=(" + S + ")?(" + AttValSE + "))*(" + S + ")?/?>";
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar ElemTagSPE = "<" + ElemTagCE;
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar EndTagRE = "</" + Name + "(" + S + ")?>";
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar EndTagSPE = "</(" + EndTagCE + ")?";
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar DocTypeSPE = "<!DOCTYPE(" + DocTypeCE + ")?";
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar PERef_APE = "%(" + Name + ";?)?";
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar HexPart = "x([0-9a-fA-F]+;?)?";
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar NumPart = "#([0-9]+;?|" + HexPart + ")?";
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar CGRef_APE = "&(" + Name + ";?|" + NumPart + ")?";
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar Text_PE = CGRef_APE + "|[^&]+";
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar EntityValue_PE = CGRef_APE + "|" + PERef_APE + "|[^%&]+";
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar rePatterns = new Array(AttValSE, CDATA_CE, CDATA_RE, CDATA_SPE, CGRef_APE, CommentCE, CommentRE, CommentSPE, DT_IdentSE, DT_ItemSE, DeclCE, DocTypeCE, DocTypeSPE, ElemTagCE, ElemTagRE, ElemTagSE, ElemTagSPE, EndTagCE, EndTagRE, EndTagSPE, EntityValue_PE, Erroneous_PI_SE, HexPart, MarkupDeclCE, MarkupSPE, Name, NameChar, NameStrt, NumPart, PERef_APE, PI_CE, PI_RE, PI_SPE, PI_Tail, QuoteSE, S, S1, TextSE, Text_PE, Until2Hyphens, UntilHyphen, UntilQMs, UntilRSBs, XML_SPE);
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// here's a big string to test the regexps on -
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar str = '';
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '<html xmlns="http://www.w3.org/1999/xhtml"' + '\n';
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '      xmlns:xlink="http://www.w3.org/XML/XLink/0.9">' + '\n';
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '  <head><title>Three Namespaces</title></head>' + '\n';
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '  <body>' + '\n';
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '    <h1 align="center">An Ellipse and a Rectangle</h1>' + '\n';
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '    <svg xmlns="http://www.w3.org/Graphics/SVG/SVG-19991203.dtd" ' + '\n';
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '         width="12cm" height="10cm">' + '\n';
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '      <ellipse rx="110" ry="130" />' + '\n';
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '      <rect x="4cm" y="1cm" width="3cm" height="6cm" />' + '\n';
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '    </svg>' + '\n';
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '    <p xlink:type="simple" xlink:href="ellipses.html">' + '\n';
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '      More about ellipses' + '\n';
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '    </p>' + '\n';
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '    <p xlink:type="simple" xlink:href="rectangles.html">' + '\n';
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '      More about rectangles' + '\n';
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '    </p>' + '\n';
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '    <hr/>' + '\n';
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '    <p>Last Modified February 13, 2000</p>    ' + '\n';
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '  </body>' + '\n';
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstr += '</html>';
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-----------------------------------------------------------------------------
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttest();
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-----------------------------------------------------------------------------
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction test()
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  enterFunc ('test');
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  printBugNumber (bug);
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  printStatus (summary);
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  for (var i=0; i<rePatterns.length; i++)
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  {
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    status = inSection(i);
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    re = new RegExp(rePatterns[i]);
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Test that we don't crash on any of these -
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    re.exec(str);
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    getResults();
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Just for the heck of it, test the current leftContext
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    re.exec(lc);
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    getResults();
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Test the current rightContext
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    re.exec(rc);
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    getResults();
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  }
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  exitFunc ('test');
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction getResults()
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  lm = RegExp.lastMatch;
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  lc = RegExp.leftContext;
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  rc = RegExp.rightContext;
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
156