annotate DynArray.c @ 15:53c5d022dd45

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