summaryrefslogtreecommitdiffstats
path: root/Mac
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>1995-01-22 16:47:22 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>1995-01-22 16:47:22 (GMT)
commit2fc94eecb2415de1d966900fa15af179beb07723 (patch)
tree488858672753ce0d8ae219b7768fe2315c80f588 /Mac
parent6bb347fc1cde93111eeb5b456b4663c2503bed4d (diff)
downloadcpython-2fc94eecb2415de1d966900fa15af179beb07723.zip
cpython-2fc94eecb2415de1d966900fa15af179beb07723.tar.gz
cpython-2fc94eecb2415de1d966900fa15af179beb07723.tar.bz2
- Ported to CW5 (which has more unixisms)
- Added (rather crummy) malloc debugger
Diffstat (limited to 'Mac')
-rw-r--r--Mac/mwerks/mwerksglue.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/Mac/mwerks/mwerksglue.c b/Mac/mwerks/mwerksglue.c
index ae6c1ff..82f59d9 100644
--- a/Mac/mwerks/mwerksglue.c
+++ b/Mac/mwerks/mwerksglue.c
@@ -8,9 +8,131 @@
#include <Files.h>
#include <Strings.h>
+#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
+/* #define DBGMALLOC /**/
+
+#ifdef DBGMALLOC
+#define NMALLOC 50000
+static long m_index;
+static long m_addrs[NMALLOC];
+static long m_sizes[NMALLOC];
+static long m_lastaddr;
+
+#define SSLOP 2
+#define SLOP (SSLOP+0)
+
+void
+m_abort() {
+ printf("ABORT\n");
+ exit(1);
+}
+
+void *
+checkrv(ptr, size)
+ void *ptr;
+ int size;
+{
+ long b = (long)ptr, e = (long)ptr + size+SSLOP;
+ int i;
+
+ if ( m_index >= NMALLOC ) {
+ printf("too many mallocs\n");
+ m_abort();
+ }
+ m_lastaddr = (long)ptr;
+ for(i=0; i<m_index; i++) {
+ if ( m_addrs[i] > 0 && b < m_addrs[i]+m_sizes[i] && e > m_addrs[i] ) {
+ printf("overlapping block with %d\n", i);
+ m_abort();
+ }
+ }
+ m_sizes[m_index] = size;
+ m_addrs[m_index++] = (long)ptr;
+ *(short *)ptr = m_index-1;
+ return (void *)((char *)ptr+SSLOP);
+
+}
+
+void *
+checkfree(ptr)
+ void *ptr;
+{
+ int i;
+
+ if ( ptr == 0 ) {
+ printf("free null\n");
+ m_abort();
+ }
+ m_lastaddr = (long)ptr;
+ for(i=0; i<m_index; i++) {
+ if ( m_addrs[i] == (long)ptr-SSLOP ) {
+ m_addrs[i] = -m_addrs[i];
+ ptr = (void *)((char *)ptr-SSLOP);
+ if ( *(short *)ptr != i ) {
+ int saved_i = i, saved_ptr = *(short *)ptr;
+
+ printf("Wrong starter value\n");
+ m_abort();
+ }
+ return ptr;
+ }
+ }
+ printf("free unknown\n");
+ m_abort();
+ return 0;
+}
+
+void *
+m_malloc(size)
+{
+ void *ptr;
+
+ ptr = malloc(size+SLOP);
+ if ( !ptr ) {
+ printf("malloc failure\n");
+ m_abort();
+ }
+ return checkrv(ptr, size);
+}
+
+void *
+m_realloc(optr, size)
+ void *optr;
+{
+ void *ptr;
+
+ ptr = checkfree(ptr);
+ ptr = realloc(ptr, size+SLOP);
+ if ( !ptr ) {
+ printf("realloc failure\n");
+ m_abort();
+ }
+ return checkrv(ptr, size);
+}
+
+void *
+m_calloc(size, nelem)
+{
+ void *ptr;
+
+ ptr = calloc(1, nelem*size+SLOP);
+ return checkrv(ptr, nelem*size);
+}
+
+void
+m_free(ptr)
+ void *ptr;
+{
+
+ ptr = checkfree(ptr);
+ free(ptr);
+}
+#endif /* DBGMALLOC */
+
+#ifdef CW4
int
fileno(fp)
FILE *fp;
@@ -39,5 +161,6 @@ unlink(old)
errno= err;
return -1;
}
+#endif /* CW4 */
#endif /* __MWERKS__ */ \ No newline at end of file