aboutsummaryrefslogtreecommitdiffstats
path: root/envmalloczn.c
diff options
context:
space:
mode:
Diffstat (limited to 'envmalloczn.c')
-rw-r--r--envmalloczn.c162
1 files changed, 161 insertions, 1 deletions
diff --git a/envmalloczn.c b/envmalloczn.c
index 84c0ea7..7531ecf 100644
--- a/envmalloczn.c
+++ b/envmalloczn.c
@@ -4,7 +4,7 @@
void *
-libsimple_envmalloczn(int status, int clear, size_t n, va_list ap) /* TODO test */
+libsimple_envmalloczn(int status, int clear, size_t n, va_list ap)
{
void *ret = libsimple_vmalloczn(clear, n, ap);
if (!ret)
@@ -19,6 +19,166 @@ libsimple_envmalloczn(int status, int clear, size_t n, va_list ap) /* TODO test
int
main(void)
{
+ struct allocinfo *info;
+ void *ptr;
+
+ assert((ptr = libsimple_enmalloczn(1, 0, 5, 3, 0)));
+ if (have_custom_malloc()) {
+ assert((info = get_allocinfo(ptr)));
+ assert(info->size == 15);
+ assert(!info->zeroed);
+ }
+ free(ptr);
+
+ assert((ptr = libsimple_enmalloczn(1, 1, 5, 4, 0)));
+ if (have_custom_malloc()) {
+ assert((info = get_allocinfo(ptr)));
+ assert(info->size == 20);
+ assert(info->zeroed == 20);
+ }
+ free(ptr);
+
+ assert((ptr = libsimple_enmallocn(1, 4, 3, 0)));
+ if (have_custom_malloc()) {
+ assert((info = get_allocinfo(ptr)));
+ assert(info->size == 12);
+ assert(!info->zeroed);
+ }
+ free(ptr);
+
+ assert((ptr = libsimple_encallocn(1, 4, 4, 0)));
+ if (have_custom_malloc()) {
+ assert((info = get_allocinfo(ptr)));
+ assert(info->size == 16);
+ assert(info->zeroed == 16);
+ }
+ free(ptr);
+
+ if (have_custom_malloc()) {
+ alloc_fail_in = 1;
+ assert_exit_ptr(libsimple_enmalloczn(3, 0, 4, 0));
+ assert(exit_status == 3);
+ stderr_buf[stderr_n] = 0;
+ assert_stderr("%s: malloc: %s\n", argv0, strerror(ENOMEM));
+ assert(!alloc_fail_in);
+
+ alloc_fail_in = 1;
+ assert_exit_ptr(libsimple_enmalloczn(5, 1, 2, 0));
+ assert(exit_status == 5);
+ assert_stderr("%s: calloc: %s\n", argv0, strerror(ENOMEM));
+ assert(!alloc_fail_in);
+
+ alloc_fail_in = 1;
+ assert_exit_ptr(libsimple_enmallocn(9, 1, 0));
+ assert(exit_status == 9);
+ assert_stderr("%s: malloc: %s\n", argv0, strerror(ENOMEM));
+ assert(!alloc_fail_in);
+
+ alloc_fail_in = 1;
+ assert_exit_ptr(libsimple_encallocn(7, 5, 0));
+ assert(exit_status == 7);
+ assert_stderr("%s: calloc: %s\n", argv0, strerror(ENOMEM));
+ assert(!alloc_fail_in);
+ }
+
+ assert_exit_ptr(libsimple_enmalloczn(13, 0, SIZE_MAX, 2, 0));
+ assert(exit_status == 13);
+ assert_stderr("%s: malloc: %s\n", argv0, strerror(ENOMEM));
+
+ assert_exit_ptr(libsimple_enmalloczn(15, 1, SIZE_MAX, 2, 0));
+ assert(exit_status == 15);
+ assert_stderr("%s: calloc: %s\n", argv0, strerror(ENOMEM));
+
+ assert_exit_ptr(libsimple_enmallocn(19, SIZE_MAX, 2, 0));
+ assert(exit_status == 19);
+ assert_stderr("%s: malloc: %s\n", argv0, strerror(ENOMEM));
+
+ assert_exit_ptr(libsimple_encallocn(17, SIZE_MAX, 2, 0));
+ assert(exit_status == 17);
+ assert_stderr("%s: calloc: %s\n", argv0, strerror(ENOMEM));
+
+ assert((ptr = libsimple_emalloczn(0, 2, 5, 3, 0)));
+ if (have_custom_malloc()) {
+ assert((info = get_allocinfo(ptr)));
+ assert(info->size == 30);
+ assert(!info->zeroed);
+ }
+ free(ptr);
+
+ assert((ptr = libsimple_emalloczn(1, 2, 5, 4, 0)));
+ if (have_custom_malloc()) {
+ assert((info = get_allocinfo(ptr)));
+ assert(info->size == 40);
+ assert(info->zeroed == 40);
+ }
+ free(ptr);
+
+ assert((ptr = libsimple_emallocn(2, 4, 3, 0)));
+ if (have_custom_malloc()) {
+ assert((info = get_allocinfo(ptr)));
+ assert(info->size == 24);
+ assert(!info->zeroed);
+ }
+ free(ptr);
+
+ assert((ptr = libsimple_ecallocn(2, 4, 4, 0)));
+ if (have_custom_malloc()) {
+ assert((info = get_allocinfo(ptr)));
+ assert(info->size == 32);
+ assert(info->zeroed == 32);
+ }
+ free(ptr);
+
+ if (have_custom_malloc()) {
+ alloc_fail_in = 1;
+ libsimple_default_failure_exit = 23;
+ assert_exit_ptr(libsimple_emalloczn(0, 4, 0));
+ assert(exit_status == 23);
+ assert_stderr("%s: malloc: %s\n", argv0, strerror(ENOMEM));
+ assert(!alloc_fail_in);
+
+ alloc_fail_in = 1;
+ libsimple_default_failure_exit = 25;
+ assert_exit_ptr(libsimple_emalloczn(1, 2, 0));
+ assert(exit_status == 25);
+ assert_stderr("%s: calloc: %s\n", argv0, strerror(ENOMEM));
+ assert(!alloc_fail_in);
+
+ alloc_fail_in = 1;
+ libsimple_default_failure_exit = 29;
+ assert_exit_ptr(libsimple_emallocn(1, 0));
+ assert(exit_status == 29);
+ assert_stderr("%s: malloc: %s\n", argv0, strerror(ENOMEM));
+ assert(!alloc_fail_in);
+
+ alloc_fail_in = 1;
+ libsimple_default_failure_exit = 27;
+ assert_exit_ptr(libsimple_ecallocn(5, 0));
+ assert(exit_status == 27);
+ assert_stderr("%s: calloc: %s\n", argv0, strerror(ENOMEM));
+ assert(!alloc_fail_in);
+ }
+
+ libsimple_default_failure_exit = 33;
+ assert_exit_ptr(libsimple_emalloczn(0, SIZE_MAX, 2, 0));
+ assert(exit_status == 33);
+ assert_stderr("%s: malloc: %s\n", argv0, strerror(ENOMEM));
+
+ libsimple_default_failure_exit = 35;
+ assert_exit_ptr(libsimple_emalloczn(1, SIZE_MAX, 2, 0));
+ assert(exit_status == 35);
+ assert_stderr("%s: calloc: %s\n", argv0, strerror(ENOMEM));
+
+ libsimple_default_failure_exit = 39;
+ assert_exit_ptr(libsimple_emallocn(SIZE_MAX, 2, 0));
+ assert(exit_status == 39);
+ assert_stderr("%s: malloc: %s\n", argv0, strerror(ENOMEM));
+
+ libsimple_default_failure_exit = 37;
+ assert_exit_ptr(libsimple_ecallocn(SIZE_MAX, 2, 0));
+ assert(exit_status == 37);
+ assert_stderr("%s: calloc: %s\n", argv0, strerror(ENOMEM));
+
return 0;
}