+
+void *Safe_alloc(size_t Size)
+{
+ return Safe_calloc(1, Size);
+}
+
+void Safe_free(void *p)
+{
+ FREE(p);
+}
+
+char *Safe_strdup(const char *sz)
+{
+ char *pret;
+ assert(sz);
+
+ pret = Safe_alloc(strlen(sz) +1);
+ strcpy(pret, sz);
+
+ return pret;
+}
+
+void *traceAlloc(allocTrace *ptrace, void *p)
+{
+ assert(ptrace);
+ assert(p);
+
+ /* Also handles where max == 0 */
+ if (ptrace->num == ptrace->max)
+ {
+ /* Add an offset to handle max == 0 */
+ ptrace->max = (ptrace->max+2)*2;
+ ptrace->palloced = Safe_realloc(ptrace->palloced, ptrace->max * sizeof(*ptrace->palloced));
+ }
+ ptrace->palloced[ptrace->num++] = p;
+
+ return p;
+}
+
+void freeTrace(allocTrace *ptrace)
+{
+ int i;
+ assert(ptrace);
+
+ for (i = 0; i < ptrace->num; i++)
+ {
+ Safe_free(ptrace->palloced[i]);
+ }
+ ptrace->num = 0;
+
+ Safe_free(ptrace->palloced);
+ ptrace->palloced = NULL;
+ ptrace->max = 0;
+}