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