Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > DynArray
changeset 5:2915fb26c9e2 VMS__malloc_brch
Changed malloc and free to VMS__malloc and VMS__free
| author | Me |
|---|---|
| date | Sun, 31 Oct 2010 20:26:32 -0700 |
| parents | f35e64d7a42b |
| children | f4b108f21041 |
| files | DynArray.c |
| diffstat | 1 files changed, 56 insertions(+), 13 deletions(-) [+] |
line diff
1.1 --- a/DynArray.c Sat Oct 30 22:12:32 2010 -0700 1.2 +++ b/DynArray.c Sun Oct 31 20:26:32 2010 -0700 1.3 @@ -7,7 +7,6 @@ 1.4 1.5 1.6 #include <stdio.h> 1.7 -#include <malloc.h> 1.8 1.9 #include "DynArray.h" 1.10 1.11 @@ -17,7 +16,7 @@ 1.12 makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ) 1.13 { DynArrayInfo *info; 1.14 1.15 - info = malloc( sizeof(DynArrayInfo) ); 1.16 + info = VMS__malloc( sizeof(DynArrayInfo) ); 1.17 1.18 info->addrOfPtrToArray = addrOfPtrToArray; 1.19 info->sizeOfArray = sizeOfArray; 1.20 @@ -28,11 +27,11 @@ 1.21 makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ) 1.22 { DynArrayInfo *info; 1.23 1.24 - info = malloc( sizeof(DynArrayInfo) ); 1.25 + info = VMS__malloc( sizeof(DynArrayInfo) ); 1.26 1.27 info->addrOfPtrToArray = addrOfPtrToArray; 1.28 1.29 - *(addrOfPtrToArray) = malloc( sizeOfArray * sizeof(void *) ); 1.30 + *(addrOfPtrToArray) = VMS__malloc( sizeOfArray * sizeof(void *) ); 1.31 info->sizeOfArray = sizeOfArray; 1.32 info->numInArray = 0; 1.33 } 1.34 @@ -50,7 +49,7 @@ 1.35 addToDynArray( void *value, DynArrayInfo *info ) 1.36 { int32 numInArray, sizeOfArray; 1.37 void **array; 1.38 - 1.39 + 1.40 numInArray = info->numInArray; 1.41 sizeOfArray = info->sizeOfArray; 1.42 1.43 @@ -58,7 +57,26 @@ 1.44 { 1.45 increaseSizeOfDynArrayTo( info, sizeOfArray * 2 ); 1.46 } 1.47 - 1.48 + 1.49 + array = *(info->addrOfPtrToArray); 1.50 + array[ numInArray ] = value; 1.51 + info->numInArray++; 1.52 + 1.53 + return numInArray; //pre-incr value is the index put value into 1.54 + } 1.55 +int32 1.56 +VMS_ext__addToDynArray( void *value, DynArrayInfo *info ) 1.57 + { int32 numInArray, sizeOfArray; 1.58 + void **array; 1.59 + 1.60 + numInArray = info->numInArray; 1.61 + sizeOfArray = info->sizeOfArray; 1.62 + 1.63 + if( numInArray >= sizeOfArray ) 1.64 + { 1.65 + VMS_ext__increaseSizeOfDynArrayTo( info, sizeOfArray * 2 ); 1.66 + } 1.67 + 1.68 array = *(info->addrOfPtrToArray); 1.69 array[ numInArray ] = value; 1.70 info->numInArray++; 1.71 @@ -91,12 +109,12 @@ 1.72 increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ) 1.73 { int32 oldSizeOfArray, i; 1.74 void **newArray, **oldArray; 1.75 - 1.76 + 1.77 oldSizeOfArray = info->sizeOfArray; 1.78 if( newSize <= oldSizeOfArray ) return; 1.79 - 1.80 + 1.81 oldArray = *(info->addrOfPtrToArray); 1.82 - newArray = malloc( newSize * sizeof(void *) ); 1.83 + newArray = VMS__malloc( newSize * sizeof(void *) ); 1.84 1.85 for( i = 0; i < oldSizeOfArray; i++ ) 1.86 { 1.87 @@ -105,7 +123,32 @@ 1.88 *(info->addrOfPtrToArray) = newArray; //change location of array-ptr 1.89 info->sizeOfArray = newSize; 1.90 1.91 - free( oldArray ); 1.92 + VMS__free( oldArray ); 1.93 + } 1.94 + 1.95 +/*Can't mix VMS__malloc locations with external malloc locations -- so use 1.96 + * this version inside VMS, which will perform normal malloc in the core 1.97 + * loop -- hopefully avoiding the annoying system-stack bugs.. 1.98 + */ 1.99 +void 1.100 +VMS_ext__increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ) 1.101 + { int32 oldSizeOfArray, i; 1.102 + void **newArray, **oldArray; 1.103 + 1.104 + oldSizeOfArray = info->sizeOfArray; 1.105 + if( newSize <= oldSizeOfArray ) return; 1.106 + 1.107 + oldArray = *(info->addrOfPtrToArray); 1.108 + newArray = VMS__malloc_in_ext( newSize * sizeof(void *) ); 1.109 + 1.110 + for( i = 0; i < oldSizeOfArray; i++ ) 1.111 + { 1.112 + newArray[i] = oldArray[i]; 1.113 + } 1.114 + *(info->addrOfPtrToArray) = newArray; //change location of array-ptr 1.115 + info->sizeOfArray = newSize; 1.116 + 1.117 + VMS__free( oldArray ); 1.118 } 1.119 1.120 1.121 @@ -115,8 +158,8 @@ 1.122 freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr ) 1.123 { 1.124 forAllInDynArrayDo( info, freeFnPtr ); 1.125 - free( *(info->addrOfPtrToArray) ); 1.126 - free( info ); 1.127 + VMS__free( *(info->addrOfPtrToArray) ); 1.128 + VMS__free( info ); 1.129 } 1.130 1.131 /* Only frees the info 1.132 @@ -124,7 +167,7 @@ 1.133 void 1.134 freeDynArrayFlat( DynArrayInfo *info ) 1.135 { 1.136 - free( info ); 1.137 + VMS__free( info ); 1.138 } 1.139 1.140
