annotate DynArray.c @ 18:ef65bdf3ce16

updated for VMS name chgs from VMS__malloc to VMS_int__malloc
author Me@portablequad
date Sun, 12 Feb 2012 01:46:42 -0800
parents 62b3a4793b6e
children 3e8e1a2a10f5
rev   line source
Me@11 1 /*
Me@11 2 * Copyright 2010 OpenSourceCodeStewardshipFoundation
Me@11 3 *
Me@11 4 * Licensed under BSD
Me@11 5 */
Me@11 6
Me@11 7
Me@11 8
Me@11 9 #include <stdio.h>
Me@11 10
Me@11 11 #include "DynArray.h"
Me@11 12
Me@14 13 //== declarations
Me@14 14 void
Me@14 15 increaseSizeOfDynArrayTo_Ext( PrivDynArrayInfo *info, int32 newSize );
Me@14 16 //==
Me@11 17
Me@14 18 PrivDynArrayInfo *
Me@14 19 makePrivDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray )
Me@14 20 { PrivDynArrayInfo *info;
Me@11 21
Me@18 22 info = VMS_int__malloc( sizeof(PrivDynArrayInfo) );
Me@11 23
Me@11 24 info->addrOfPtrToArray = addrOfPtrToArray;
Me@11 25 info->sizeOfArray = sizeOfArray;
Me@11 26 info->numInArray = 0;
Me@14 27 return info;
Me@11 28 }
Me@11 29
Me@14 30 PrivDynArrayInfo *
Me@14 31 makePrivDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray )
Me@14 32 { PrivDynArrayInfo *info;
Me@11 33
Me@18 34 info = VMS_int__malloc( sizeof(PrivDynArrayInfo) );
Me@11 35
Me@11 36 info->addrOfPtrToArray = addrOfPtrToArray;
Me@14 37
Me@18 38 *(addrOfPtrToArray) = VMS_int__malloc( sizeOfArray * sizeof(void *) );
Me@14 39 info->sizeOfArray = sizeOfArray;
Me@14 40 info->numInArray = 0;
Me@14 41 return info;
Me@14 42 }
Me@14 43
Me@14 44 PrivDynArrayInfo *
Me@14 45 makePrivDynArrayOfSize_Ext( void ***addrOfPtrToArray, int32 sizeOfArray )
Me@14 46 { PrivDynArrayInfo *info;
Me@14 47
Me@14 48 info = malloc( sizeof(PrivDynArrayInfo) );
Me@14 49
Me@14 50 info->addrOfPtrToArray = addrOfPtrToArray;
Me@14 51
Me@11 52 *(addrOfPtrToArray) = malloc( sizeOfArray * sizeof(void *) );
Me@11 53 info->sizeOfArray = sizeOfArray;
Me@11 54 info->numInArray = 0;
Me@11 55 }
Me@11 56
Me@11 57
Me@11 58 /*A dynamic array is same as any other array, but add a DynArrayInfo next
Me@11 59 * to it. Accesses and updates of array indexes are done normally, it's
Me@11 60 * only when add a new element into array that use the extra info.
Me@11 61 * An add can cause the pointer to the normal array to change.. so must
Me@11 62 * be protected to single VP at a time.
Me@11 63 *
Me@11 64 *Only need to use this Fn when need a new index, higher than any previous
Me@11 65 */
Me@11 66 int32
Me@14 67 addToDynArray( void *value, PrivDynArrayInfo *info )
Me@11 68 { int32 numInArray, sizeOfArray;
Me@11 69 void **array;
Me@14 70
Me@11 71 numInArray = info->numInArray;
Me@11 72 sizeOfArray = info->sizeOfArray;
Me@11 73
Me@11 74 if( numInArray >= sizeOfArray )
Me@11 75 {
Me@11 76 increaseSizeOfDynArrayTo( info, sizeOfArray * 2 );
Me@11 77 }
Me@14 78
Me@14 79 array = *(info->addrOfPtrToArray);
Me@14 80 array[ numInArray ] = value;
Me@14 81 info->numInArray++;
Me@14 82
Me@14 83 return numInArray; //pre-incr value is the index put value into
Me@14 84 }
Me@14 85 int32
Me@14 86 addToDynArray_Ext( void *value, PrivDynArrayInfo *info )
Me@14 87 { int32 numInArray, sizeOfArray;
Me@14 88 void **array;
Me@14 89
Me@14 90 numInArray = info->numInArray;
Me@14 91 sizeOfArray = info->sizeOfArray;
Me@14 92
Me@14 93 if( numInArray >= sizeOfArray )
Me@14 94 {
Me@14 95 increaseSizeOfDynArrayTo_Ext( info, sizeOfArray * 2 );
Me@14 96 }
Me@14 97
Me@11 98 array = *(info->addrOfPtrToArray);
Me@11 99 array[ numInArray ] = value;
Me@11 100 info->numInArray++;
Me@11 101
Me@11 102 return numInArray; //pre-incr value is the index put value into
Me@11 103 }
Me@11 104
Me@11 105
Me@11 106 /*Use this when know how many things going to add in -- then can do this
Me@11 107 * once and use as normal array afterwards. If later add another chunk,
Me@11 108 * do this again. Note, this makes new size be just big enough to hold
Me@11 109 * highest index, so will do a linear number of copies if use only this.
Me@11 110 *To cut down on number of copies, can use the increaseSizeTo Fn to
Me@11 111 * exponentially increase size..
Me@11 112 */
Me@11 113 void
Me@14 114 makeHighestDynArrayIndexBe( PrivDynArrayInfo *info, int32 highestIndex )
Me@11 115 {
Me@11 116 if( info->sizeOfArray <= highestIndex )
Me@11 117 {
Me@11 118 increaseSizeOfDynArrayTo( info, highestIndex + 1 );
Me@11 119 }
Me@11 120 info->numInArray = highestIndex + 1;
Me@11 121 }
Me@11 122
Me@14 123 void
Me@14 124 makeHighestDynArrayIndexBeAtLeast(PrivDynArrayInfo *info, int32 index)
Me@14 125 {
Me@14 126 if( index < info->numInArray ) return;
Me@14 127 else makeHighestDynArrayIndexBe( info, index );
Me@14 128 }
Me@14 129
Me@11 130
Me@11 131 /*Only use this if certain new size is bigger than current size
Me@11 132 */
Me@11 133 void
Me@14 134 increaseSizeOfDynArrayTo( PrivDynArrayInfo *info, int32 newSize )
Me@11 135 { int32 oldSizeOfArray, i;
Me@11 136 void **newArray, **oldArray;
Me@14 137
Me@11 138 oldSizeOfArray = info->sizeOfArray;
Me@11 139 if( newSize <= oldSizeOfArray ) return;
Me@14 140
Me@11 141 oldArray = *(info->addrOfPtrToArray);
Me@18 142 newArray = VMS_int__malloc( newSize * sizeof(void *) );
Me@11 143
Me@11 144 for( i = 0; i < oldSizeOfArray; i++ )
Me@11 145 {
Me@11 146 newArray[i] = oldArray[i];
Me@11 147 }
Me@11 148 *(info->addrOfPtrToArray) = newArray; //change location of array-ptr
Me@11 149 info->sizeOfArray = newSize;
Me@11 150
Me@18 151 VMS_int__free( oldArray );
Me@11 152 }
Me@11 153
Me@17 154 /*Can't mix VMS__malloc locations with external malloc locations -- so use
Me@14 155 * this version inside VMS, which will perform normal malloc in the core
Me@14 156 * loop -- hopefully avoiding the annoying system-stack bugs..
Me@14 157 */
Me@14 158 void
Me@14 159 increaseSizeOfDynArrayTo_Ext( PrivDynArrayInfo *info, int32 newSize )
Me@14 160 { int32 oldSizeOfArray, i;
Me@14 161 void **newArray, **oldArray;
Me@14 162
Me@14 163 oldSizeOfArray = info->sizeOfArray;
Me@14 164 if( newSize <= oldSizeOfArray ) return;
Me@14 165
Me@14 166 oldArray = *(info->addrOfPtrToArray);
Me@14 167 newArray = malloc( newSize * sizeof(void *) );
Me@14 168
Me@14 169 for( i = 0; i < oldSizeOfArray; i++ )
Me@14 170 {
Me@14 171 newArray[i] = oldArray[i];
Me@14 172 }
Me@14 173 *(info->addrOfPtrToArray) = newArray; //change location of array-ptr
Me@14 174 info->sizeOfArray = newSize;
Me@14 175
Me@14 176 free( oldArray );
Me@14 177 }
Me@14 178
Me@11 179
Me@11 180 /* Frees the array, plus the info
Me@11 181 */
Me@11 182 void
Me@14 183 freeDynArrayDeep( PrivDynArrayInfo *info, FreeFnPtr freeFnPtr )
Me@11 184 {
Me@11 185 forAllInDynArrayDo( info, freeFnPtr );
Me@18 186 VMS_int__free( *(info->addrOfPtrToArray) );
Me@18 187 VMS_int__free( info );
Me@11 188 }
Me@11 189
Me@11 190 /* Only frees the info
Me@11 191 */
Me@11 192 void
Me@14 193 freeDynArrayFlat( PrivDynArrayInfo *info )
Me@11 194 {
Me@18 195 VMS_int__free( info );
Me@11 196 }
Me@11 197
Me@11 198
Me@11 199 /*The function has a fixed prototype: takes a void * returns void
Me@11 200 * So, the function has to internally cast void * to whatever data struc..
Me@11 201 */
Me@11 202 void
Me@14 203 forAllInDynArrayDo( PrivDynArrayInfo *info, DynArrayFnPtr fnPtr )
Me@11 204 { int32 idx;
Me@11 205 void **array;
Me@11 206
Me@11 207 array = *(info->addrOfPtrToArray);
Me@11 208 for( idx = 0; idx < info->numInArray; idx++ )
Me@11 209 {
Me@11 210 (*fnPtr)(array[idx]);
Me@11 211 }
Me@11 212 }
Me@11 213