/// <summary> set cursor position /// This method can only set the cursor position /// of an VTDNav object identical to its internal copy /// </summary> /// <param name="vn"> /// </param> /// <returns> /// /// </returns> public bool setCursorPosition(VTDNav vn) { if (vn1 != vn || ba == null || ba[0] == -2) { return(false); } for (int i = 0; i < vn.nestingLevel; i++) { vn.context[i] = ba[i]; } if (vn.shallowDepth) { vn.l1index = ba[vn.nestingLevel]; vn.l2index = ba[vn.nestingLevel + 1]; vn.l3index = ba[vn.nestingLevel + 2]; vn.l2lower = ba[vn.nestingLevel + 3]; vn.l2upper = ba[vn.nestingLevel + 4]; vn.l3lower = ba[vn.nestingLevel + 5]; vn.l3upper = ba[vn.nestingLevel + 6]; if (ba[vn.nestingLevel + 7] < 0) { vn.atTerminal = true; } else { vn.atTerminal = false; } vn.LN = ba[vn.nestingLevel + 7] & 0x7fffffff; } else { VTDNav_L5 vnl = (VTDNav_L5)vn; vnl.l1index = ba[vn.nestingLevel]; vnl.l2index = ba[vn.nestingLevel + 1]; vnl.l3index = ba[vn.nestingLevel + 2]; vnl.l4index = ba[vn.nestingLevel + 3]; vnl.l5index = ba[vn.nestingLevel + 4]; vnl.l2lower = ba[vn.nestingLevel + 5]; vnl.l2upper = ba[vn.nestingLevel + 6]; vnl.l3lower = ba[vn.nestingLevel + 7]; vnl.l3upper = ba[vn.nestingLevel + 8]; vnl.l4lower = ba[vn.nestingLevel + 9]; vnl.l4upper = ba[vn.nestingLevel + 10]; vnl.l5lower = ba[vn.nestingLevel + 11]; vnl.l5upper = ba[vn.nestingLevel + 12]; if (ba[vn.nestingLevel + 13] < 0) { vn.atTerminal = true; } else { vn.atTerminal = false; } vn.LN = ba[vn.nestingLevel + 13] & 0x7fffffff; } return(true); }
/// <summary> Record the cursor position /// This method is implemented to be lenient on loading in /// that it can load nodes from any VTDNav object /// if vn is null, return false /// /// </summary> /// <param name="vn"> /// </param> /// <returns> /// /// </returns> public bool recordCursorPosition(VTDNav vn) { if (vn == null) { return(false); } if (vn == vn1) { } else { bind(vn); } for (int i = 0; i < vn.nestingLevel; i++) { ba[i] = vn1.context[i]; } if (vn.shallowDepth) { ba[vn.nestingLevel] = vn.l1index; ba[vn.nestingLevel + 1] = vn.l2index; ba[vn.nestingLevel + 2] = vn.l3index; ba[vn.nestingLevel + 3] = vn.l2lower; ba[vn.nestingLevel + 4] = vn.l2upper; ba[vn.nestingLevel + 5] = vn.l3lower; ba[vn.nestingLevel + 6] = vn.l3upper; //ba[vn.nestingLevel + 7]=(vn.atTerminal == true)?1:0; ba[vn.nestingLevel + 7] = (vn.atTerminal == true) ? (vn.LN | unchecked ((int)0x80000000)) : vn.LN; } else { VTDNav_L5 vnl = (VTDNav_L5)vn; ba[vn.nestingLevel] = vnl.l1index; ba[vn.nestingLevel + 1] = vnl.l2index; ba[vn.nestingLevel + 2] = vnl.l3index; ba[vn.nestingLevel + 3] = vnl.l4index; ba[vn.nestingLevel + 4] = vnl.l5index; ba[vn.nestingLevel + 5] = vnl.l2lower; ba[vn.nestingLevel + 6] = vnl.l2upper; ba[vn.nestingLevel + 7] = vnl.l3lower; ba[vn.nestingLevel + 8] = vnl.l3upper; ba[vn.nestingLevel + 9] = vnl.l4lower; ba[vn.nestingLevel + 10] = vnl.l4upper; ba[vn.nestingLevel + 11] = vnl.l5lower; ba[vn.nestingLevel + 12] = vnl.l5upper; //ba[vn.nestingLevel + 7]=(vn.atTerminal == true)?1:0; ba[vn.nestingLevel + 13] = (vn.atTerminal == true) ? (vn.LN | unchecked ((int)0x80000000)) : vn.LN; } return(true); }
/// <summary> /// This function records the position of VN into an internal buffer /// </summary> public void record() { //add the context and int i; switch (vn.context[0]) { case -1: unchecked { fib.append((int)(0xff | 0x80000000)); } size++; position++; count++; break; case 0: if (vn.atTerminal == false) { fib.append(0); count++; } else { unchecked { fib.append((int)0x80000000); } count += 2; } size++; position++; if (vn.atTerminal == true) { fib.append(vn.LN); } break; case 1: if (vn.atTerminal == false) { fib.append(1); fib.append(vn.context[1]); fib.append(vn.l1index); size++; position++; count += 3; } else { unchecked { fib.append((int)0x80000001); } fib.append(vn.context[1]); fib.append(vn.l1index); fib.append(vn.LN); size++; position++; count += 4; } break; case 2: if (vn.atTerminal == false) { fib.append(2); count += 7; } else { unchecked { fib.append((int)0x80000002); } count += 8; } fib.append(vn.context[1]); fib.append(vn.context[2]); fib.append(vn.l1index); fib.append(vn.l2lower); fib.append(vn.l2upper); fib.append(vn.l2index); size++; position++; if (vn.atTerminal == true) { fib.append(vn.LN); } break; case 3: if (vn.atTerminal == false) { fib.append(3); count += 11; } else { unchecked { fib.append((int)0x80000003); } count += 12; } fib.append(vn.context[1]); fib.append(vn.context[2]); fib.append(vn.context[3]); fib.append(vn.l1index); fib.append(vn.l2lower); fib.append(vn.l2upper); fib.append(vn.l2index); fib.append(vn.l3lower); fib.append(vn.l3upper); fib.append(vn.l3index); size++; position++; if (vn.atTerminal == true) { fib.append(vn.LN); } break; default: if (vn.shallowDepth) { if (vn.atTerminal == false) { i = vn.context[0]; fib.append(i); count += i + 8; } else { i = vn.context[0]; unchecked { fib.append((int)(i | 0x80000000)); } count += i + 9; } for (int k = 1; k <= i; k++) { fib.append(vn.context[k]); } fib.append(vn.l1index); fib.append(vn.l2lower); fib.append(vn.l2upper); fib.append(vn.l2index); fib.append(vn.l3lower); fib.append(vn.l3upper); fib.append(vn.l3index); size++; position++; if (vn.atTerminal) { fib.append(vn.LN); } } else { VTDNav_L5 vnl = (VTDNav_L5)vn; switch (vn.context[0]) { case 4: if (vn.atTerminal == false) { fib.append(4); count += 15; } else { unchecked { fib.append((int)0x80000004); } count += 16; } fib.append(vn.context[1]); fib.append(vn.context[2]); fib.append(vn.context[3]); fib.append(vn.context[4]); fib.append(vn.l1index); fib.append(vn.l2lower); fib.append(vn.l2upper); fib.append(vn.l2index); fib.append(vn.l3lower); fib.append(vn.l3upper); fib.append(vn.l3index); fib.append(vnl.l4lower); fib.append(vnl.l4upper); fib.append(vnl.l4index); size++; position++; if (vn.atTerminal == true) { fib.append(vn.LN); } break; case 5: if (vn.atTerminal == false) { fib.append(5); count += 19; } else { unchecked { fib.append((int)0x80000005); } count += 20; } fib.append(vn.context[1]); fib.append(vn.context[2]); fib.append(vn.context[3]); fib.append(vn.context[4]); fib.append(vn.context[5]); fib.append(vn.l1index); fib.append(vn.l2lower); fib.append(vn.l2upper); fib.append(vn.l2index); fib.append(vn.l3lower); fib.append(vn.l3upper); fib.append(vn.l3index); fib.append(vnl.l4lower); fib.append(vnl.l4upper); fib.append(vnl.l4index); fib.append(vnl.l5lower); fib.append(vnl.l5upper); fib.append(vnl.l5index); size++; position++; if (vn.atTerminal == true) { fib.append(vn.LN); } break; default: if (vn.atTerminal == false) { i = vn.context[0]; fib.append(i); count += i + 14; } else { i = vn.context[0]; fib.append((int)(i | 0x80000000)); count += i + 15; } for (int k = 1; k <= i; k++) { fib.append(vn.context[k]); } fib.append(vn.l1index); fib.append(vn.l2lower); fib.append(vn.l2upper); fib.append(vn.l2index); fib.append(vn.l3lower); fib.append(vn.l3upper); fib.append(vn.l3index); fib.append(vnl.l4lower); fib.append(vnl.l4upper); fib.append(vnl.l4index); fib.append(vnl.l5lower); fib.append(vnl.l5upper); fib.append(vnl.l5index); size++; position++; if (vn.atTerminal) { fib.append(vn.LN); } break; } } break; } }
/// <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_Renamed_Field) { 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: if (vn.shallowDepth) { // vn.context[0] = i; for (j = 0; 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 + 9; } else { vn.atTerminal = false; count += i + 8; } break; } else { VTDNav_L5 vnl = (VTDNav_L5)vn; switch (i) { case 4: vn.context[0] = 4; vn.context[1] = fib.intAt(count + 1); vn.context[2] = fib.intAt(count + 2); vn.context[3] = fib.intAt(count + 3); vn.context[4] = fib.intAt(count + 4); vn.l1index = fib.intAt(count + 5); vn.l2lower = fib.intAt(count + 6); vn.l2upper = fib.intAt(count + 7); vn.l2index = fib.intAt(count + 8); vn.l3lower = fib.intAt(count + 9); vn.l3upper = fib.intAt(count + 10); vn.l3index = fib.intAt(count + 11); vnl.l4lower = fib.intAt(count + 12); vnl.l4upper = fib.intAt(count + 13); vnl.l4index = fib.intAt(count + 14); if (b == false) { vn.atTerminal = true; vn.LN = fib.intAt(count + 15); count += 16; } else { vn.atTerminal = false; count += 15; } break; case 5: vn.context[0] = 5; vn.context[1] = fib.intAt(count + 1); vn.context[2] = fib.intAt(count + 2); vn.context[3] = fib.intAt(count + 3); vn.context[4] = fib.intAt(count + 4); vn.context[5] = fib.intAt(count + 5); vn.l1index = fib.intAt(count + 6); vn.l2lower = fib.intAt(count + 7); vn.l2upper = fib.intAt(count + 8); vn.l2index = fib.intAt(count + 9); vn.l3lower = fib.intAt(count + 10); vn.l3upper = fib.intAt(count + 11); vn.l3index = fib.intAt(count + 12); vnl.l4lower = fib.intAt(count + 13); vnl.l4upper = fib.intAt(count + 14); vnl.l4index = fib.intAt(count + 15); vnl.l5lower = fib.intAt(count + 16); vnl.l5upper = fib.intAt(count + 17); vnl.l5index = fib.intAt(count + 18); if (b == false) { vn.atTerminal = true; vn.LN = fib.intAt(count + 19); count += 20; } else { vn.atTerminal = false; count += 19; } 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); vnl.l4lower = fib.intAt(count + i + 7); vnl.l4upper = fib.intAt(count + i + 8); vnl.l4index = fib.intAt(count + i + 9); vnl.l5lower = fib.intAt(count + i + 10); vnl.l5upper = fib.intAt(count + i + 11); vnl.l5index = fib.intAt(count + i + 12); if (b == false) { vn.atTerminal = true; vn.LN = fib.intAt(count + i + 13); count += i + 15; } else { vn.atTerminal = false; count += i + 14; } break; } } break; } position++; return(vn.getCurrentIndex()); } return(-1); }
private int handleLevel4() { //l2 int sp; VTDNav_L5 vnl = (VTDNav_L5)vn; if (prevLocation != -1) { sp = increment(prevLocation); } else { // fetch lclower and lcupper lcLower = vnl.l4Buffer.lower32At(vnl.l4index); if (lcLower != -1) { lcUpper = vnl.l5Buffer.size_Renamed_Field - 1; //5 int size = vnl.l4Buffer.size_Renamed_Field; //4 for (int i = vnl.l4index + 1; i < size; i++) { //4 int temp = vnl.l4Buffer.lower32At(i); //4 if (temp != 0xffffffff) { lcUpper = temp - 1; break; } } } sp = index + 1; } // check for l3lower and l3upper if (lcLower != -1) { // at least one child element int temp1 = vnl.l5Buffer.intAt(lcLower); int temp2 = vnl.l5Buffer.intAt(lcUpper); lcIndex = (lcIndex != -1) ? lcIndex : lcLower; while (sp < vn.vtdSize) { int s = vnl.l5Buffer.intAt(lcIndex); //int s = vn.l2Buffer.upper32At(lcIndex); if (sp >= temp1 && sp < temp2) { if (sp == s) { lcIndex++; sp = vnl.l5Buffer.intAt(lcIndex) - 1; //boolean b = false; while (vn.getTokenDepth(sp) == 4) { sp--; // b = true; } //if (b) sp++; //continue; } if (isText(sp) == true && vn.getTokenDepth(sp) == 4) { prevLocation = sp; return(sp); } sp++; } else if (sp < temp1) { if (isText(sp) == true && vn.getTokenDepth(sp) == 4) { prevLocation = sp; return(sp); } sp++; } else { //if (sp == temp2) { // last child element //} else if (isText(sp) == true && vn.getTokenDepth(sp) == 4) { prevLocation = sp; return(sp); } else if ((vn.getTokenType(sp) == VTDNav.TOKEN_STARTING_TAG && vn.getTokenDepth(sp) < 5) || vn.getTokenDepth(sp) < 4) { break; } sp++; } } //prevLocation = vtdSize-1; return(-1); } else { // no child elements if (sp >= vn.vtdSize) { return(-1); } int d = vn.getTokenDepth(sp); int type = vn.getTokenType(sp); while (sp < vn.vtdSize && d >= 4 && !(d == 4 && type == VTDNav.TOKEN_STARTING_TAG)) { // the last condition indicates the start of the next sibling element if (isText(sp) == true && vn.getTokenDepth(sp) == 4) { prevLocation = sp; return(sp); } sp++; d = vn.getTokenDepth(sp); type = vn.getTokenType(sp); } //prevLocation = vtdSize-1; return(-1); } }