Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > DynArray
diff DynArray.c @ 14:9de0a9369134
added eol handling and .brch__default to indicate brch (and reason for it)
| author | Me@portablequad |
|---|---|
| date | Sat, 11 Feb 2012 17:43:20 -0800 |
| parents | 601709e9f2a4 |
| children | 62b3a4793b6e |
line diff
1.1 --- a/DynArray.c Thu Feb 09 15:44:39 2012 +0100 1.2 +++ b/DynArray.c Sat Feb 11 17:43:20 2012 -0800 1.3 @@ -7,31 +7,49 @@ 1.4 1.5 1.6 #include <stdio.h> 1.7 -#include <malloc.h> 1.8 1.9 #include "DynArray.h" 1.10 +#include "../vmalloc.h" 1.11 1.12 +//== declarations 1.13 +void 1.14 +increaseSizeOfDynArrayTo_Ext( PrivDynArrayInfo *info, int32 newSize ); 1.15 +//== 1.16 1.17 +PrivDynArrayInfo * 1.18 +makePrivDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ) 1.19 + { PrivDynArrayInfo *info; 1.20 1.21 -DynArrayInfo * 1.22 -makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ) 1.23 - { DynArrayInfo *info; 1.24 - 1.25 - info = malloc( sizeof(DynArrayInfo) ); 1.26 + info = malloc( sizeof(PrivDynArrayInfo) ); 1.27 1.28 info->addrOfPtrToArray = addrOfPtrToArray; 1.29 info->sizeOfArray = sizeOfArray; 1.30 info->numInArray = 0; 1.31 + return info; 1.32 } 1.33 1.34 -DynArrayInfo * 1.35 -makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ) 1.36 - { DynArrayInfo *info; 1.37 +PrivDynArrayInfo * 1.38 +makePrivDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ) 1.39 + { PrivDynArrayInfo *info; 1.40 1.41 - info = malloc( sizeof(DynArrayInfo) ); 1.42 + info = malloc( sizeof(PrivDynArrayInfo) ); 1.43 1.44 info->addrOfPtrToArray = addrOfPtrToArray; 1.45 - 1.46 + 1.47 + *(addrOfPtrToArray) = malloc( sizeOfArray * sizeof(void *) ); 1.48 + info->sizeOfArray = sizeOfArray; 1.49 + info->numInArray = 0; 1.50 + return info; 1.51 + } 1.52 + 1.53 +PrivDynArrayInfo * 1.54 +makePrivDynArrayOfSize_Ext( void ***addrOfPtrToArray, int32 sizeOfArray ) 1.55 + { PrivDynArrayInfo *info; 1.56 + 1.57 + info = malloc( sizeof(PrivDynArrayInfo) ); 1.58 + 1.59 + info->addrOfPtrToArray = addrOfPtrToArray; 1.60 + 1.61 *(addrOfPtrToArray) = malloc( sizeOfArray * sizeof(void *) ); 1.62 info->sizeOfArray = sizeOfArray; 1.63 info->numInArray = 0; 1.64 @@ -47,10 +65,10 @@ 1.65 *Only need to use this Fn when need a new index, higher than any previous 1.66 */ 1.67 int32 1.68 -addToDynArray( void *value, DynArrayInfo *info ) 1.69 +addToDynArray( void *value, PrivDynArrayInfo *info ) 1.70 { int32 numInArray, sizeOfArray; 1.71 void **array; 1.72 - 1.73 + 1.74 numInArray = info->numInArray; 1.75 sizeOfArray = info->sizeOfArray; 1.76 1.77 @@ -58,7 +76,26 @@ 1.78 { 1.79 increaseSizeOfDynArrayTo( info, sizeOfArray * 2 ); 1.80 } 1.81 - 1.82 + 1.83 + array = *(info->addrOfPtrToArray); 1.84 + array[ numInArray ] = value; 1.85 + info->numInArray++; 1.86 + 1.87 + return numInArray; //pre-incr value is the index put value into 1.88 + } 1.89 +int32 1.90 +addToDynArray_Ext( void *value, PrivDynArrayInfo *info ) 1.91 + { int32 numInArray, sizeOfArray; 1.92 + void **array; 1.93 + 1.94 + numInArray = info->numInArray; 1.95 + sizeOfArray = info->sizeOfArray; 1.96 + 1.97 + if( numInArray >= sizeOfArray ) 1.98 + { 1.99 + increaseSizeOfDynArrayTo_Ext( info, sizeOfArray * 2 ); 1.100 + } 1.101 + 1.102 array = *(info->addrOfPtrToArray); 1.103 array[ numInArray ] = value; 1.104 info->numInArray++; 1.105 @@ -75,7 +112,7 @@ 1.106 * exponentially increase size.. 1.107 */ 1.108 void 1.109 -makeHighestDynArrayIndexBe( DynArrayInfo *info, int32 highestIndex ) 1.110 +makeHighestDynArrayIndexBe( PrivDynArrayInfo *info, int32 highestIndex ) 1.111 { 1.112 if( info->sizeOfArray <= highestIndex ) 1.113 { 1.114 @@ -84,17 +121,24 @@ 1.115 info->numInArray = highestIndex + 1; 1.116 } 1.117 1.118 +void 1.119 +makeHighestDynArrayIndexBeAtLeast(PrivDynArrayInfo *info, int32 index) 1.120 + { 1.121 + if( index < info->numInArray ) return; 1.122 + else makeHighestDynArrayIndexBe( info, index ); 1.123 + } 1.124 + 1.125 1.126 /*Only use this if certain new size is bigger than current size 1.127 */ 1.128 void 1.129 -increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ) 1.130 +increaseSizeOfDynArrayTo( PrivDynArrayInfo *info, int32 newSize ) 1.131 { int32 oldSizeOfArray, i; 1.132 void **newArray, **oldArray; 1.133 - 1.134 + 1.135 oldSizeOfArray = info->sizeOfArray; 1.136 if( newSize <= oldSizeOfArray ) return; 1.137 - 1.138 + 1.139 oldArray = *(info->addrOfPtrToArray); 1.140 newArray = malloc( newSize * sizeof(void *) ); 1.141 1.142 @@ -108,11 +152,36 @@ 1.143 free( oldArray ); 1.144 } 1.145 1.146 +/*Can't mix malloc locations with external malloc locations -- so use 1.147 + * this version inside VMS, which will perform normal malloc in the core 1.148 + * loop -- hopefully avoiding the annoying system-stack bugs.. 1.149 + */ 1.150 +void 1.151 +increaseSizeOfDynArrayTo_Ext( PrivDynArrayInfo *info, int32 newSize ) 1.152 + { int32 oldSizeOfArray, i; 1.153 + void **newArray, **oldArray; 1.154 + 1.155 + oldSizeOfArray = info->sizeOfArray; 1.156 + if( newSize <= oldSizeOfArray ) return; 1.157 + 1.158 + oldArray = *(info->addrOfPtrToArray); 1.159 + newArray = malloc( newSize * sizeof(void *) ); 1.160 + 1.161 + for( i = 0; i < oldSizeOfArray; i++ ) 1.162 + { 1.163 + newArray[i] = oldArray[i]; 1.164 + } 1.165 + *(info->addrOfPtrToArray) = newArray; //change location of array-ptr 1.166 + info->sizeOfArray = newSize; 1.167 + 1.168 + free( oldArray ); 1.169 + } 1.170 + 1.171 1.172 /* Frees the array, plus the info 1.173 */ 1.174 void 1.175 -freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr ) 1.176 +freeDynArrayDeep( PrivDynArrayInfo *info, FreeFnPtr freeFnPtr ) 1.177 { 1.178 forAllInDynArrayDo( info, freeFnPtr ); 1.179 free( *(info->addrOfPtrToArray) ); 1.180 @@ -122,7 +191,7 @@ 1.181 /* Only frees the info 1.182 */ 1.183 void 1.184 -freeDynArrayFlat( DynArrayInfo *info ) 1.185 +freeDynArrayFlat( PrivDynArrayInfo *info ) 1.186 { 1.187 free( info ); 1.188 } 1.189 @@ -132,7 +201,7 @@ 1.190 * So, the function has to internally cast void * to whatever data struc.. 1.191 */ 1.192 void 1.193 -forAllInDynArrayDo( DynArrayInfo *info, DynArrayFnPtr fnPtr ) 1.194 +forAllInDynArrayDo( PrivDynArrayInfo *info, DynArrayFnPtr fnPtr ) 1.195 { int32 idx; 1.196 void **array; 1.197
