R_API bool r_mixed_change_end(RMixed *m, void *p) { int i; void *q; for (i=0; i<RMIXED_MAXKEYS; i++) { if (m->keys[i]) { RHashTable *ht = m->keys[i]->hash.ht; RHashTable64 *ht64 = m->keys[i]->hash.ht64; ut64 newstate = r_mixed_get_value (i, m->keys[i]->size, p); if (newstate != m->state[i]) { // rehash this pointer RListIter *iter; RList *list = r_mixed_get (m, i, m->state[i]); if (list == NULL) { eprintf ("RMixed internal corruption?\n"); return false; } /* No _safe loop necessary because we return immediately after the delete. */ r_list_foreach (list, iter, q) { if (q == p) { r_list_delete (list, iter); break; } } if (r_list_empty (list)) { // delete hash entry r_list_free (list); switch (m->keys[i]->size) { case 1: case 2: case 4: r_hashtable_remove (ht, m->state[i]); break; case 8: r_hashtable64_remove (ht64, m->state[i]); break; } } switch (m->keys[i]->size) { case 1: case 2: case 4: list = r_hashtable_lookup (ht, (ut32)newstate); if (!list) { list = r_list_new (); r_hashtable_insert (ht, (ut32)newstate, list); } r_list_append (list, p); break; case 8: list = r_hashtable64_lookup (ht64, newstate); if (!list) { list = r_list_new (); r_hashtable64_insert (ht64, newstate, list); } r_list_append (list, p); break; } } }
R_API void r_anal_state_insert_bb(RAnalState* state, RAnalBlock *bb) { if (!state || !bb) { return; } if (!r_anal_state_search_bb (state, bb->addr) && state->current_fcn) { r_list_append (state->current_fcn->bbs, bb); state->bytes_consumed += state->current_bb->op_sz; if (!r_hashtable64_insert(state->ht, bb->addr, bb)) { eprintf ("Inserted bb 0x%04"PFMT64x" failure\n", bb->addr); } } }
R_API void r_anal_state_insert_bb (RAnalState* state, RAnalBlock *bb) { if (!state || !bb) return; if (r_anal_state_search_bb (state, bb->addr) == NULL && state->current_fcn) { RAnalBlock *tmp_bb; IFDBG eprintf ("Inserting bb 0x%04"PFMT64x" into hash table\n", bb->addr); r_list_append(state->current_fcn->bbs, bb); state->bytes_consumed += state->current_bb->op_sz; IFDBG eprintf ("[--] Consumed 0x%02x bytes, for a total of 0x%02x\n", (short )state->current_bb->op_sz, (short) state->bytes_consumed); if (r_hashtable64_insert(state->ht, bb->addr, bb)) { IFDBG eprintf ("Inserted bb 0x%04"PFMT64x" successfully inserted into hashtable\n", bb->addr); } IFDBG { tmp_bb = r_hashtable64_lookup(state->ht, bb->addr); IFDBG eprintf ("Inserted bb 0x%04"PFMT64x" matches one in hash table: %02x.\n", bb->addr, bb->addr == tmp_bb->addr); } }
R_API int r_mixed_add (RMixed *m, void *p) { RHashTable *ht; RHashTable64 *ht64; RList *list = NULL; ut64 value; int i, size, ret = false;; r_list_append (m->list, p); for (i=0; i<RMIXED_MAXKEYS; i++) { if (!m->keys[i]) continue; size = m->keys[i]->size; value = r_mixed_get_value (i, size, p); switch (size) { case 1: case 2: case 4: ht = m->keys[i]->hash.ht; list = r_hashtable_lookup (ht, (ut32)value); if (!list) { list = r_list_new (); r_hashtable_insert (ht, (ut32)value, list); } r_list_append (list, p); ret = true; break; case 8: ht64 = m->keys[i]->hash.ht64; list = r_hashtable64_lookup (ht64, value); if (!list) { list = r_list_new (); r_hashtable64_insert (ht64, value, list); } r_list_append (list, p); ret = true; break; } } return ret; }