Remove RzBitmap in favor of RzBitvector (#3433)

This commit is contained in:
你不要过来啊 2023-03-27 00:29:30 +08:00 committed by GitHub
parent 4c7408a15a
commit 0e1bbd28f8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 6 additions and 169 deletions

View file

@ -274,14 +274,14 @@ static int rz_bin_dmp64_init_bmp_pages(struct rz_bin_dmp64_obj_t *obj) {
}
ut64 paddr_base = obj->bmp_header->FirstPage;
ut64 num_pages = obj->bmp_header->Pages;
RzBitmap *bitmap = rz_bitmap_new(num_pages);
rz_bitmap_set_bytes(bitmap, obj->bitmap, num_pages / 8);
RzBitVector *bitmap = rz_bv_new(num_pages);
rz_bv_set_from_bytes_le(bitmap, obj->bitmap, 0, num_pages);
ut64 num_bitset = 0;
bool create_new_page = true;
dmp_page_desc *page;
for (ut64 i = 0; i < num_pages; i++) {
if (!rz_bitmap_test(bitmap, i)) {
if (!rz_bv_get(bitmap, i)) {
create_new_page = true;
continue;
}
@ -292,7 +292,7 @@ static int rz_bin_dmp64_init_bmp_pages(struct rz_bin_dmp64_obj_t *obj) {
}
page = RZ_NEW0(dmp_page_desc);
if (!page) {
rz_bitmap_free(bitmap);
rz_bv_free(bitmap);
return false;
}
if (UT64_MUL_OVFCHK(i, DMP_PAGE_SIZE)) {
@ -310,11 +310,11 @@ static int rz_bin_dmp64_init_bmp_pages(struct rz_bin_dmp64_obj_t *obj) {
RZ_LOG_ERROR("The total present pages number (%" PFMT64u ") in the header "
"does not match with the counted one (%" PFMT64u ").\n",
obj->bmp_header->TotalPresentPages, num_bitset);
rz_bitmap_free(bitmap);
rz_bv_free(bitmap);
return false;
}
rz_bitmap_free(bitmap);
rz_bv_free(bitmap);
return true;
}

View file

@ -66,7 +66,6 @@ rz_util_files = [
'rz_util/rz_base64.h',
'rz_util/rz_base91.h',
'rz_util/rz_big.h',
'rz_util/rz_bitmap.h',
'rz_util/rz_bitvector.h',
'rz_util/rz_buf.h',
'rz_util/rz_debruijn.h',

View file

@ -33,7 +33,6 @@
#include "rz_util/rz_base64.h"
#include "rz_util/rz_base91.h"
#include "rz_util/rz_buf.h"
#include "rz_util/rz_bitmap.h"
#include "rz_util/rz_bitvector.h"
#include "rz_util/rz_time.h"
#include "rz_util/rz_debruijn.h"

View file

@ -1,34 +0,0 @@
#ifndef RZ_BITMAP_H
#define RZ_BITMAP_H
#include <rz_types.h>
#if RZ_SYS_BITS == 4
#define BITWORD_BITS_SHIFT 5
#define RzBitword ut32
#else
#define BITWORD_BITS_SHIFT 6
#define RzBitword ut64
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct rz_bitmap_t {
size_t length;
RzBitword *bitmap;
} RzBitmap;
RZ_API RZ_OWN RzBitmap *rz_bitmap_new(size_t len);
RZ_API void rz_bitmap_set_bytes(RZ_NONNULL RzBitmap *b, RZ_NONNULL const ut8 *buf, size_t len);
RZ_API void rz_bitmap_free(RZ_NULLABLE RzBitmap *b);
RZ_API void rz_bitmap_set(RZ_NONNULL RzBitmap *b, size_t bit);
RZ_API void rz_bitmap_unset(RZ_NONNULL RzBitmap *b, size_t bit);
RZ_API int rz_bitmap_test(RZ_NONNULL RzBitmap *b, size_t bit);
#ifdef __cplusplus
}
#endif
#endif // RZ_BITMAP_H

View file

@ -1,89 +0,0 @@
// SPDX-FileCopyrightText: 2017-2020 pancake <pancake@nopcode.org>
// SPDX-FileCopyrightText: 2017-2020 crowell <crowell@bu.edu>
// SPDX-License-Identifier: LGPL-3.0-only
#include <rz_util.h>
#define BITMAP_TEST 0
#if RZ_SYS_BITS == 4
#define bitword_read rz_read_le32
#define bitword_write rz_write_le32
#else
#define bitword_read rz_read_le64
#define bitword_write rz_write_le64
#endif
#define BITWORD_BITS (sizeof(RzBitword) * 8)
#define BITWORD_BITS_MASK (BITWORD_BITS - 1)
#define BITWORD_MULT(bit) (((bit) + (BITWORD_BITS_MASK)) & ~(BITWORD_BITS_MASK))
#define BITWORD_TEST(x, y) (((x) >> (y)) & 1)
#define BITMAP_WORD_COUNT(bit) (BITWORD_MULT(bit) >> BITWORD_BITS_SHIFT)
RZ_API RZ_OWN RzBitmap *rz_bitmap_new(size_t len) {
if (len < 1) {
return NULL;
}
RzBitmap *b = RZ_NEW0(RzBitmap);
if (!b) {
return NULL;
}
b->bitmap = calloc(BITMAP_WORD_COUNT(len), sizeof(RzBitword));
if (!b->bitmap) {
free(b);
return NULL;
}
b->length = len;
return b;
}
RZ_API void rz_bitmap_set_bytes(RZ_NONNULL RzBitmap *b, RZ_NONNULL const ut8 *buf, size_t len) {
rz_return_if_fail(b && buf);
size_t blen = b->length << BITWORD_BITS_SHIFT;
if (blen < len) {
len = blen;
}
memcpy(b->bitmap, buf, len);
}
RZ_API void rz_bitmap_free(RZ_NULLABLE RzBitmap *b) {
if (!b) {
return;
}
free(b->bitmap);
free(b);
}
RZ_API void rz_bitmap_set(RZ_NONNULL RzBitmap *b, size_t bit) {
rz_return_if_fail(b);
if (bit < b->length) {
const size_t pos = bit >> BITWORD_BITS_SHIFT;
RzBitword value = bitword_read(&b->bitmap[pos]);
value |= ((RzBitword)1 << (bit & BITWORD_BITS_MASK));
bitword_write(&b->bitmap[pos], value);
}
}
RZ_API void rz_bitmap_unset(RZ_NONNULL RzBitmap *b, size_t bit) {
rz_return_if_fail(b);
if (bit < b->length) {
const size_t pos = bit >> BITWORD_BITS_SHIFT;
RzBitword value = bitword_read(&b->bitmap[pos]);
value &= ~((RzBitword)1 << (bit & BITWORD_BITS_MASK));
bitword_write(&b->bitmap[pos], value);
}
}
RZ_API int rz_bitmap_test(RZ_NONNULL RzBitmap *b, size_t bit) {
rz_return_val_if_fail(b && bit >= 0, -1);
if (bit < b->length) {
const size_t pos = bit >> BITWORD_BITS_SHIFT;
RzBitword bword = bitword_read(&b->bitmap[pos]);
return BITWORD_TEST(bword, (bit & BITWORD_BITS_MASK));
}
return -1;
}

View file

@ -10,7 +10,6 @@ rz_util_common_sources = [
'axml.c',
'base85.c',
'base91.c',
'bitmap.c',
'bitvector.c',
'buf.c',
'calc.c',

View file

@ -26,7 +26,6 @@ if get_option('enable_tests')
'big',
'bin_lines',
'bin_mach0',
'bitmap',
'bitvector',
'buf',
'cmd',

View file

@ -1,36 +0,0 @@
// SPDX-FileCopyrightText: 2016 Jeffrey Crowell <crowell@bu.edu>
// SPDX-License-Identifier: LGPL-3.0-only
#include <rz_util.h>
#include "minunit.h"
bool test_rz_bitmap_set(void) {
int i;
static const int max_value = (2343 + 1);
static const ut32 values[] = { 1, 2, 3, 4, 8, 34, 543, 2343 };
static const int len = (sizeof(values) / sizeof(ut32));
RzBitmap *bitmap = rz_bitmap_new(max_value);
for (i = 0; i < len; i++) {
rz_bitmap_set(bitmap, values[i]);
}
for (i = 0; i < len; i++) {
mu_assert_eq(rz_bitmap_test(bitmap, values[i]), true,
"Bit should be set.");
}
for (i = 0; i < len; i++) {
rz_bitmap_unset(bitmap, values[i]);
}
for (i = 0; i < len; i++) {
mu_assert_eq(rz_bitmap_test(bitmap, values[i]), false,
"Bit should not be set.");
}
rz_bitmap_free(bitmap);
mu_end;
}
int all_tests() {
mu_run_test(test_rz_bitmap_set);
return tests_passed != tests_run;
}
mu_main(all_tests)