Mercurial > hg > aim92
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 |