comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:5242703e91d3
1 /*
2 wrap.c
3 ======
4
5 encapsulate memory allocation for debugging en masse.
6
7 */
8
9 #include "stitch.h"
10 #include "wrap.h"
11
12 #define LOGGING
13
14 /* linked list of framed allocations */
15
16 static struct _head *lastAllocated = (struct _head *) 0 ;
17
18
19 static void wraperr( id, hsz, tsz )
20 char *id ;
21 unsigned hsz, tsz ;
22 {
23 printf( "memerr %s %d %d\n", id, hsz, tsz ) ;
24 }
25
26
27 Pointer wrap( mem, size, where )
28 char *mem ;
29 unsigned size ;
30 char where[] ;
31 {
32 register struct _head *head = (struct _head *) mem ;
33 register Pointer wrapped = (Address) head + ROUNDUP( sizeof ( *head ) ) ;
34 register struct _tail *tail = (struct _tail *) ( (Address) wrapped + ROUNDUP( size ) ) ;
35
36 #ifdef LOGGING
37 (void) printf( "wrapping %x, %d bytes in %s\n", mem, size, where ) ;
38 #endif
39
40 head->where = where ;
41 head->size = size ;
42
43 tail->size = size ;
44
45 head->previous = lastAllocated ;
46
47 if( lastAllocated != 0 )
48 lastAllocated->pointing = &head->previous ;
49
50 lastAllocated = head ;
51 lastAllocated->pointing = &lastAllocated ;
52
53 return ( wrapped ) ;
54 }
55
56
57 Pointer unwrap( wrapped )
58 Pointer wrapped ;
59 {
60 register struct _head *head = (struct _head *) ( (Address) wrapped - ROUNDUP( sizeof ( *head ) ) ) ;
61 register struct _tail *tail = (struct _tail *) ( (Address) wrapped + ROUNDUP( head->size ) ) ;
62
63 #ifdef LOGGING
64 (void) printf( "unwrapping %x, %d bytes in %s\n", head, head->size, head->where ) ;
65 #endif
66
67 if( head->size != tail->size )
68 wraperr( head->where, head->size, tail->size ) ;
69
70 *head->pointing = head->previous ;
71
72 if( head->previous != (struct _head *) 0 )
73 head->previous->pointing = head->pointing ;
74
75 return ( (char *) head ) ;
76 }
77
78 check_wrapping( printer )
79 {
80 register struct _head *head = lastAllocated ;
81 register Pointer wrapped ;
82 register struct _tail *tail ;
83
84 while( head != (struct _head *) 0 ) {
85
86 wrapped = (Pointer) ( head + 1 ) ;
87
88 tail = ( struct _tail * ) ( (Address) wrapped + ROUNDUP( head->size ) ) ;
89
90 if( tail->size != head->size )
91 wraperr( head->where, head->size, tail->size ) ;
92
93 head = head->previous ;
94 }
95
96 return ;
97 }
98
99 print_wrapping()
100 {
101 register struct _head *head = lastAllocated ;
102 register Pointer wrapped ;
103 register struct _tail *tail ;
104
105 while( head != (struct _head *) 0 ) {
106
107 wrapped = (Pointer) ( head + 1 ) ;
108
109 tail = (struct _tail *) ( (Address) wrapped + ROUNDUP( head->size ) ) ;
110
111 printf( "%d bytes \"%s\"\n", head->size, head->where ) ;
112 if( tail->size != head->size )
113 wraperr( head->where, head->size, tail->size ) ;
114
115 head = head->previous ;
116 }
117
118 printf( "\n" ) ;
119
120 return ;
121 }
122