summaryrefslogtreecommitdiff
path: root/Build/source/libs/pplib/pplib-src/src/util/utilmem.c
diff options
context:
space:
mode:
authorLuigi Scarso <luigi.scarso@gmail.com>2020-04-21 18:43:36 +0000
committerLuigi Scarso <luigi.scarso@gmail.com>2020-04-21 18:43:36 +0000
commit7c0b908f1a6e1489834fbdb0789766eed8a37b49 (patch)
treecb55d631b861bfcf95fe853713af6f760227ba0f /Build/source/libs/pplib/pplib-src/src/util/utilmem.c
parente783b071ded7eef421d0333416b47142bc5542cb (diff)
pplib under libs -- WORK IN PROGRSS grep '?' out
git-svn-id: svn://tug.org/texlive/trunk@54824 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/pplib/pplib-src/src/util/utilmem.c')
-rw-r--r--Build/source/libs/pplib/pplib-src/src/util/utilmem.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/Build/source/libs/pplib/pplib-src/src/util/utilmem.c b/Build/source/libs/pplib/pplib-src/src/util/utilmem.c
new file mode 100644
index 00000000000..9a32247ab11
--- /dev/null
+++ b/Build/source/libs/pplib/pplib-src/src/util/utilmem.c
@@ -0,0 +1,67 @@
+
+#include <string.h> // for memcpy
+
+#include "utilmem.h"
+#include "utillog.h"
+
+#ifndef util_memerr
+# if defined(_WIN64) || defined(__MINGW32__)
+# define util_memerr(size) { loggerf("ooops, not enough memory (%I64u)", ((unsigned long long)(size))); abort(); }
+# else
+# define util_memerr(size) { loggerf("ooops, not enough memory (%llu)", ((unsigned long long)(size))); abort(); }
+# endif
+#endif
+
+void * util_malloc (size_t size)
+{
+ void *m;
+ if ((m = malloc(size)) == NULL)
+ util_memerr(size);
+ return m;
+}
+
+void * util_calloc (size_t num, size_t size)
+{
+ void *m;
+ if ((m = calloc(num, size)) == NULL)
+ util_memerr(size);
+ return m;
+}
+
+void * util_realloc (void *m, size_t size)
+{
+ if ((m = realloc(m, size)) == NULL)
+ util_memerr(size);
+ return m;
+}
+
+/* common array resizer
+
+data -- the beginning of array
+unit -- sizeof array element
+size -- current array size
+extra -- requested extra size
+space -- pointer to available space
+allocated -- flag indicating if *data has been allocated (with malloc)
+
+*/
+
+void util_resize (void **data, size_t unit, size_t size, size_t extra, size_t *space, int allocated)
+{
+ if (*space == 0)
+ *space = 4; // better keep *space non-zero to avoid it
+ do { *space <<= 1; } while (size + extra > *space);
+
+ if (allocated)
+ {
+ *data = util_realloc(*data, *space * unit);
+ }
+ else
+ {
+ void *newdata = util_malloc(*space * unit);
+ if (*data != NULL)
+ memcpy(newdata, *data, size * unit);
+ *data = newdata;
+ }
+}
+