From ee1dfffae5ad694bb0fb687bbc4752c15874ea06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Thu, 11 Mar 2021 20:55:47 +0100 Subject: [PATCH] Add rz_num_align_delta() --- librz/include/rz_util/rz_num.h | 15 +++++++++++++++ test/unit/test_unum.c | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/librz/include/rz_util/rz_num.h b/librz/include/rz_util/rz_num.h index 0b7263acdf..f29d947dba 100644 --- a/librz/include/rz_util/rz_num.h +++ b/librz/include/rz_util/rz_num.h @@ -103,6 +103,21 @@ static inline st64 rz_num_abs(st64 num) { return num < 0 ? -num : num; } +/** + * \brief Padding to align v to the next alignment-boundary. + * \return the least `d` such that `(v + d) % alignment == 0`. + */ +static inline ut64 rz_num_align_delta(ut64 v, ut64 alignment) { + if (!alignment) { + return 0; + } + ut64 excess = v % alignment; + if (!excess) { + return 0; + } + return alignment - excess; +} + #ifdef __cplusplus } #endif diff --git a/test/unit/test_unum.c b/test/unit/test_unum.c index 76de2da026..bde2f2261c 100644 --- a/test/unit/test_unum.c +++ b/test/unit/test_unum.c @@ -129,6 +129,20 @@ bool test_rz_num_str_split_list() { mu_end; } +bool test_rz_num_align_delta() { + ut64 d = rz_num_align_delta(0, 8); + mu_assert_eq(d, 0, "align delta"); + d = rz_num_align_delta(3, 8); + mu_assert_eq(d, 5, "align delta"); + d = rz_num_align_delta(0x10, 8); + mu_assert_eq(d, 0, "align delta"); + d = rz_num_align_delta(0x11, 8); + mu_assert_eq(d, 7, "align delta"); + d = rz_num_align_delta(0x42, 0); + mu_assert_eq(d, 0, "align delta"); + mu_end; +} + bool all_tests() { mu_run_test(test_rz_num_units); mu_run_test(test_rz_num_minmax_swap_i); @@ -137,6 +151,7 @@ bool all_tests() { mu_run_test(test_rz_num_str_len); mu_run_test(test_rz_num_str_split); mu_run_test(test_rz_num_str_split_list); + mu_run_test(test_rz_num_align_delta); return tests_passed != tests_run; }