// i must point at the (possibly imaginary) opening bracket ("{") // index returned is index of closing bracket + 1 (or l(tok)) static int tok_findEndOfBlock_IContentsIndexedList2(IContentsIndexedList2 tok, int i) { int n = l(tok); // find opening & closing brackets after start index TreeSet openers = tok.indicesOf_treeSetOfHasIndex("{"); TreeSet closers = tok.indicesOf_treeSetOfHasIndex("}"); // now step through both sets int level = 1; int nextOpener = toIntOr(openers.higher(i), n); int nextCloser = toIntOr(closers.higher(i), n); while true { if (nextOpener < nextCloser) { i = nextOpener; ++level; nextOpener = toIntOr(openers.higher(i), n); } else if (nextOpener > nextCloser) { i = nextCloser; if (--level == 0) ret i+1; nextCloser = toIntOr(closers.higher(i), n); } else // opener and closer in one place!? we must be at the end. ret i; } }