Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > DynArray
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 */ |
