internal virtual object ExecuteRegExp(Context cx, Scriptable scope, RegExpImpl res, string str, int[] indexp, int matchType) { REGlobalData gData = new REGlobalData(); int start = indexp[0]; int end = str.Length; if (start > end) { start = end; } // // Call the recursive matcher to do the real work. // bool matches = MatchRegExp(gData, re, str, start, end, res.multiline); if (!matches) { if (matchType != PREFIX) { return null; } return Undefined.instance; } int index = gData.cp; int ep = indexp[0] = index; int matchlen = ep - (start + gData.skipped); index -= matchlen; object result; Scriptable obj; if (matchType == TEST) { result = true; obj = null; } else { result = cx.NewArray(scope, 0); obj = (Scriptable)result; string matchstr = Sharpen.Runtime.Substring(str, index, index + matchlen); obj.Put(0, obj, matchstr); } if (re.parenCount == 0) { res.parens = null; res.lastParen = SubString.emptySubString; } else { SubString parsub = null; int num; res.parens = new SubString[re.parenCount]; for (num = 0; num < re.parenCount; num++) { int cap_index = gData.ParensIndex(num); string parstr; if (cap_index != -1) { int cap_length = gData.ParensLength(num); parsub = new SubString(str, cap_index, cap_length); res.parens[num] = parsub; if (matchType != TEST) { obj.Put(num + 1, obj, parsub.ToString()); } } else { if (matchType != TEST) { obj.Put(num + 1, obj, Undefined.instance); } } } res.lastParen = parsub; } if (!(matchType == TEST)) { obj.Put("index", obj, Sharpen.Extensions.ValueOf(start + gData.skipped)); obj.Put("input", obj, str); } if (res.lastMatch == null) { res.lastMatch = new SubString(); res.leftContext = new SubString(); res.rightContext = new SubString(); } res.lastMatch.str = str; res.lastMatch.index = index; res.lastMatch.length = matchlen; res.leftContext.str = str; if (cx.GetLanguageVersion() == Context.VERSION_1_2) { res.leftContext.index = start; res.leftContext.length = gData.skipped; } else { res.leftContext.index = 0; res.leftContext.length = start + gData.skipped; } res.rightContext.str = str; res.rightContext.index = ep; res.rightContext.length = end - ep; return result; }
private static bool BackrefMatcher(REGlobalData gData, int parenIndex, string input, int end) { int len; int i; if (gData.parens == null || parenIndex >= gData.parens.Length) { return false; } int parenContent = gData.ParensIndex(parenIndex); if (parenContent == -1) { return true; } len = gData.ParensLength(parenIndex); if ((gData.cp + len) > end) { return false; } if ((gData.regexp.flags & JSREG_FOLD) != 0) { for (i = 0; i < len; i++) { char c1 = input[parenContent + i]; char c2 = input[gData.cp + i]; if (c1 != c2 && Upcase(c1) != Upcase(c2)) { return false; } } } else { if (!input.RegionMatches(parenContent, input, gData.cp, len)) { return false; } } gData.cp += len; return true; }