/* * Returns * arr in case of success * NULL in case of failure */ static ai_arr * ai_arr_insert(ai_arr *arr, cf_digest *dig, bool *found) { int idx = ai_arr_find(arr, dig); // already found if (idx >= 0) { *found = true; return arr; } if (arr->used == arr->capacity) { arr = ai_arr_expand(arr); } memcpy(&arr->data[arr->used * CF_DIGEST_KEY_SZ], dig, CF_DIGEST_KEY_SZ); arr->used++; return arr; }
static ai_arr * ai_arr_delete(ai_arr *arr, cf_digest *dig, bool *notfound) { int idx = ai_arr_find(arr, dig); // Nothing to delete if (idx < 0) { *notfound = true; return arr; } if (idx != arr->used - 1) { int dest_offset = idx * CF_DIGEST_KEY_SZ; int src_offset = (arr->used - 1) * CF_DIGEST_KEY_SZ; // move last element memcpy(&arr->data[dest_offset], &arr->data[src_offset], CF_DIGEST_KEY_SZ); } arr->used--; return ai_arr_shrink(arr); }