summaryrefslogtreecommitdiffstats
path: root/python/sip/sipgen/heap.c
diff options
context:
space:
mode:
Diffstat (limited to 'python/sip/sipgen/heap.c')
-rw-r--r--python/sip/sipgen/heap.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/python/sip/sipgen/heap.c b/python/sip/sipgen/heap.c
new file mode 100644
index 00000000..d6e94ccc
--- /dev/null
+++ b/python/sip/sipgen/heap.c
@@ -0,0 +1,115 @@
+/*
+ * Wrappers around standard functions that use the heap.
+ *
+ * Copyright (c) 2007
+ * Riverbank Computing Limited <info@riverbankcomputing.co.uk>
+ *
+ * This file is part of SIP.
+ *
+ * This copy of SIP is licensed for use under the terms of the SIP License
+ * Agreement. See the file LICENSE for more details.
+ *
+ * SIP is supplied WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "sip.h"
+
+
+static void nomem(void);
+
+
+/*
+ * Wrap malloc() and handle any errors.
+ */
+
+void *sipMalloc(size_t n)
+{
+ void *h;
+
+ if ((h = malloc(n)) == NULL)
+ nomem();
+
+ return h;
+}
+
+
+/*
+ * Wrap strdup() and handle any errors.
+ */
+
+char *sipStrdup(char *s)
+{
+ char *h;
+
+ if ((h = strdup(s)) == NULL)
+ nomem();
+
+ return h;
+}
+
+
+/*
+ * Return a string on the heap which is the concatonation of all the arguments.
+ */
+
+char *concat(const char *s, ...)
+{
+ const char *sp;
+ char *new;
+ size_t len;
+ va_list ap;
+
+ /* Find the length of the final string. */
+
+ len = 1;
+ va_start(ap,s);
+
+ for (sp = s; sp != NULL; sp = va_arg(ap, const char *))
+ len += strlen(sp);
+
+ va_end(ap);
+
+ /* Create the new string. */
+
+ new = sipMalloc(len);
+ *new = '\0';
+
+ va_start(ap,s);
+
+ for (sp = s; sp != NULL; sp = va_arg(ap, const char *))
+ strcat(new,sp);
+
+ va_end(ap);
+
+ return new;
+}
+
+
+/*
+ * Append a string to another that is on the heap.
+ */
+
+void append(char **s,char *new)
+{
+ if ((*s = realloc(*s,strlen(*s) + strlen(new) + 1)) == NULL)
+ nomem();
+
+ strcat(*s,new);
+}
+
+
+/*
+ * Display a standard error message when the heap is exhausted.
+ */
+
+static void nomem(void)
+{
+ fatal("Unable to allocate memory on the heap\n");
+}