1 4 package gnu.kawa.xml; 5 import gnu.lists.*; 6 import gnu.xml.*; 7 8 13 14 public class SortedNodes extends Nodes 15 { 16 int nesting = 0; 17 18 int compareIndex(int index, AbstractSequence seq2, int ipos2) 19 { 20 int datum = data[index]; 21 if (datum != POSITION_PAIR_FOLLOWS) 22 throw new RuntimeException ("invalid kind of value to compare"); 23 AbstractSequence seq = (AbstractSequence) objects[getIntN(index+1)]; 24 return AbstractSequence.compare(seq, getIntN(index+3), 25 seq2, ipos2); 26 } 27 28 35 int find (int start, int count, AbstractSequence seq, int ipos) 36 { 37 int lo = 0; 38 int hi = count; 39 while (lo < hi) 43 { 44 int mid = (lo + hi) >> 1; 45 int cmp = compareIndex(start + POS_SIZE * mid, seq, ipos); 46 if (cmp == 0) 47 return -1; 48 if (cmp > 0) 49 hi = mid; 50 else 51 lo = mid + 1; 52 } 53 return start + POS_SIZE * lo; 54 } 55 56 public void writePosition(AbstractSequence seq, int ipos) 57 { 58 if (count > 0) 59 { 60 int lastIndex = gapStart - POS_SIZE; 61 int cmp = compareIndex(lastIndex, seq, ipos); 62 if (cmp < 0) 63 { 64 int i = gapEnd; 66 int end = data.length; 67 i = find (i, (end - i) / POS_SIZE, seq, ipos); 70 if (i < 0) 71 return; 72 int delta = i - gapEnd; 73 if (delta > 0) 74 { 75 System.arraycopy(data, gapEnd, data, gapStart, delta); 76 gapEnd = i; 77 gapStart += delta; 78 } 79 } 80 else if (cmp == 0) 81 return; 82 else 83 { 84 int i = find (0, lastIndex / POS_SIZE, seq, ipos); 85 if (i < 0) 86 return; 87 int delta = gapStart - i; 88 if (delta > 0) 89 { 90 System.arraycopy(data, i, data, gapEnd - delta, delta); 91 gapStart = i; 92 gapEnd -= delta; 93 } 94 } 95 } 96 super.writePosition(seq, ipos); 97 } 98 99 } 100 | Popular Tags |