Advertisement
shchuko

Untitled

Dec 19th, 2021 (edited)
2,537
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. static fsw_status_t
  2. fsw_hfsplus_bt_search(struct fsw_hfsplus_dnode *bt, /* in */ HFSPlusBTKey *sk, /* in */
  3.                       k_cmp_t k_cmp, /* in */ BTNodeDescriptor *btnode, /* out */
  4.                       fsw_u32 *rec_num /* out */)
  5. {
  6.     fsw_u32      node;
  7.     fsw_u16      rec, lo, hi;
  8.     HFSPlusBTKey *tk;    
  9.     int          cmp;
  10.     fsw_status_t status;
  11.     node = bt->bt_root;
  12.     for (;;) {
  13.         status = fsw_hfsplus_read(bt, (fsw_u64)node * bt->bt_ndsz,
  14.                                   bt->bt_ndsz, btnode);
  15.         if (status)
  16.             return status;
  17.         if ((void *)btnode + sizeof(BTNodeDescriptor) !=
  18.             (void *)fsw_hfsplus_btnode_get_rec(btnode, bt->bt_ndsz, 0))
  19.             return FSW_VOLUME_CORRUPTED;
  20.         lo = 0;
  21.         hi = fsw_u16_be_swap(btnode->numRecords) - 1;
  22.         while (lo <= hi) {
  23.              rec = (lo + hi) >> 1;
  24.              tk = fsw_hfsplus_btnode_get_rec(btnode, bt->bt_ndsz, rec);
  25.              cmp = k_cmp(tk, sk);
  26.              if (cmp < 0)      // (tk < sk)
  27.                  lo = rec + 1;
  28.              else if (cmp > 0) // (tk > sk)
  29.                  hi = rec - 1;
  30.              else {            // (tk == sk)
  31.                  if (btnode->kind != kBTLeafNode) {
  32.                      hi = rec;
  33.                      break;
  34.                  }
  35.                  *rec_num = rec;
  36.                  return FSW_SUCCESS;
  37.              }
  38.         }
  39.         if (btnode->kind != kBTIndexNode)
  40.             break;
  41.         tk = fsw_hfsplus_btnode_get_rec(btnode, bt->bt_ndsz, hi);
  42.         node = fsw_hfsplus_bt_idx_get_child(tk);
  43.     }
  44.     return FSW_NOT_FOUND;
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement