comparison libmlk-core/core/alloc.c @ 269:9b758eb84556

core: add alloc_rearray0 function
author David Demelier <markand@malikania.fr>
date Fri, 11 Dec 2020 11:33:58 +0100
parents 95c2c4a72410
children 196264679079
comparison
equal deleted inserted replaced
268:3f710c68bb97 269:9b758eb84556
91 91
92 return ptr; 92 return ptr;
93 } 93 }
94 94
95 void * 95 void *
96 alloc_array(size_t n, size_t size) 96 alloc_array(size_t len, size_t elemsize)
97 { 97 {
98 assert(n != 0); 98 assert(len != 0);
99 assert(size != 0); 99 assert(elemsize != 0);
100 100
101 size_t total = n * size; 101 size_t size = len * elemsize;
102 102
103 if (total / n != size) 103 if (size / len != elemsize)
104 return errorf("%s", strerror(ENOMEM)), NULL; 104 return errorf("%s", strerror(ENOMEM)), NULL;
105 105
106 return funcs->alloc(total); 106 return funcs->alloc(size);
107 } 107 }
108 108
109 void * 109 void *
110 alloc_array0(size_t n, size_t size) 110 alloc_array0(size_t len, size_t elemsize)
111 { 111 {
112 assert(n != 0); 112 assert(len != 0);
113 assert(size != 0); 113 assert(elemsize != 0);
114 114
115 void *mem; 115 void *mem;
116 size_t total = n * size; 116 size_t size = len * elemsize;
117 117
118 if (total / n != size) 118 if (size / len != elemsize)
119 return errorf("%s", strerror(ENOMEM)), NULL; 119 return errorf("%s", strerror(ENOMEM)), NULL;
120 120
121 if ((mem = funcs->alloc(total))) 121 if ((mem = funcs->alloc(size)))
122 memset(mem, 0, total); 122 memset(mem, 0, size);
123 123
124 return mem; 124 return mem;
125 } 125 }
126 126
127 void * 127 void *
128 alloc_renew(void *ptr, size_t amount) 128 alloc_renew(void *ptr, size_t size)
129 { 129 {
130 return funcs->realloc(ptr, amount); 130 return funcs->realloc(ptr, size);
131 } 131 }
132 132
133 void * 133 void *
134 alloc_rearray(void *ptr, size_t n, size_t size) 134 alloc_rearray(void *ptr, size_t len, size_t elemsize)
135 { 135 {
136 size_t total = n * size; 136 size_t size = len * elemsize;
137 137
138 if (total / n != size) 138 if (size / len != elemsize)
139 return errorf("%s", strerror(ENOMEM)), NULL; 139 return errorf("%s", strerror(ENOMEM)), NULL;
140 140
141 return funcs->realloc(ptr, total); 141 return funcs->realloc(ptr, size);
142 }
143
144 void *
145 alloc_rearray0(void *ptr, size_t oldlen, size_t newlen, size_t elemsize)
146 {
147 size_t size = newlen * elemsize;
148
149 if (size / newlen != elemsize)
150 return errorf("%s", strerror(ENOMEM)), NULL;
151 if (!(ptr = funcs->realloc(ptr, size)))
152 return false;
153
154 if (newlen > oldlen)
155 memset((unsigned char *)ptr + (oldlen * elemsize), 0, (newlen - oldlen) * elemsize);
156
157 return ptr;
142 } 158 }
143 159
144 void * 160 void *
145 alloc_dup(const void *ptr, size_t size) 161 alloc_dup(const void *ptr, size_t size)
146 { 162 {