emalloc.h - blind - suckless command-line video editing utility
 (HTM) git clone git://git.suckless.org/blind
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       emalloc.h (2045B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include <stdlib.h>
            3 #include <stdint.h>
            4 
            5 #define emalloc(...)   enmalloc(1, __VA_ARGS__)
            6 #define emalloc2(...)  enmalloc2(1, __VA_ARGS__)
            7 #define emalloc3(...)  enmalloc3(1, __VA_ARGS__)
            8 #define ecalloc(...)   encalloc(1, __VA_ARGS__)
            9 #define erealloc(...)  enrealloc(1, __VA_ARGS__)
           10 #define erealloc2(...) enrealloc2(1, __VA_ARGS__)
           11 #define erealloc3(...) enrealloc3(1, __VA_ARGS__)
           12 
           13 #define malloc2(n, m)           malloc(n * m);
           14 #define malloc3(n1, n2, n3)     malloc(n1 * n2 * n3);
           15 #define realloc2(p, n, m)       realloc(p, n * m);
           16 #define realloc3(p, n1, n2, n3) realloc(p, n1 * n2 * n3);
           17 
           18 static inline void *
           19 enmalloc(int status, size_t n)
           20 {
           21         void *ptr = malloc(n);
           22         if (!ptr)
           23                 enprintf(status, "malloc: out of memory\n");
           24         return ptr;
           25 }
           26 
           27 static inline void *
           28 enmalloc2(int status, size_t n, size_t m)
           29 {
           30         void *ptr;
           31         if (n > SIZE_MAX / m || !(ptr = malloc(n * m)))
           32                 enprintf(status, "malloc: out of memory\n");
           33         return ptr;
           34 }
           35 
           36 static inline void *
           37 enmalloc3(int status, size_t n1, size_t n2, size_t n3)
           38 {
           39         void *ptr;
           40         size_t n = n1;
           41         if (n2 > SIZE_MAX / n ||
           42             n3 > SIZE_MAX / (n *= n2) ||
           43             !(ptr = malloc(n * n3)))
           44                 enprintf(status, "malloc: out of memory\n");
           45         return ptr;
           46 }
           47 
           48 static inline void *
           49 encalloc(int status, size_t n, size_t m)
           50 {
           51         void *ptr = calloc(n, m);
           52         if (!ptr)
           53                 enprintf(status, "calloc: out of memory\n");
           54         return ptr;
           55 }
           56 
           57 static inline void *
           58 enrealloc(int status, void *ptr, size_t n)
           59 {
           60         ptr = realloc(ptr, n);
           61         if (!ptr)
           62                 enprintf(status, "realloc: out of memory\n");
           63         return ptr;
           64 }
           65 
           66 static inline void *
           67 enrealloc2(int status, void *ptr, size_t n, size_t m)
           68 {
           69         if (n > SIZE_MAX / m || !(ptr = realloc(ptr, n * m)))
           70                 enprintf(status, "realloc: out of memory\n");
           71         return ptr;
           72 }
           73 
           74 static inline void *
           75 enrealloc3(int status, void *ptr, size_t n1, size_t n2, size_t n3)
           76 {
           77         size_t n = n1;
           78         if (n2 > SIZE_MAX / n ||
           79             n3 > SIZE_MAX / (n *= n2) ||
           80             !(ptr = realloc(ptr, n * n3)))
           81                 enprintf(status, "realloc: out of memory\n");
           82         return ptr;
           83 }