From: Martin Willi Date: Mon, 22 Jul 2013 12:16:38 +0000 (+0200) Subject: utils: add round_up/down() helper functions X-Git-Tag: 5.1.0~18^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=84044f9c7330e7eff485b82cfa9c93f9e17e5383;p=thirdparty%2Fstrongswan.git utils: add round_up/down() helper functions --- diff --git a/src/libstrongswan/tests/test_utils.c b/src/libstrongswan/tests/test_utils.c index 811882e538..d9f1726ff2 100644 --- a/src/libstrongswan/tests/test_utils.c +++ b/src/libstrongswan/tests/test_utils.c @@ -165,6 +165,28 @@ START_TEST(test_untoh) } END_TEST +/******************************************************************************* + * round_up/down + */ + +START_TEST(test_round) +{ + ck_assert_int_eq(round_up(0, 4), 0); + ck_assert_int_eq(round_up(1, 4), 4); + ck_assert_int_eq(round_up(2, 4), 4); + ck_assert_int_eq(round_up(3, 4), 4); + ck_assert_int_eq(round_up(4, 4), 4); + ck_assert_int_eq(round_up(5, 4), 8); + + ck_assert_int_eq(round_down(0, 4), 0); + ck_assert_int_eq(round_down(1, 4), 0); + ck_assert_int_eq(round_down(2, 4), 0); + ck_assert_int_eq(round_down(3, 4), 0); + ck_assert_int_eq(round_down(4, 4), 4); + ck_assert_int_eq(round_down(5, 4), 4); +} +END_TEST + /******************************************************************************* * memxor */ @@ -416,6 +438,10 @@ Suite *utils_suite_create() tcase_add_test(tc, test_untoh); suite_add_tcase(s, tc); + tc = tcase_create("round"); + tcase_add_test(tc, test_round); + suite_add_tcase(s, tc); + tc = tcase_create("memxor"); tcase_add_test(tc, test_memxor); tcase_add_test(tc, test_memxor_aligned); diff --git a/src/libstrongswan/utils/utils.h b/src/libstrongswan/utils/utils.h index 0e103de9cb..d055f712d5 100644 --- a/src/libstrongswan/utils/utils.h +++ b/src/libstrongswan/utils/utils.h @@ -670,6 +670,29 @@ static inline u_int64_t untoh64(void *network) #endif } +/** + * Round up size to be multiple of alignement + */ +static inline size_t round_up(size_t size, int alignement) +{ + int remainder; + + remainder = size % alignement; + if (remainder) + { + size += alignement - remainder; + } + return size; +} + +/** + * Round down size to be a multiple of alignement + */ +static inline size_t round_down(size_t size, int alignement) +{ + return size - (size % alignement); +} + /** * Special type to count references */