comparison DynArray.c @ 6:f4b108f21041

Changed name to PrivDynArrayInfo - to remind can't use on shared data from slave
author Me
date Tue, 02 Nov 2010 16:44:42 -0700
parents 2915fb26c9e2
children 4506c08ed60d 015aab562ace
comparison
equal deleted inserted replaced
3:5b38f2d7b0d9 4:954bdd11b4ce
10 10
11 #include "DynArray.h" 11 #include "DynArray.h"
12 12
13 13
14 14
15 DynArrayInfo * 15 PrivDynArrayInfo *
16 makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ) 16 makePrivDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray )
17 { DynArrayInfo *info; 17 { PrivDynArrayInfo *info;
18 18
19 info = VMS__malloc( sizeof(DynArrayInfo) ); 19 info = VMS__malloc( sizeof(PrivDynArrayInfo) );
20 20
21 info->addrOfPtrToArray = addrOfPtrToArray; 21 info->addrOfPtrToArray = addrOfPtrToArray;
22 info->sizeOfArray = sizeOfArray; 22 info->sizeOfArray = sizeOfArray;
23 info->numInArray = 0; 23 info->numInArray = 0;
24 } 24 }
25 25
26 DynArrayInfo * 26 PrivDynArrayInfo *
27 makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ) 27 makePrivDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray )
28 { DynArrayInfo *info; 28 { PrivDynArrayInfo *info;
29 29
30 info = VMS__malloc( sizeof(DynArrayInfo) ); 30 info = VMS__malloc( sizeof(PrivDynArrayInfo) );
31 31
32 info->addrOfPtrToArray = addrOfPtrToArray; 32 info->addrOfPtrToArray = addrOfPtrToArray;
33 33
34 *(addrOfPtrToArray) = VMS__malloc( sizeOfArray * sizeof(void *) ); 34 *(addrOfPtrToArray) = VMS__malloc( sizeOfArray * sizeof(void *) );
35 info->sizeOfArray = sizeOfArray; 35 info->sizeOfArray = sizeOfArray;
44 * be protected to single VP at a time. 44 * be protected to single VP at a time.
45 * 45 *
46 *Only need to use this Fn when need a new index, higher than any previous 46 *Only need to use this Fn when need a new index, higher than any previous
47 */ 47 */
48 int32 48 int32
49 addToDynArray( void *value, DynArrayInfo *info ) 49 addToDynArray( void *value, PrivDynArrayInfo *info )
50 { int32 numInArray, sizeOfArray; 50 { int32 numInArray, sizeOfArray;
51 void **array; 51 void **array;
52 52
53 numInArray = info->numInArray; 53 numInArray = info->numInArray;
54 sizeOfArray = info->sizeOfArray; 54 sizeOfArray = info->sizeOfArray;
63 info->numInArray++; 63 info->numInArray++;
64 64
65 return numInArray; //pre-incr value is the index put value into 65 return numInArray; //pre-incr value is the index put value into
66 } 66 }
67 int32 67 int32
68 VMS_ext__addToDynArray( void *value, DynArrayInfo *info ) 68 VMS_ext__addToDynArray( void *value, PrivDynArrayInfo *info )
69 { int32 numInArray, sizeOfArray; 69 { int32 numInArray, sizeOfArray;
70 void **array; 70 void **array;
71 71
72 numInArray = info->numInArray; 72 numInArray = info->numInArray;
73 sizeOfArray = info->sizeOfArray; 73 sizeOfArray = info->sizeOfArray;
91 * highest index, so will do a linear number of copies if use only this. 91 * highest index, so will do a linear number of copies if use only this.
92 *To cut down on number of copies, can use the increaseSizeTo Fn to 92 *To cut down on number of copies, can use the increaseSizeTo Fn to
93 * exponentially increase size.. 93 * exponentially increase size..
94 */ 94 */
95 void 95 void
96 makeHighestDynArrayIndexBe( DynArrayInfo *info, int32 highestIndex ) 96 makeHighestDynArrayIndexBe( PrivDynArrayInfo *info, int32 highestIndex )
97 { 97 {
98 if( info->sizeOfArray <= highestIndex ) 98 if( info->sizeOfArray <= highestIndex )
99 { 99 {
100 increaseSizeOfDynArrayTo( info, highestIndex + 1 ); 100 increaseSizeOfDynArrayTo( info, highestIndex + 1 );
101 } 101 }
104 104
105 105
106 /*Only use this if certain new size is bigger than current size 106 /*Only use this if certain new size is bigger than current size
107 */ 107 */
108 void 108 void
109 increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ) 109 increaseSizeOfDynArrayTo( PrivDynArrayInfo *info, int32 newSize )
110 { int32 oldSizeOfArray, i; 110 { int32 oldSizeOfArray, i;
111 void **newArray, **oldArray; 111 void **newArray, **oldArray;
112 112
113 oldSizeOfArray = info->sizeOfArray; 113 oldSizeOfArray = info->sizeOfArray;
114 if( newSize <= oldSizeOfArray ) return; 114 if( newSize <= oldSizeOfArray ) return;
129 /*Can't mix VMS__malloc locations with external malloc locations -- so use 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 130 * this version inside VMS, which will perform normal malloc in the core
131 * loop -- hopefully avoiding the annoying system-stack bugs.. 131 * loop -- hopefully avoiding the annoying system-stack bugs..
132 */ 132 */
133 void 133 void
134 VMS_ext__increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ) 134 VMS_ext__increaseSizeOfDynArrayTo( PrivDynArrayInfo *info, int32 newSize )
135 { int32 oldSizeOfArray, i; 135 { int32 oldSizeOfArray, i;
136 void **newArray, **oldArray; 136 void **newArray, **oldArray;
137 137
138 oldSizeOfArray = info->sizeOfArray; 138 oldSizeOfArray = info->sizeOfArray;
139 if( newSize <= oldSizeOfArray ) return; 139 if( newSize <= oldSizeOfArray ) return;
153 153
154 154
155 /* Frees the array, plus the info 155 /* Frees the array, plus the info
156 */ 156 */
157 void 157 void
158 freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr ) 158 freeDynArrayDeep( PrivDynArrayInfo *info, FreeFnPtr freeFnPtr )
159 { 159 {
160 forAllInDynArrayDo( info, freeFnPtr ); 160 forAllInDynArrayDo( info, freeFnPtr );
161 VMS__free( *(info->addrOfPtrToArray) ); 161 VMS__free( *(info->addrOfPtrToArray) );
162 VMS__free( info ); 162 VMS__free( info );
163 } 163 }
164 164
165 /* Only frees the info 165 /* Only frees the info
166 */ 166 */
167 void 167 void
168 freeDynArrayFlat( DynArrayInfo *info ) 168 freeDynArrayFlat( PrivDynArrayInfo *info )
169 { 169 {
170 VMS__free( info ); 170 VMS__free( info );
171 } 171 }
172 172
173 173
174 /*The function has a fixed prototype: takes a void * returns void 174 /*The function has a fixed prototype: takes a void * returns void
175 * 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..
176 */ 176 */
177 void 177 void
178 forAllInDynArrayDo( DynArrayInfo *info, DynArrayFnPtr fnPtr ) 178 forAllInDynArrayDo( PrivDynArrayInfo *info, DynArrayFnPtr fnPtr )
179 { int32 idx; 179 { int32 idx;
180 void **array; 180 void **array;
181 181
182 array = *(info->addrOfPtrToArray); 182 array = *(info->addrOfPtrToArray);
183 for( idx = 0; idx < info->numInArray; idx++ ) 183 for( idx = 0; idx < info->numInArray; idx++ )