diff stitch/wrap.c @ 0:5242703e91d3 tip

Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author tomwalters
date Fri, 20 May 2011 15:19:45 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stitch/wrap.c	Fri May 20 15:19:45 2011 +0100
@@ -0,0 +1,122 @@
+/*
+    wrap.c
+    ======
+
+    encapsulate memory allocation for debugging en masse.
+
+*/
+
+#include "stitch.h"
+#include "wrap.h"
+
+#define LOGGING
+
+/* linked list of framed allocations */
+
+static struct _head *lastAllocated = (struct _head *) 0 ;
+
+
+static void wraperr( id, hsz, tsz )
+char *id ;
+unsigned hsz, tsz ;
+{
+    printf( "memerr %s %d %d\n", id, hsz, tsz ) ;
+}
+
+
+Pointer wrap( mem, size, where )
+char *mem ;
+unsigned size ;
+char where[] ;
+{
+    register struct _head *head = (struct _head *) mem ;
+    register Pointer wrapped    = (Address) head + ROUNDUP( sizeof ( *head ) ) ;
+    register struct _tail *tail = (struct _tail *) ( (Address) wrapped + ROUNDUP( size ) ) ;
+
+#ifdef LOGGING
+    (void) printf( "wrapping %x, %d bytes in %s\n", mem, size, where ) ;
+#endif
+
+    head->where = where ;
+    head->size  = size  ;
+
+    tail->size  = size  ;
+
+    head->previous =  lastAllocated ;
+
+    if( lastAllocated != 0 )
+	lastAllocated->pointing = &head->previous ;
+
+    lastAllocated = head ;
+    lastAllocated->pointing = &lastAllocated ;
+
+    return ( wrapped ) ;
+}
+
+
+Pointer unwrap( wrapped )
+Pointer wrapped ;
+{
+    register struct _head *head = (struct _head *) ( (Address) wrapped - ROUNDUP( sizeof ( *head ) ) ) ;
+    register struct _tail *tail = (struct _tail *) ( (Address) wrapped + ROUNDUP( head->size ) ) ;
+
+#ifdef LOGGING
+    (void) printf( "unwrapping %x, %d bytes in %s\n", head, head->size, head->where ) ;
+#endif
+
+    if( head->size != tail->size )
+	wraperr( head->where, head->size, tail->size ) ;
+
+    *head->pointing = head->previous ;
+
+    if( head->previous != (struct _head *) 0 )
+	head->previous->pointing = head->pointing ;
+
+    return ( (char *) head ) ;
+}
+
+check_wrapping( printer )
+{
+    register struct _head *head = lastAllocated ;
+    register Pointer wrapped ;
+    register struct _tail *tail ;
+
+    while( head != (struct _head *) 0 ) {
+
+	wrapped = (Pointer) ( head + 1 ) ;
+
+	tail = ( struct _tail * ) ( (Address) wrapped + ROUNDUP( head->size ) ) ;
+
+	if( tail->size != head->size )
+	    wraperr( head->where, head->size, tail->size ) ;
+
+	head = head->previous ;
+    }
+
+    return ;
+}
+
+print_wrapping()
+{
+    register struct _head *head = lastAllocated ;
+    register Pointer wrapped ;
+    register struct _tail *tail ;
+
+    while( head != (struct _head *) 0 ) {
+
+	wrapped = (Pointer) ( head + 1 ) ;
+
+	tail = (struct _tail *) ( (Address) wrapped + ROUNDUP( head->size ) ) ;
+
+printf( "%d bytes \"%s\"\n", head->size, head->where ) ;
+	if( tail->size != head->size )
+	    wraperr( head->where, head->size, tail->size ) ;
+
+	head = head->previous ;
+    }
+
+printf( "\n" ) ;
+
+    return ;
+}
+