comparison DynArray.c @ 5:2915fb26c9e2

Changed malloc and free to VMS__malloc and VMS__free
author Me
date Sun, 31 Oct 2010 20:26:32 -0700
parents f35e64d7a42b
children f4b108f21041
comparison
equal deleted inserted replaced
2:a8b72852155d 3:5b38f2d7b0d9
5 */ 5 */
6 6
7 7
8 8
9 #include <stdio.h> 9 #include <stdio.h>
10 #include <malloc.h>
11 10
12 #include "DynArray.h" 11 #include "DynArray.h"
13 12
14 13
15 14
16 DynArrayInfo * 15 DynArrayInfo *
17 makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ) 16 makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray )
18 { DynArrayInfo *info; 17 { DynArrayInfo *info;
19 18
20 info = malloc( sizeof(DynArrayInfo) ); 19 info = VMS__malloc( sizeof(DynArrayInfo) );
21 20
22 info->addrOfPtrToArray = addrOfPtrToArray; 21 info->addrOfPtrToArray = addrOfPtrToArray;
23 info->sizeOfArray = sizeOfArray; 22 info->sizeOfArray = sizeOfArray;
24 info->numInArray = 0; 23 info->numInArray = 0;
25 } 24 }
26 25
27 DynArrayInfo * 26 DynArrayInfo *
28 makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ) 27 makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray )
29 { DynArrayInfo *info; 28 { DynArrayInfo *info;
30 29
31 info = malloc( sizeof(DynArrayInfo) ); 30 info = VMS__malloc( sizeof(DynArrayInfo) );
32 31
33 info->addrOfPtrToArray = addrOfPtrToArray; 32 info->addrOfPtrToArray = addrOfPtrToArray;
34 33
35 *(addrOfPtrToArray) = malloc( sizeOfArray * sizeof(void *) ); 34 *(addrOfPtrToArray) = VMS__malloc( sizeOfArray * sizeof(void *) );
36 info->sizeOfArray = sizeOfArray; 35 info->sizeOfArray = sizeOfArray;
37 info->numInArray = 0; 36 info->numInArray = 0;
38 } 37 }
39 38
40 39
48 */ 47 */
49 int32 48 int32
50 addToDynArray( void *value, DynArrayInfo *info ) 49 addToDynArray( void *value, DynArrayInfo *info )
51 { int32 numInArray, sizeOfArray; 50 { int32 numInArray, sizeOfArray;
52 void **array; 51 void **array;
53 52
54 numInArray = info->numInArray; 53 numInArray = info->numInArray;
55 sizeOfArray = info->sizeOfArray; 54 sizeOfArray = info->sizeOfArray;
56 55
57 if( numInArray >= sizeOfArray ) 56 if( numInArray >= sizeOfArray )
58 { 57 {
59 increaseSizeOfDynArrayTo( info, sizeOfArray * 2 ); 58 increaseSizeOfDynArrayTo( info, sizeOfArray * 2 );
60 } 59 }
61 60
61 array = *(info->addrOfPtrToArray);
62 array[ numInArray ] = value;
63 info->numInArray++;
64
65 return numInArray; //pre-incr value is the index put value into
66 }
67 int32
68 VMS_ext__addToDynArray( void *value, DynArrayInfo *info )
69 { int32 numInArray, sizeOfArray;
70 void **array;
71
72 numInArray = info->numInArray;
73 sizeOfArray = info->sizeOfArray;
74
75 if( numInArray >= sizeOfArray )
76 {
77 VMS_ext__increaseSizeOfDynArrayTo( info, sizeOfArray * 2 );
78 }
79
62 array = *(info->addrOfPtrToArray); 80 array = *(info->addrOfPtrToArray);
63 array[ numInArray ] = value; 81 array[ numInArray ] = value;
64 info->numInArray++; 82 info->numInArray++;
65 83
66 return numInArray; //pre-incr value is the index put value into 84 return numInArray; //pre-incr value is the index put value into
89 */ 107 */
90 void 108 void
91 increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ) 109 increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize )
92 { int32 oldSizeOfArray, i; 110 { int32 oldSizeOfArray, i;
93 void **newArray, **oldArray; 111 void **newArray, **oldArray;
94 112
95 oldSizeOfArray = info->sizeOfArray; 113 oldSizeOfArray = info->sizeOfArray;
96 if( newSize <= oldSizeOfArray ) return; 114 if( newSize <= oldSizeOfArray ) return;
97 115
98 oldArray = *(info->addrOfPtrToArray); 116 oldArray = *(info->addrOfPtrToArray);
99 newArray = malloc( newSize * sizeof(void *) ); 117 newArray = VMS__malloc( newSize * sizeof(void *) );
100 118
101 for( i = 0; i < oldSizeOfArray; i++ ) 119 for( i = 0; i < oldSizeOfArray; i++ )
102 { 120 {
103 newArray[i] = oldArray[i]; 121 newArray[i] = oldArray[i];
104 } 122 }
105 *(info->addrOfPtrToArray) = newArray; //change location of array-ptr 123 *(info->addrOfPtrToArray) = newArray; //change location of array-ptr
106 info->sizeOfArray = newSize; 124 info->sizeOfArray = newSize;
107 125
108 free( oldArray ); 126 VMS__free( oldArray );
127 }
128
129 /*Can't mix VMS__malloc locations with external malloc locations -- so use
130 * this version inside VMS, which will perform normal malloc in the core
131 * loop -- hopefully avoiding the annoying system-stack bugs..
132 */
133 void
134 VMS_ext__increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize )
135 { int32 oldSizeOfArray, i;
136 void **newArray, **oldArray;
137
138 oldSizeOfArray = info->sizeOfArray;
139 if( newSize <= oldSizeOfArray ) return;
140
141 oldArray = *(info->addrOfPtrToArray);
142 newArray = VMS__malloc_in_ext( newSize * sizeof(void *) );
143
144 for( i = 0; i < oldSizeOfArray; i++ )
145 {
146 newArray[i] = oldArray[i];
147 }
148 *(info->addrOfPtrToArray) = newArray; //change location of array-ptr
149 info->sizeOfArray = newSize;
150
151 VMS__free( oldArray );
109 } 152 }
110 153
111 154
112 /* Frees the array, plus the info 155 /* Frees the array, plus the info
113 */ 156 */
114 void 157 void
115 freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr ) 158 freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr )
116 { 159 {
117 forAllInDynArrayDo( info, freeFnPtr ); 160 forAllInDynArrayDo( info, freeFnPtr );
118 free( *(info->addrOfPtrToArray) ); 161 VMS__free( *(info->addrOfPtrToArray) );
119 free( info ); 162 VMS__free( info );
120 } 163 }
121 164
122 /* Only frees the info 165 /* Only frees the info
123 */ 166 */
124 void 167 void
125 freeDynArrayFlat( DynArrayInfo *info ) 168 freeDynArrayFlat( DynArrayInfo *info )
126 { 169 {
127 free( info ); 170 VMS__free( info );
128 } 171 }
129 172
130 173
131 /*The function has a fixed prototype: takes a void * returns void 174 /*The function has a fixed prototype: takes a void * returns void
132 * So, the function has to internally cast void * to whatever data struc.. 175 * So, the function has to internally cast void * to whatever data struc..