diff --git a/CMakeLists.txt b/CMakeLists.txt index d1e3d44..03d49a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,9 @@ set(SOURCES src/ctype/charprops.c src/ctype/classes.c src/ctype/convert.c + # inttypes + src/inttypes/functions.c + src/inttypes/sizes.c # stdlib src/stdlib/arith.c # string diff --git a/include/ft/all-tests.h b/include/ft/all-tests.h index 05a210e..d43191e 100644 --- a/include/ft/all-tests.h +++ b/include/ft/all-tests.h @@ -13,6 +13,10 @@ extern ft_test ft_ctype_functions; extern ft_test ft_ctype_convert_macros; extern ft_test ft_ctype_convert_functions; +/* inttypes */ +extern ft_test ft_inttypes_sizes; +extern ft_test ft_inttypes_functions; + /* stdlib */ extern ft_test ft_stdlib_arith; diff --git a/src/inttypes/functions.c b/src/inttypes/functions.c new file mode 100644 index 0000000..49e7610 --- /dev/null +++ b/src/inttypes/functions.c @@ -0,0 +1,41 @@ +#include +#include +#include +#include + +static void _ft_inttypes_functions(ft_test *t) +{ + ft_log(t, "abs with function:\n"); + ft_assert_eval(t, imaxabs(73ll), 73ll, "%" PRIdMAX); + ft_assert_eval(t, imaxabs(-73ll), 73ll, "%" PRIdMAX); + ft_assert_eval(t, imaxabs(0ll), 0ll, "%" PRIdMAX); + ft_assert_eval(t, imaxabs(LLONG_MAX), LLONG_MAX, "%" PRIdMAX); + /* Very edgy corner case */ + ft_assert_eval(t, imaxabs(LLONG_MIN), LLONG_MIN, "%" PRIdMAX); + + #undef imaxabs + + ft_log(t, "\nabs with macro:\n"); + ft_assert_eval(t, imaxabs(73ll), 73ll, "%" PRIdMAX); + ft_assert_eval(t, imaxabs(-73ll), 73ll, "%" PRIdMAX); + ft_assert_eval(t, imaxabs(0ll), 0ll, "%" PRIdMAX); + ft_assert_eval(t, imaxabs(LLONG_MAX), LLONG_MAX, "%" PRIdMAX); + /* Very edgy corner case */ + ft_assert_eval(t, imaxabs(LLONG_MIN), LLONG_MIN, "%" PRIdMAX); + + ft_log(t, "\ndiv: by asserts (not shown)\n"); + imaxdiv_t imd; + imd = imaxdiv(73ll, 8ll); + ft_assert(t, imd.quot == 9ll && imd.rem == 1ll); + imd = imaxdiv(-73ll, 8ll); + ft_assert(t, imd.quot == -9ll && imd.rem == -1ll); + imd = imaxdiv(73ll, -8ll); + ft_assert(t, imd.quot == -9ll && imd.rem == 1ll); + imd = imaxdiv(-73ll, -8ll); + ft_assert(t, imd.quot == 9ll && imd.rem == -1ll); +} + +ft_test ft_inttypes_functions = { + .name = "Extended integer functions", + .function = _ft_inttypes_functions, +}; diff --git a/src/inttypes/sizes.c b/src/inttypes/sizes.c new file mode 100644 index 0000000..20ad43c --- /dev/null +++ b/src/inttypes/sizes.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include + +static void _inttypes_sizes(ft_test *t) +{ + ft_assert(t, sizeof(int8_t) == sizeof(uint8_t)); + ft_assert(t, sizeof(int16_t) == sizeof(uint16_t)); + ft_assert(t, sizeof(int32_t) == sizeof(uint32_t)); + ft_assert(t, sizeof(int64_t) == sizeof(uint64_t)); + ft_assert(t, sizeof(int_least8_t) == sizeof(uint_least8_t)); + ft_assert(t, sizeof(int_least16_t) == sizeof(uint_least16_t)); + ft_assert(t, sizeof(int_least32_t) == sizeof(uint_least32_t)); + ft_assert(t, sizeof(int_least64_t) == sizeof(uint_least64_t)); + ft_assert(t, sizeof(int_fast8_t) == sizeof(uint_fast8_t)); + ft_assert(t, sizeof(int_fast16_t) == sizeof(uint_fast16_t)); + ft_assert(t, sizeof(int_fast32_t) == sizeof(uint_fast32_t)); + ft_assert(t, sizeof(int_fast64_t) == sizeof(uint_fast64_t)); + ft_assert(t, sizeof(intmax_t) == sizeof(uintmax_t)); + ft_assert(t, sizeof(intptr_t) == sizeof(uintptr_t)); + + /* TODO: Use %zu once available in *printf */ + ft_log(t, "Size of integer types:\n\n"); + + ft_log(t, " %d int8_t\n", (int)sizeof(uint8_t)); + ft_log(t, " %d int16_t\n", (int)sizeof(uint16_t)); + ft_log(t, " %d int32_t\n", (int)sizeof(uint32_t)); + ft_log(t, " %d int64_t\n\n", (int)sizeof(uint64_t)); + + ft_log(t, " %d int_least8_t\n", (int)sizeof(uint_least8_t)); + ft_log(t, " %d int_least16_t\n", (int)sizeof(uint_least16_t)); + ft_log(t, " %d int_least32_t\n", (int)sizeof(uint_least32_t)); + ft_log(t, " %d int_least64_t\n\n", (int)sizeof(uint_least64_t)); + + ft_log(t, " %d int_fast8_t\n", (int)sizeof(uint_fast8_t)); + ft_log(t, " %d int_fast16_t\n", (int)sizeof(uint_fast16_t)); + ft_log(t, " %d int_fast32_t\n", (int)sizeof(uint_fast32_t)); + ft_log(t, " %d int_fast64_t\n\n", (int)sizeof(uint_fast64_t)); + + ft_log(t, " %d intmax_t\n", (int)sizeof(uintmax_t)); + ft_log(t, " %d intptr_t\n", (int)sizeof(uintptr_t)); + ft_log(t, " %d size_t\n", (int)sizeof(size_t)); +} + +ft_test ft_inttypes_sizes = { + .name = "Size of integer types", + .function = _inttypes_sizes, +}; diff --git a/src/main.c b/src/main.c index 5e1a990..af2cea1 100644 --- a/src/main.c +++ b/src/main.c @@ -20,6 +20,11 @@ ft_list headers_libc[] = { &ft_ctype_convert_functions, NULL, }}, + { "", (ft_test*[]){ + &ft_inttypes_sizes, + &ft_inttypes_functions, + NULL, + }}, { "", NULL }, { "", NULL }, { "", NULL },