internal void GenerateFindFirstChar() {
_textposV = DeclareInt();
_textV = DeclareString();
_tempV = DeclareInt();
_temp2V = DeclareInt();
if (0 != (_anchors & (RegexFCD.Beginning | RegexFCD.Start | RegexFCD.EndZ | RegexFCD.End))) {
if (!_code._rightToLeft) {
if (0 != (_anchors & RegexFCD.Beginning)) {
Label l1 = DefineLabel();
Ldthisfld(_textposF);
Ldthisfld(_textbegF);
Ble(l1);
Ldthis();
Ldthisfld(_textendF);
Stfld(_textposF);
Ldc(0);
Ret();
MarkLabel(l1);
}
if (0 != (_anchors & RegexFCD.Start)) {
Label l1 = DefineLabel();
Ldthisfld(_textposF);
Ldthisfld(_textstartF);
Ble(l1);
Ldthis();
Ldthisfld(_textendF);
Stfld(_textposF);
Ldc(0);
Ret();
MarkLabel(l1);
}
if (0 != (_anchors & RegexFCD.EndZ)) {
Label l1 = DefineLabel();
Ldthisfld(_textposF);
Ldthisfld(_textendF);
Ldc(1);
Sub();
Bge(l1);
Ldthis();
Ldthisfld(_textendF);
Ldc(1);
Sub();
Stfld(_textposF);
MarkLabel(l1);
}
if (0 != (_anchors & RegexFCD.End)) {
Label l1 = DefineLabel();
Ldthisfld(_textposF);
Ldthisfld(_textendF);
Bge(l1);
Ldthis();
Ldthisfld(_textendF);
Stfld(_textposF);
MarkLabel(l1);
}
}
else {
if (0 != (_anchors & RegexFCD.End)) {
Label l1 = DefineLabel();
Ldthisfld(_textposF);
Ldthisfld(_textendF);
Bge(l1);
Ldthis();
Ldthisfld(_textbegF);
Stfld(_textposF);
Ldc(0);
Ret();
MarkLabel(l1);
}
if (0 != (_anchors & RegexFCD.EndZ)) {
Label l1 = DefineLabel();
Label l2 = DefineLabel();
Ldthisfld(_textposF);
Ldthisfld(_textendF);
Ldc(1);
Sub();
Blt(l1);
Ldthisfld(_textposF);
Ldthisfld(_textendF);
Beq(l2);
Ldthisfld(_textF);
Ldthisfld(_textposF);
Callvirt(_getcharM);
Ldc((int)'\n');
Beq(l2);
MarkLabel(l1);
Ldthis();
Ldthisfld(_textbegF);
Stfld(_textposF);
Ldc(0);
Ret();
MarkLabel(l2);
}
if (0 != (_anchors & RegexFCD.Start)) {
Label l1 = DefineLabel();
Ldthisfld(_textposF);
Ldthisfld(_textstartF);
Bge(l1);
Ldthis();
Ldthisfld(_textbegF);
Stfld(_textposF);
Ldc(0);
Ret();
MarkLabel(l1);
}
if (0 != (_anchors & RegexFCD.Beginning)) {
Label l1 = DefineLabel();
Ldthisfld(_textposF);
Ldthisfld(_textbegF);
Ble(l1);
Ldthis();
Ldthisfld(_textbegF);
Stfld(_textposF);
MarkLabel(l1);
}
}
Ldc(1);
Ret();
}
else if (_bmPrefix != null && _bmPrefix._negativeUnicode == null) {
LocalBuilder chV = _tempV;
LocalBuilder testV = _tempV;
LocalBuilder limitV = _temp2V;
Label lDefaultAdvance = DefineLabel();
Label lAdvance = DefineLabel();
Label lFail = DefineLabel();
Label lStart = DefineLabel();
Label lOutOfRange = DefineLabel();
Label lPartialMatch = DefineLabel();
int chLast;
int i;
int beforefirst;
int last;
Label[] table;
if (!_code._rightToLeft) {
beforefirst = -1;
last = _bmPrefix._pattern.Length - 1;
}
else {
beforefirst = _bmPrefix._pattern.Length;
last = 0;
}
chLast = _bmPrefix._pattern[last];
Mvfldloc(_textF, _textV);
if (!_code._rightToLeft)
Ldthisfld(_textendF);
else
Ldthisfld(_textbegF);
Stloc(limitV);
Ldthisfld(_textposF);
if (!_code._rightToLeft) {
Ldc(_bmPrefix._pattern.Length - 1);
Add();
}
else {
Ldc(_bmPrefix._pattern.Length);
Sub();
}
Stloc(_textposV);
Br(lStart);
MarkLabel(lDefaultAdvance);
if (!_code._rightToLeft)
Ldc(_bmPrefix._pattern.Length);
else
Ldc(-_bmPrefix._pattern.Length);
MarkLabel(lAdvance);
Ldloc(_textposV);
Add();
Stloc(_textposV);
MarkLabel(lStart);
Ldloc(_textposV);
Ldloc(limitV);
if (!_code._rightToLeft)
BgeFar(lFail);
else
BltFar(lFail);
Rightchar();
if (_bmPrefix._caseInsensitive)
CallToLower();
Dup();
Stloc(chV);
Ldc(chLast);
BeqFar(lPartialMatch);
Ldloc(chV);
Ldc(_bmPrefix._lowASCII);
Sub();
Dup();
Stloc(chV);
Ldc(_bmPrefix._highASCII - _bmPrefix._lowASCII);
Bgtun(lDefaultAdvance);
table = new Label[_bmPrefix._highASCII - _bmPrefix._lowASCII + 1];
for (i = _bmPrefix._lowASCII; i <= _bmPrefix._highASCII; i++) {
if (_bmPrefix._negativeASCII[i] == beforefirst)
table[i - _bmPrefix._lowASCII] = lDefaultAdvance;
else
table[i - _bmPrefix._lowASCII] = DefineLabel();
}
Ldloc(chV);
_ilg.Emit(OpCodes.Switch, table);
for (i = _bmPrefix._lowASCII; i <= _bmPrefix._highASCII; i++) {
if (_bmPrefix._negativeASCII[i] == beforefirst)
continue;
MarkLabel(table[i - _bmPrefix._lowASCII]);
Ldc(_bmPrefix._negativeASCII[i]);
BrFar(lAdvance);
}
MarkLabel(lPartialMatch);
Ldloc(_textposV);
Stloc(testV);
for (i = _bmPrefix._pattern.Length - 2; i >= 0; i--) {
Label lNext = DefineLabel();
int charindex;
if (!_code._rightToLeft)
charindex = i;
else
charindex = _bmPrefix._pattern.Length - 1 - i;
Ldloc(_textV);
Ldloc(testV);
Ldc(1);
Sub(_code._rightToLeft);
Dup();
Stloc(testV);
Callvirt(_getcharM);
if (_bmPrefix._caseInsensitive)
CallToLower();
Ldc(_bmPrefix._pattern[charindex]);
Beq(lNext);
Ldc(_bmPrefix._positive[charindex]);
BrFar(lAdvance);
MarkLabel(lNext);
}
Ldthis();
Ldloc(testV);
if (_code._rightToLeft) {
Ldc(1);
Add();
}
Stfld(_textposF);
Ldc(1);
Ret();
MarkLabel(lFail);
Ldthis();
if (!_code._rightToLeft)
Ldthisfld(_textendF);
else
Ldthisfld(_textbegF);
Stfld(_textposF);
Ldc(0);
Ret();
}
else if (_fcPrefix == null) {
Ldc(1);
Ret();
}
else {
LocalBuilder cV = _temp2V;
LocalBuilder chV = _tempV;
Label l1 = DefineLabel();
Label l2 = DefineLabel();
Label l3 = DefineLabel();
Label l4 = DefineLabel();
Label l5 = DefineLabel();
Mvfldloc(_textposF, _textposV);
Mvfldloc(_textF, _textV);
if (!_code._rightToLeft) {
Ldthisfld(_textendF);
Ldloc(_textposV);
}
else {
Ldloc(_textposV);
Ldthisfld(_textbegF);
}
Sub();
Stloc(cV);
Ldloc(cV);
Ldc(0);
BleFar(l4);
MarkLabel(l1);
Ldloc(cV);
Ldc(1);
Sub();
Stloc(cV);
if (_code._rightToLeft)
Leftcharnext();
else
Rightcharnext();
if (_fcPrefix.CaseInsensitive)
CallToLower();
if (!RegexCharClass.IsSingleton(_fcPrefix.Prefix)) {
Ldstr(_fcPrefix.Prefix);
Call(_charInSetM);
BrtrueFar(l2);
}
else {
Ldc(RegexCharClass.SingletonChar(_fcPrefix.Prefix));
Beq(l2);
}
MarkLabel(l5);
Ldloc(cV);
Ldc(0);
if (!RegexCharClass.IsSingleton(_fcPrefix.Prefix))
BgtFar(l1);
else
Bgt(l1);
Ldc(0);
BrFar(l3);
MarkLabel(l2);
/*
// CURRENTLY DISABLED
// If for some reason we have a prefix we didn't use, use it now.
if (_bmPrefix != null) {
if (!_code._rightToLeft) {
Ldthisfld(_textendF);
Ldloc(_textposV);
}
else {
Ldloc(_textposV);
Ldthisfld(_textbegF);
}
Sub();
Ldc(_bmPrefix._pattern.Length - 1);
BltFar(l5);
for (int i = 1; i < _bmPrefix._pattern.Length; i++) {
Ldloc(_textV);
Ldloc(_textposV);
if (!_code._rightToLeft) {
Ldc(i - 1);
Add();
}
else {
Ldc(i);
Sub();
}
Callvirt(_getcharM);
if (!_code._rightToLeft)
Ldc(_bmPrefix._pattern[i]);
else
Ldc(_bmPrefix._pattern[_bmPrefix._pattern.Length - 1 - i]);
BneFar(l5);
}
}
*/
Ldloc(_textposV);
Ldc(1);
Sub(_code._rightToLeft);
Stloc(_textposV);
Ldc(1);
MarkLabel(l3);
Mvlocfld(_textposV, _textposF);
Ret();
MarkLabel(l4);
Ldc(0);
Ret();
}
}