private bool compNodeSetNodeSet(Expr left, Expr right, VTDNav vn, int op) { int i, i1 = 0, stackSize, s1; try { if (fib1 == null) { fib1 = new FastIntBuffer(BUF_SZ_EXP); } vn.push2(); stackSize = vn.contextStack2.size; while ((i = left.evalNodeSet(vn)) != -1) { i1 = getStringVal(vn, i); if (i1 != -1) { fib1.append(i1); } } left.reset(vn); vn.contextStack2.size = stackSize; vn.pop2(); vn.push2(); stackSize = vn.contextStack2.size; while ((i = right.evalNodeSet(vn)) != -1) { i1 = getStringVal(vn, i); if (i1 != -1) { s1 = fib1.size(); for (int k = 0; k < s1; k++) { bool b = compareVV(fib1.intAt(k), vn, i1, op); if (b) { fib1.clear(); vn.contextStack2.size = stackSize; vn.pop2(); right.reset(vn); return(true); } } } } vn.contextStack2.size = stackSize; vn.pop2(); right.reset(vn); fib1.clear(); return(false); } catch (Exception e) { fib1.clear(); throw new System.SystemException("Undefined behavior"); } }
/// <summary> /// /// This method set the cursor in VTDNav to the nodes as recorded /// in NodeRecorder, and return the output of "getCurrentIndex()" /// It is important to notice that you can only go forward, not /// backward /// /// </summary> /// <returns> @return int</returns> public int iterate() { int j, i; if (count < fib.size()) { i = fib.intAt(count); bool b = (i >= 0); if (b == false) { i = i & 0x7fffffff; } switch (i) { case 0xff: vn.context[0] = -1; vn.atTerminal = false; count++; break; case 0: vn.context[0] = 0; if (b == false) { vn.atTerminal = true; vn.LN = fib.intAt(count + 1); count += 2; } else { vn.atTerminal = false; count++; } break; case 1: vn.context[0] = 1; vn.context[1] = fib.intAt(count + 1); vn.l1index = fib.intAt(count + 2); if (b == false) { vn.atTerminal = true; vn.LN = fib.intAt(count + 3); count += 4; } else { vn.atTerminal = false; count += 3; } break; case 2: vn.context[0] = 2; vn.context[1] = fib.intAt(count + 1); vn.context[2] = fib.intAt(count + 2); vn.l1index = fib.intAt(count + 3); vn.l2lower = fib.intAt(count + 4); vn.l2upper = fib.intAt(count + 5); vn.l2index = fib.intAt(count + 6); if (b == false) { vn.atTerminal = true; vn.LN = fib.intAt(count + 7); count += 8; } else { vn.atTerminal = false; count += 7; } break; case 3: vn.context[0] = 3; vn.context[1] = fib.intAt(count + 1); vn.context[2] = fib.intAt(count + 2); vn.context[3] = fib.intAt(count + 3); vn.l1index = fib.intAt(count + 4); vn.l2lower = fib.intAt(count + 5); vn.l2upper = fib.intAt(count + 6); vn.l2index = fib.intAt(count + 7); vn.l3lower = fib.intAt(count + 8); vn.l3upper = fib.intAt(count + 9); vn.l3index = fib.intAt(count + 10); if (b == false) { vn.atTerminal = true; vn.LN = fib.intAt(count + 11); count += 12; } else { vn.atTerminal = false; count += 11; } break; default: vn.context[0] = i; for (j = 1; j < i; j++) { vn.context[j] = fib.intAt(count + j); } vn.l1index = fib.intAt(count + i); vn.l2lower = fib.intAt(count + i + 1); vn.l2upper = fib.intAt(count + i + 2); vn.l2index = fib.intAt(count + i + 3); vn.l3lower = fib.intAt(count + i + 4); vn.l3upper = fib.intAt(count + i + 5); vn.l3index = fib.intAt(count + i + 6); if (b == false) { vn.atTerminal = true; vn.LN = fib.intAt(count + 11); count += i + 8; } else { vn.atTerminal = false; count += i + 7; } break; } position++; return(vn.getCurrentIndex()); } return(-1); }