chiark / gitweb /
util: add greedy_realloc0()
authorDavid Herrmann <dh.herrmann@gmail.com>
Sat, 30 Nov 2013 10:31:59 +0000 (11:31 +0100)
committerDavid Herrmann <dh.herrmann@gmail.com>
Sun, 1 Dec 2013 11:17:08 +0000 (12:17 +0100)
Compared to greedy_realloc(), this sets all newly allocated memory to 0.
As the old variant has been used a lot for string-handling, we avoid
changing it as clearing memory is not needed there.

src/shared/util.c
src/shared/util.h

index 305a6c2fb654534040c75da8cb8837549c4e5110..b4ed2c407c4ad6d544adf5899760991f9ae05191 100644 (file)
@@ -5806,6 +5806,20 @@ void* greedy_realloc(void **p, size_t *allocated, size_t need) {
         return q;
 }
 
         return q;
 }
 
+void* greedy_realloc0(void **p, size_t *allocated, size_t need) {
+        size_t prev = *allocated;
+        uint8_t *q;
+
+        q = greedy_realloc(p, allocated, need);
+        if (!q)
+                return NULL;
+
+        if (*allocated > prev)
+                memset(&q[prev], 0, *allocated - prev);
+
+        return q;
+}
+
 bool id128_is_valid(const char *s) {
         size_t i, l;
 
 bool id128_is_valid(const char *s) {
         size_t i, l;
 
index 1662bd44576851875f3ba9b543b3db090abb8f4f..504f63a28fe02bc5711be3492c9a4054784b1455 100644 (file)
@@ -669,8 +669,11 @@ char *strextend(char **x, ...) _sentinel_;
 char *strrep(const char *s, unsigned n);
 
 void* greedy_realloc(void **p, size_t *allocated, size_t need);
 char *strrep(const char *s, unsigned n);
 
 void* greedy_realloc(void **p, size_t *allocated, size_t need);
+void* greedy_realloc0(void **p, size_t *allocated, size_t need);
 #define GREEDY_REALLOC(array, allocated, need) \
         greedy_realloc((void**) &(array), &(allocated), sizeof((array)[0]) * (need))
 #define GREEDY_REALLOC(array, allocated, need) \
         greedy_realloc((void**) &(array), &(allocated), sizeof((array)[0]) * (need))
+#define GREEDY_REALLOC0(array, allocated, need) \
+        greedy_realloc0((void**) &(array), &(allocated), sizeof((array)[0]) * (need))
 
 static inline void _reset_errno_(int *saved_errno) {
         errno = *saved_errno;
 
 static inline void _reset_errno_(int *saved_errno) {
         errno = *saved_errno;