- for (mid_up = mid; !flist->files[mid_up]->basename; mid_up++) {}
- if (mid_up <= high)
- ret = f_name_cmp(flist->files[mid_up], f);
- else
- ret = 1;
+ if (flist->files[mid]->basename)
+ mid_up = mid;
+ else if (flist->files[mid]->dir.depth) {
+ mid_up = mid + flist->files[mid]->dir.depth;
+ if (mid_up < mid) {
+ high = mid_up;
+ continue;
+ }
+ } else {
+ /* Scan for the next non-empty entry and cache
+ * the distance so we never do this again. */
+ mid_up = mid;
+ while (++mid_up <= high
+ && !flist->files[mid_up]->basename) {}
+ if (mid_up > high) {
+ high = mid;
+ while (--high >= low
+ && !flist->files[high]->basename) {}
+ flist->files[mid]->dir.depth = high - mid;
+ continue;
+ }
+ flist->files[mid]->dir.depth = mid_up - mid;
+ }
+ ret = f_name_cmp(flist->files[mid_up], f);