Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > DynArray
comparison DynArray.c @ 5:2915fb26c9e2
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 |
comparison
equal
deleted
inserted
replaced
| 2:a8b72852155d | 3:5b38f2d7b0d9 |
|---|---|
| 5 */ | 5 */ |
| 6 | 6 |
| 7 | 7 |
| 8 | 8 |
| 9 #include <stdio.h> | 9 #include <stdio.h> |
| 10 #include <malloc.h> | |
| 11 | 10 |
| 12 #include "DynArray.h" | 11 #include "DynArray.h" |
| 13 | 12 |
| 14 | 13 |
| 15 | 14 |
| 16 DynArrayInfo * | 15 DynArrayInfo * |
| 17 makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ) | 16 makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ) |
| 18 { DynArrayInfo *info; | 17 { DynArrayInfo *info; |
| 19 | 18 |
| 20 info = malloc( sizeof(DynArrayInfo) ); | 19 info = VMS__malloc( sizeof(DynArrayInfo) ); |
| 21 | 20 |
| 22 info->addrOfPtrToArray = addrOfPtrToArray; | 21 info->addrOfPtrToArray = addrOfPtrToArray; |
| 23 info->sizeOfArray = sizeOfArray; | 22 info->sizeOfArray = sizeOfArray; |
| 24 info->numInArray = 0; | 23 info->numInArray = 0; |
| 25 } | 24 } |
| 26 | 25 |
| 27 DynArrayInfo * | 26 DynArrayInfo * |
| 28 makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ) | 27 makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ) |
| 29 { DynArrayInfo *info; | 28 { DynArrayInfo *info; |
| 30 | 29 |
| 31 info = malloc( sizeof(DynArrayInfo) ); | 30 info = VMS__malloc( sizeof(DynArrayInfo) ); |
| 32 | 31 |
| 33 info->addrOfPtrToArray = addrOfPtrToArray; | 32 info->addrOfPtrToArray = addrOfPtrToArray; |
| 34 | 33 |
| 35 *(addrOfPtrToArray) = malloc( sizeOfArray * sizeof(void *) ); | 34 *(addrOfPtrToArray) = VMS__malloc( sizeOfArray * sizeof(void *) ); |
| 36 info->sizeOfArray = sizeOfArray; | 35 info->sizeOfArray = sizeOfArray; |
| 37 info->numInArray = 0; | 36 info->numInArray = 0; |
| 38 } | 37 } |
| 39 | 38 |
| 40 | 39 |
| 48 */ | 47 */ |
| 49 int32 | 48 int32 |
| 50 addToDynArray( void *value, DynArrayInfo *info ) | 49 addToDynArray( void *value, DynArrayInfo *info ) |
| 51 { int32 numInArray, sizeOfArray; | 50 { int32 numInArray, sizeOfArray; |
| 52 void **array; | 51 void **array; |
| 53 | 52 |
| 54 numInArray = info->numInArray; | 53 numInArray = info->numInArray; |
| 55 sizeOfArray = info->sizeOfArray; | 54 sizeOfArray = info->sizeOfArray; |
| 56 | 55 |
| 57 if( numInArray >= sizeOfArray ) | 56 if( numInArray >= sizeOfArray ) |
| 58 { | 57 { |
| 59 increaseSizeOfDynArrayTo( info, sizeOfArray * 2 ); | 58 increaseSizeOfDynArrayTo( info, sizeOfArray * 2 ); |
| 60 } | 59 } |
| 61 | 60 |
| 61 array = *(info->addrOfPtrToArray); | |
| 62 array[ numInArray ] = value; | |
| 63 info->numInArray++; | |
| 64 | |
| 65 return numInArray; //pre-incr value is the index put value into | |
| 66 } | |
| 67 int32 | |
| 68 VMS_ext__addToDynArray( void *value, DynArrayInfo *info ) | |
| 69 { int32 numInArray, sizeOfArray; | |
| 70 void **array; | |
| 71 | |
| 72 numInArray = info->numInArray; | |
| 73 sizeOfArray = info->sizeOfArray; | |
| 74 | |
| 75 if( numInArray >= sizeOfArray ) | |
| 76 { | |
| 77 VMS_ext__increaseSizeOfDynArrayTo( info, sizeOfArray * 2 ); | |
| 78 } | |
| 79 | |
| 62 array = *(info->addrOfPtrToArray); | 80 array = *(info->addrOfPtrToArray); |
| 63 array[ numInArray ] = value; | 81 array[ numInArray ] = value; |
| 64 info->numInArray++; | 82 info->numInArray++; |
| 65 | 83 |
| 66 return numInArray; //pre-incr value is the index put value into | 84 return numInArray; //pre-incr value is the index put value into |
| 89 */ | 107 */ |
| 90 void | 108 void |
| 91 increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ) | 109 increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ) |
| 92 { int32 oldSizeOfArray, i; | 110 { int32 oldSizeOfArray, i; |
| 93 void **newArray, **oldArray; | 111 void **newArray, **oldArray; |
| 94 | 112 |
| 95 oldSizeOfArray = info->sizeOfArray; | 113 oldSizeOfArray = info->sizeOfArray; |
| 96 if( newSize <= oldSizeOfArray ) return; | 114 if( newSize <= oldSizeOfArray ) return; |
| 97 | 115 |
| 98 oldArray = *(info->addrOfPtrToArray); | 116 oldArray = *(info->addrOfPtrToArray); |
| 99 newArray = malloc( newSize * sizeof(void *) ); | 117 newArray = VMS__malloc( newSize * sizeof(void *) ); |
| 100 | 118 |
| 101 for( i = 0; i < oldSizeOfArray; i++ ) | 119 for( i = 0; i < oldSizeOfArray; i++ ) |
| 102 { | 120 { |
| 103 newArray[i] = oldArray[i]; | 121 newArray[i] = oldArray[i]; |
| 104 } | 122 } |
| 105 *(info->addrOfPtrToArray) = newArray; //change location of array-ptr | 123 *(info->addrOfPtrToArray) = newArray; //change location of array-ptr |
| 106 info->sizeOfArray = newSize; | 124 info->sizeOfArray = newSize; |
| 107 | 125 |
| 108 free( oldArray ); | 126 VMS__free( oldArray ); |
| 127 } | |
| 128 | |
| 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 | |
| 131 * loop -- hopefully avoiding the annoying system-stack bugs.. | |
| 132 */ | |
| 133 void | |
| 134 VMS_ext__increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ) | |
| 135 { int32 oldSizeOfArray, i; | |
| 136 void **newArray, **oldArray; | |
| 137 | |
| 138 oldSizeOfArray = info->sizeOfArray; | |
| 139 if( newSize <= oldSizeOfArray ) return; | |
| 140 | |
| 141 oldArray = *(info->addrOfPtrToArray); | |
| 142 newArray = VMS__malloc_in_ext( newSize * sizeof(void *) ); | |
| 143 | |
| 144 for( i = 0; i < oldSizeOfArray; i++ ) | |
| 145 { | |
| 146 newArray[i] = oldArray[i]; | |
| 147 } | |
| 148 *(info->addrOfPtrToArray) = newArray; //change location of array-ptr | |
| 149 info->sizeOfArray = newSize; | |
| 150 | |
| 151 VMS__free( oldArray ); | |
| 109 } | 152 } |
| 110 | 153 |
| 111 | 154 |
| 112 /* Frees the array, plus the info | 155 /* Frees the array, plus the info |
| 113 */ | 156 */ |
| 114 void | 157 void |
| 115 freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr ) | 158 freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr ) |
| 116 { | 159 { |
| 117 forAllInDynArrayDo( info, freeFnPtr ); | 160 forAllInDynArrayDo( info, freeFnPtr ); |
| 118 free( *(info->addrOfPtrToArray) ); | 161 VMS__free( *(info->addrOfPtrToArray) ); |
| 119 free( info ); | 162 VMS__free( info ); |
| 120 } | 163 } |
| 121 | 164 |
| 122 /* Only frees the info | 165 /* Only frees the info |
| 123 */ | 166 */ |
| 124 void | 167 void |
| 125 freeDynArrayFlat( DynArrayInfo *info ) | 168 freeDynArrayFlat( DynArrayInfo *info ) |
| 126 { | 169 { |
| 127 free( info ); | 170 VMS__free( info ); |
| 128 } | 171 } |
| 129 | 172 |
| 130 | 173 |
| 131 /*The function has a fixed prototype: takes a void * returns void | 174 /*The function has a fixed prototype: takes a void * returns void |
| 132 * 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.. |
