comparison DynArray.c @ 7:4506c08ed60d

added external, and "AtLeast"
author Me
date Sat, 20 Nov 2010 08:21:49 +0100
parents f4b108f21041
children bc91986481e1
comparison
equal deleted inserted replaced
4:954bdd11b4ce 5:871b1e4c536c
28 { PrivDynArrayInfo *info; 28 { PrivDynArrayInfo *info;
29 29
30 info = VMS__malloc( sizeof(PrivDynArrayInfo) ); 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;
36 info->numInArray = 0;
37 }
38
39 PrivDynArrayInfo *
40 makePrivDynArrayOfSize_Ext( void ***addrOfPtrToArray, int32 sizeOfArray )
41 { PrivDynArrayInfo *info;
42
43 info = malloc( sizeof(PrivDynArrayInfo) );
44
45 info->addrOfPtrToArray = addrOfPtrToArray;
46
47 *(addrOfPtrToArray) = malloc( sizeOfArray * sizeof(void *) );
35 info->sizeOfArray = sizeOfArray; 48 info->sizeOfArray = sizeOfArray;
36 info->numInArray = 0; 49 info->numInArray = 0;
37 } 50 }
38 51
39 52
63 info->numInArray++; 76 info->numInArray++;
64 77
65 return numInArray; //pre-incr value is the index put value into 78 return numInArray; //pre-incr value is the index put value into
66 } 79 }
67 int32 80 int32
68 VMS_ext__addToDynArray( void *value, PrivDynArrayInfo *info ) 81 addToDynArray_Ext( void *value, PrivDynArrayInfo *info )
69 { int32 numInArray, sizeOfArray; 82 { int32 numInArray, sizeOfArray;
70 void **array; 83 void **array;
71 84
72 numInArray = info->numInArray; 85 numInArray = info->numInArray;
73 sizeOfArray = info->sizeOfArray; 86 sizeOfArray = info->sizeOfArray;
74 87
75 if( numInArray >= sizeOfArray ) 88 if( numInArray >= sizeOfArray )
76 { 89 {
77 VMS_ext__increaseSizeOfDynArrayTo( info, sizeOfArray * 2 ); 90 increaseSizeOfDynArrayTo_Ext( info, sizeOfArray * 2 );
78 } 91 }
79 92
80 array = *(info->addrOfPtrToArray); 93 array = *(info->addrOfPtrToArray);
81 array[ numInArray ] = value; 94 array[ numInArray ] = value;
82 info->numInArray++; 95 info->numInArray++;
100 increaseSizeOfDynArrayTo( info, highestIndex + 1 ); 113 increaseSizeOfDynArrayTo( info, highestIndex + 1 );
101 } 114 }
102 info->numInArray = highestIndex + 1; 115 info->numInArray = highestIndex + 1;
103 } 116 }
104 117
118 void
119 makeHighestDynArrayIndexBeAtLeast(PrivDynArrayInfo *info, int32 index)
120 {
121 if( index < info->numInArray ) return;
122 else makeHighestDynArrayIndexBe( info, index );
123 }
124
105 125
106 /*Only use this if certain new size is bigger than current size 126 /*Only use this if certain new size is bigger than current size
107 */ 127 */
108 void 128 void
109 increaseSizeOfDynArrayTo( PrivDynArrayInfo *info, int32 newSize ) 129 increaseSizeOfDynArrayTo( PrivDynArrayInfo *info, int32 newSize )
129 /*Can't mix VMS__malloc locations with external malloc locations -- so use 149 /*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 150 * this version inside VMS, which will perform normal malloc in the core
131 * loop -- hopefully avoiding the annoying system-stack bugs.. 151 * loop -- hopefully avoiding the annoying system-stack bugs..
132 */ 152 */
133 void 153 void
134 VMS_ext__increaseSizeOfDynArrayTo( PrivDynArrayInfo *info, int32 newSize ) 154 increaseSizeOfDynArrayTo_Ext( PrivDynArrayInfo *info, int32 newSize )
135 { int32 oldSizeOfArray, i; 155 { int32 oldSizeOfArray, i;
136 void **newArray, **oldArray; 156 void **newArray, **oldArray;
137 157
138 oldSizeOfArray = info->sizeOfArray; 158 oldSizeOfArray = info->sizeOfArray;
139 if( newSize <= oldSizeOfArray ) return; 159 if( newSize <= oldSizeOfArray ) return;
140 160
141 oldArray = *(info->addrOfPtrToArray); 161 oldArray = *(info->addrOfPtrToArray);
142 newArray = VMS__malloc_in_ext( newSize * sizeof(void *) ); 162 newArray = malloc( newSize * sizeof(void *) );
143 163
144 for( i = 0; i < oldSizeOfArray; i++ ) 164 for( i = 0; i < oldSizeOfArray; i++ )
145 { 165 {
146 newArray[i] = oldArray[i]; 166 newArray[i] = oldArray[i];
147 } 167 }
148 *(info->addrOfPtrToArray) = newArray; //change location of array-ptr 168 *(info->addrOfPtrToArray) = newArray; //change location of array-ptr
149 info->sizeOfArray = newSize; 169 info->sizeOfArray = newSize;
150 170
151 VMS__free( oldArray ); 171 free( oldArray );
152 } 172 }
153 173
154 174
155 /* Frees the array, plus the info 175 /* Frees the array, plus the info
156 */ 176 */