+ prop = (OSData *) regEntry->getProperty( gIODTPersistKey );
+ if( prop) {
+ persist = (IODTPersistent *) prop->getBytesNoCopy();
+ compare = persist->compareFunc;
+ } else
+ compare = DefaultCompare;
+
+ for( ok = false;
+ range < endRanges;
+ range += (childCells + addressCells) ) {
+
+ // is cell start within range?
+ diff = (*compare)( childAddressCells, cell, range );
+
+ bcopy(range, endCell, childAddressCells * sizeof(UInt32));
+ endCell[childAddressCells - 1] += range[childCells + addressCells - 1];
+ diff2 = (*compare)( childAddressCells, cell, endCell );
+
+ if ((diff < 0) || (diff2 >= 0))
+ continue;
+
+ ok = (0 == cell[childCells - 1]);
+ if (!ok)
+ {
+ // search for cell end
+ bcopy(cell, endCell, childAddressCells * sizeof(UInt32));
+ endCell[childAddressCells - 1] += cell[childCells - 1] - 1;
+ lookRange = startRange;
+ for( ;
+ lookRange < endRanges;
+ lookRange += (childCells + addressCells) )
+ {
+ // is cell >= range start?
+ endDiff = (*compare)( childAddressCells, endCell, lookRange );
+ if( endDiff < 0)
+ continue;
+ if ((endDiff - cell[childCells - 1] + 1 + lookRange[childAddressCells + addressCells - 1])
+ == (diff + range[childAddressCells + addressCells - 1]))
+ {
+ ok = true;
+ break;
+ }
+ }
+ if (!ok)
+ continue;
+ }
+ offset += diff;
+ break;
+ }