Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > DynArray
changeset 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 | f9776626259b |
| children | 596260ad0ede bb1217c5d15b |
| files | .brch__default .hgeol DynArray.c DynArray.h |
| diffstat | 4 files changed, 122 insertions(+), 34 deletions(-) [+] |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/.brch__default Sat Feb 11 17:43:20 2012 -0800 1.3 @@ -0,0 +1,1 @@ 1.4 +The default branch is for use with normal C code. Other branches specialize the library for use with VMS.. they may need VMS header files, and the working directory may be located at various different positions relative to the VMS implementation. 1.5 \ No newline at end of file
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/.hgeol Sat Feb 11 17:43:20 2012 -0800 2.3 @@ -0,0 +1,14 @@ 2.4 + 2.5 +[patterns] 2.6 +**.py = native 2.7 +**.txt = native 2.8 +**.c = native 2.9 +**.h = native 2.10 +**.cpp = native 2.11 +**.java = native 2.12 +**.class = bin 2.13 +**.jar = bin 2.14 +**.sh = native 2.15 +**.pl = native 2.16 +**.jpg = bin 2.17 +**.gif = bin
3.1 --- a/DynArray.c Thu Feb 09 15:44:39 2012 +0100 3.2 +++ b/DynArray.c Sat Feb 11 17:43:20 2012 -0800 3.3 @@ -7,31 +7,49 @@ 3.4 3.5 3.6 #include <stdio.h> 3.7 -#include <malloc.h> 3.8 3.9 #include "DynArray.h" 3.10 +#include "../vmalloc.h" 3.11 3.12 +//== declarations 3.13 +void 3.14 +increaseSizeOfDynArrayTo_Ext( PrivDynArrayInfo *info, int32 newSize ); 3.15 +//== 3.16 3.17 +PrivDynArrayInfo * 3.18 +makePrivDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ) 3.19 + { PrivDynArrayInfo *info; 3.20 3.21 -DynArrayInfo * 3.22 -makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ) 3.23 - { DynArrayInfo *info; 3.24 - 3.25 - info = malloc( sizeof(DynArrayInfo) ); 3.26 + info = malloc( sizeof(PrivDynArrayInfo) ); 3.27 3.28 info->addrOfPtrToArray = addrOfPtrToArray; 3.29 info->sizeOfArray = sizeOfArray; 3.30 info->numInArray = 0; 3.31 + return info; 3.32 } 3.33 3.34 -DynArrayInfo * 3.35 -makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ) 3.36 - { DynArrayInfo *info; 3.37 +PrivDynArrayInfo * 3.38 +makePrivDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ) 3.39 + { PrivDynArrayInfo *info; 3.40 3.41 - info = malloc( sizeof(DynArrayInfo) ); 3.42 + info = malloc( sizeof(PrivDynArrayInfo) ); 3.43 3.44 info->addrOfPtrToArray = addrOfPtrToArray; 3.45 - 3.46 + 3.47 + *(addrOfPtrToArray) = malloc( sizeOfArray * sizeof(void *) ); 3.48 + info->sizeOfArray = sizeOfArray; 3.49 + info->numInArray = 0; 3.50 + return info; 3.51 + } 3.52 + 3.53 +PrivDynArrayInfo * 3.54 +makePrivDynArrayOfSize_Ext( void ***addrOfPtrToArray, int32 sizeOfArray ) 3.55 + { PrivDynArrayInfo *info; 3.56 + 3.57 + info = malloc( sizeof(PrivDynArrayInfo) ); 3.58 + 3.59 + info->addrOfPtrToArray = addrOfPtrToArray; 3.60 + 3.61 *(addrOfPtrToArray) = malloc( sizeOfArray * sizeof(void *) ); 3.62 info->sizeOfArray = sizeOfArray; 3.63 info->numInArray = 0; 3.64 @@ -47,10 +65,10 @@ 3.65 *Only need to use this Fn when need a new index, higher than any previous 3.66 */ 3.67 int32 3.68 -addToDynArray( void *value, DynArrayInfo *info ) 3.69 +addToDynArray( void *value, PrivDynArrayInfo *info ) 3.70 { int32 numInArray, sizeOfArray; 3.71 void **array; 3.72 - 3.73 + 3.74 numInArray = info->numInArray; 3.75 sizeOfArray = info->sizeOfArray; 3.76 3.77 @@ -58,7 +76,26 @@ 3.78 { 3.79 increaseSizeOfDynArrayTo( info, sizeOfArray * 2 ); 3.80 } 3.81 - 3.82 + 3.83 + array = *(info->addrOfPtrToArray); 3.84 + array[ numInArray ] = value; 3.85 + info->numInArray++; 3.86 + 3.87 + return numInArray; //pre-incr value is the index put value into 3.88 + } 3.89 +int32 3.90 +addToDynArray_Ext( void *value, PrivDynArrayInfo *info ) 3.91 + { int32 numInArray, sizeOfArray; 3.92 + void **array; 3.93 + 3.94 + numInArray = info->numInArray; 3.95 + sizeOfArray = info->sizeOfArray; 3.96 + 3.97 + if( numInArray >= sizeOfArray ) 3.98 + { 3.99 + increaseSizeOfDynArrayTo_Ext( info, sizeOfArray * 2 ); 3.100 + } 3.101 + 3.102 array = *(info->addrOfPtrToArray); 3.103 array[ numInArray ] = value; 3.104 info->numInArray++; 3.105 @@ -75,7 +112,7 @@ 3.106 * exponentially increase size.. 3.107 */ 3.108 void 3.109 -makeHighestDynArrayIndexBe( DynArrayInfo *info, int32 highestIndex ) 3.110 +makeHighestDynArrayIndexBe( PrivDynArrayInfo *info, int32 highestIndex ) 3.111 { 3.112 if( info->sizeOfArray <= highestIndex ) 3.113 { 3.114 @@ -84,17 +121,24 @@ 3.115 info->numInArray = highestIndex + 1; 3.116 } 3.117 3.118 +void 3.119 +makeHighestDynArrayIndexBeAtLeast(PrivDynArrayInfo *info, int32 index) 3.120 + { 3.121 + if( index < info->numInArray ) return; 3.122 + else makeHighestDynArrayIndexBe( info, index ); 3.123 + } 3.124 + 3.125 3.126 /*Only use this if certain new size is bigger than current size 3.127 */ 3.128 void 3.129 -increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ) 3.130 +increaseSizeOfDynArrayTo( PrivDynArrayInfo *info, int32 newSize ) 3.131 { int32 oldSizeOfArray, i; 3.132 void **newArray, **oldArray; 3.133 - 3.134 + 3.135 oldSizeOfArray = info->sizeOfArray; 3.136 if( newSize <= oldSizeOfArray ) return; 3.137 - 3.138 + 3.139 oldArray = *(info->addrOfPtrToArray); 3.140 newArray = malloc( newSize * sizeof(void *) ); 3.141 3.142 @@ -108,11 +152,36 @@ 3.143 free( oldArray ); 3.144 } 3.145 3.146 +/*Can't mix malloc locations with external malloc locations -- so use 3.147 + * this version inside VMS, which will perform normal malloc in the core 3.148 + * loop -- hopefully avoiding the annoying system-stack bugs.. 3.149 + */ 3.150 +void 3.151 +increaseSizeOfDynArrayTo_Ext( PrivDynArrayInfo *info, int32 newSize ) 3.152 + { int32 oldSizeOfArray, i; 3.153 + void **newArray, **oldArray; 3.154 + 3.155 + oldSizeOfArray = info->sizeOfArray; 3.156 + if( newSize <= oldSizeOfArray ) return; 3.157 + 3.158 + oldArray = *(info->addrOfPtrToArray); 3.159 + newArray = malloc( newSize * sizeof(void *) ); 3.160 + 3.161 + for( i = 0; i < oldSizeOfArray; i++ ) 3.162 + { 3.163 + newArray[i] = oldArray[i]; 3.164 + } 3.165 + *(info->addrOfPtrToArray) = newArray; //change location of array-ptr 3.166 + info->sizeOfArray = newSize; 3.167 + 3.168 + free( oldArray ); 3.169 + } 3.170 + 3.171 3.172 /* Frees the array, plus the info 3.173 */ 3.174 void 3.175 -freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr ) 3.176 +freeDynArrayDeep( PrivDynArrayInfo *info, FreeFnPtr freeFnPtr ) 3.177 { 3.178 forAllInDynArrayDo( info, freeFnPtr ); 3.179 free( *(info->addrOfPtrToArray) ); 3.180 @@ -122,7 +191,7 @@ 3.181 /* Only frees the info 3.182 */ 3.183 void 3.184 -freeDynArrayFlat( DynArrayInfo *info ) 3.185 +freeDynArrayFlat( PrivDynArrayInfo *info ) 3.186 { 3.187 free( info ); 3.188 } 3.189 @@ -132,7 +201,7 @@ 3.190 * So, the function has to internally cast void * to whatever data struc.. 3.191 */ 3.192 void 3.193 -forAllInDynArrayDo( DynArrayInfo *info, DynArrayFnPtr fnPtr ) 3.194 +forAllInDynArrayDo( PrivDynArrayInfo *info, DynArrayFnPtr fnPtr ) 3.195 { int32 idx; 3.196 void **array; 3.197
4.1 --- a/DynArray.h Thu Feb 09 15:44:39 2012 +0100 4.2 +++ b/DynArray.h Sat Feb 11 17:43:20 2012 -0800 4.3 @@ -8,8 +8,6 @@ 4.4 #ifndef _DYNARRAY_H 4.5 #define _DYNARRAY_H 4.6 4.7 -#include "../../VMS_Implementations/VMS_impl/VMS_primitive_data_types.h" 4.8 - 4.9 4.10 //A dynamic array is same as any other array, but add a DynArrayInfo next 4.11 // to it. Accesses and updates of array indexes are done normally, it's 4.12 @@ -22,36 +20,42 @@ 4.13 int32 numInArray; 4.14 int32 sizeOfArray; 4.15 } 4.16 -DynArrayInfo; 4.17 +PrivDynArrayInfo; 4.18 4.19 -DynArrayInfo * 4.20 -makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ); 4.21 +PrivDynArrayInfo * 4.22 +makePrivDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ); 4.23 4.24 -DynArrayInfo * 4.25 -makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ); 4.26 +PrivDynArrayInfo * 4.27 +makePrivDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ); 4.28 + 4.29 +PrivDynArrayInfo * 4.30 +makePrivDynArrayOfSize_Ext( void ***addrOfPtrToArray, int32 sizeOfArray ); 4.31 4.32 int32 4.33 -addToDynArray( void *value, DynArrayInfo *info ); 4.34 +addToDynArray( void *value, PrivDynArrayInfo *info ); 4.35 4.36 void 4.37 -makeHighestDynArrayIndexBe( DynArrayInfo *info, int32 highestIndex ); 4.38 +makeHighestDynArrayIndexBe( PrivDynArrayInfo *info, int32 highestIndex ); 4.39 4.40 void 4.41 -increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ); 4.42 +makeHighestDynArrayIndexBeAtLeast(PrivDynArrayInfo *info,int32 highestIndex); 4.43 + 4.44 +void 4.45 +increaseSizeOfDynArrayTo( PrivDynArrayInfo *info, int32 newSize ); 4.46 4.47 typedef void (*FreeFnPtr) ( void * ); //fn has to cast void * to whatever 4.48 4.49 void 4.50 -freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr ); 4.51 +freeDynArrayDeep( PrivDynArrayInfo *info, FreeFnPtr freeFnPtr ); 4.52 4.53 void 4.54 -freeDynArrayFlat( DynArrayInfo *info ); 4.55 +freeDynArrayFlat( PrivDynArrayInfo *info ); 4.56 4.57 4.58 typedef void (*DynArrayFnPtr) ( void * ); //fn has to cast void * 4.59 4.60 void 4.61 -forAllInDynArrayDo( DynArrayInfo *info, DynArrayFnPtr fnPtr ); 4.62 +forAllInDynArrayDo( PrivDynArrayInfo *info, DynArrayFnPtr fnPtr ); 4.63 4.64 #endif /* _DYNARRAY_H */ 4.65
