R_API void btree_cleartree(struct btree_node *proot, BTREE_DEL(del)) { if (proot!=NULL) { btree_cleartree (proot->left, del); btree_cleartree (proot->right, del); if (del) del (proot->data); free (proot); } }
int main() { struct btree_node *n, *bt = NULL; //btree_init(&bt); struct mydata foo = { 10, "hello" }; struct mydata bar = { 20, "world" }; printf("EMPTY TREE: %d\n", btree_empty(&bt)); btree_add(&bt, &foo, mycmp); btree_add(&bt, &bar, mycmp); printf("EMPTY TREE: %d\n", btree_empty(&bt)); printf("==== go search ====\n"); /* find existent data */ struct mydata *p = btree_get(bt, &bar, mycmp); shownode("result for 20: ", p); printf("==== go search ====\n"); /* find unexistent data */ struct mydata nop = { 15, NULL }; p = btree_get(bt, &nop, mycmp); shownode("result for 15: ", p); printf("==== go get hittest ====\n"); n = btree_hittest(bt, NULL); shownode("hitest is: ", p); printf("==== go remove 20 ====\n"); if (btree_del(bt, &bar, mycmp, NULL)) printf("node found and removed\n"); else printf("oops\n"); printf("==== go search ====\n"); /* find existent data */ p = btree_get(bt, &bar, mycmp); shownode("result for 20: ", p); printf("==== go search ====\n"); /* find existent data */ p = btree_get(bt, &foo, mycmp); shownode("result for 10: ", p); btree_cleartree(bt, NULL); return 0; }
struct r_bin_mz_segment_t * r_bin_mz_get_segments(const struct r_bin_mz_obj_t *bin) { #if 0 int i; struct r_bin_mz_segment_t *ret; const MZ_image_relocation_entry * const relocs = bin->relocation_entries; const int num_relocs = bin->dos_header->num_relocs; eprintf ("cs 0x%x\n", bin->dos_header->cs); eprintf ("ss 0x%x\n", bin->dos_header->ss); for (i = 0; i < num_relocs; i++) { eprintf ("0x%08x segment 0x%08lx\n", relocs[i].offset, relocs[i].segment); // ut65 paddr = r_bin_mz_seg_to_paddr (bin, relocs[i].segment) + relocs[i].offset; // eprintf ("pa 0x%08llx\n", paddr); } btree_add (&tree, (void *)&first_segment, cmp_segs); /* Add segment address of stack segment if it's resides inside dos executable. */ if (r_bin_mz_seg_to_paddr (bin, stack_segment) < bin->dos_file_size) { btree_add (&tree, (void *)&stack_segment, cmp_segs); } return NULL; #endif #if 1 struct btree_node *tree; struct r_bin_mz_segment_t *ret; ut16 *segments, *curr_seg; int i, num_segs; ut64 paddr; const ut16 first_segment = 0; const ut16 stack_segment = bin->dos_header->ss; const MZ_image_relocation_entry * const relocs = bin->relocation_entries; const int num_relocs = bin->dos_header->num_relocs; const ut64 last_parag = ((bin->dos_file_size + 0xF) >> 4) - \ bin->dos_header->header_paragraphs; btree_init (&tree); for (i = 0; i < num_relocs; i++) { paddr = r_bin_mz_seg_to_paddr (bin, relocs[i].segment) + relocs[i].offset; if ((paddr + 2) < bin->dos_file_size) { curr_seg = (ut16 *)(bin->b->buf + paddr); /* Add segment only if it's located inside dos executable data */ if (r_read_le16 (curr_seg) <= last_parag) { btree_add (&tree, curr_seg, cmp_segs); } } } /* Add segment address of first segment to make sure that it will be added. If relocations empty or there isn't first segment in relocations.) */ btree_add (&tree, (void *)&first_segment, cmp_segs); /* Add segment address of stack segment if it's resides inside dos executable. */ if (r_bin_mz_seg_to_paddr (bin, stack_segment) < bin->dos_file_size) { btree_add (&tree, (void *)&stack_segment, cmp_segs); } if (!num_relocs) { btree_cleartree (tree, NULL); return NULL; } segments = calloc (1 + num_relocs, sizeof (*segments)); if (!segments) { eprintf ("Error: calloc (segments)\n"); btree_cleartree (tree, NULL); return NULL; } curr_seg = segments; btree_traverse (tree, 0, &curr_seg, trv_segs); num_segs = curr_seg - segments; ret = calloc (num_segs + 1, sizeof (struct r_bin_mz_segment_t)); if (!ret) { free (segments); btree_cleartree (tree, NULL); eprintf ("Error: calloc (struct r_bin_mz_segment_t)\n"); return NULL; } btree_cleartree (tree, NULL); ret[0].paddr = r_bin_mz_seg_to_paddr (bin, segments[0]); for (i = 1; i < num_segs; i++) { ret[i].paddr = r_bin_mz_seg_to_paddr (bin, segments[i]); ret[i - 1].size = ret[i].paddr - ret[i - 1].paddr; } ret[i - 1].size = bin->dos_file_size - ret[i - 1].paddr; ret[i].last = 1; free (segments); return ret; #endif }