# HG changeset patch # User Me@portablequad # Date 1328647889 28800 # Node ID 601709e9f2a416e356e2f77e3980cb5042bfc4b9 # Parent f35e64d7a42be29c1c5f56166e07912c9b1fd0c9 Newly created project repository -- commit sub-states diff -r f35e64d7a42b -r 601709e9f2a4 DynArray.c --- a/DynArray.c Sat Oct 30 22:12:32 2010 -0700 +++ b/DynArray.c Tue Feb 07 12:51:29 2012 -0800 @@ -1,145 +1,145 @@ -/* - * Copyright 2010 OpenSourceCodeStewardshipFoundation - * - * Licensed under BSD - */ - - - -#include -#include - -#include "DynArray.h" - - - -DynArrayInfo * -makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ) - { DynArrayInfo *info; - - info = malloc( sizeof(DynArrayInfo) ); - - info->addrOfPtrToArray = addrOfPtrToArray; - info->sizeOfArray = sizeOfArray; - info->numInArray = 0; - } - -DynArrayInfo * -makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ) - { DynArrayInfo *info; - - info = malloc( sizeof(DynArrayInfo) ); - - info->addrOfPtrToArray = addrOfPtrToArray; - - *(addrOfPtrToArray) = malloc( sizeOfArray * sizeof(void *) ); - info->sizeOfArray = sizeOfArray; - info->numInArray = 0; - } - - -/*A dynamic array is same as any other array, but add a DynArrayInfo next - * to it. Accesses and updates of array indexes are done normally, it's - * only when add a new element into array that use the extra info. - * An add can cause the pointer to the normal array to change.. so must - * be protected to single VP at a time. - * - *Only need to use this Fn when need a new index, higher than any previous - */ -int32 -addToDynArray( void *value, DynArrayInfo *info ) - { int32 numInArray, sizeOfArray; - void **array; - - numInArray = info->numInArray; - sizeOfArray = info->sizeOfArray; - - if( numInArray >= sizeOfArray ) - { - increaseSizeOfDynArrayTo( info, sizeOfArray * 2 ); - } - - array = *(info->addrOfPtrToArray); - array[ numInArray ] = value; - info->numInArray++; - - return numInArray; //pre-incr value is the index put value into - } - - -/*Use this when know how many things going to add in -- then can do this - * once and use as normal array afterwards. If later add another chunk, - * do this again. Note, this makes new size be just big enough to hold - * highest index, so will do a linear number of copies if use only this. - *To cut down on number of copies, can use the increaseSizeTo Fn to - * exponentially increase size.. - */ -void -makeHighestDynArrayIndexBe( DynArrayInfo *info, int32 highestIndex ) - { - if( info->sizeOfArray <= highestIndex ) - { - increaseSizeOfDynArrayTo( info, highestIndex + 1 ); - } - info->numInArray = highestIndex + 1; - } - - -/*Only use this if certain new size is bigger than current size - */ -void -increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ) - { int32 oldSizeOfArray, i; - void **newArray, **oldArray; - - oldSizeOfArray = info->sizeOfArray; - if( newSize <= oldSizeOfArray ) return; - - oldArray = *(info->addrOfPtrToArray); - newArray = malloc( newSize * sizeof(void *) ); - - for( i = 0; i < oldSizeOfArray; i++ ) - { - newArray[i] = oldArray[i]; - } - *(info->addrOfPtrToArray) = newArray; //change location of array-ptr - info->sizeOfArray = newSize; - - free( oldArray ); - } - - -/* Frees the array, plus the info - */ -void -freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr ) - { - forAllInDynArrayDo( info, freeFnPtr ); - free( *(info->addrOfPtrToArray) ); - free( info ); - } - -/* Only frees the info - */ -void -freeDynArrayFlat( DynArrayInfo *info ) - { - free( info ); - } - - -/*The function has a fixed prototype: takes a void * returns void - * So, the function has to internally cast void * to whatever data struc.. - */ -void -forAllInDynArrayDo( DynArrayInfo *info, DynArrayFnPtr fnPtr ) - { int32 idx; - void **array; - - array = *(info->addrOfPtrToArray); - for( idx = 0; idx < info->numInArray; idx++ ) - { - (*fnPtr)(array[idx]); - } - } - +/* + * Copyright 2010 OpenSourceCodeStewardshipFoundation + * + * Licensed under BSD + */ + + + +#include +#include + +#include "DynArray.h" + + + +DynArrayInfo * +makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ) + { DynArrayInfo *info; + + info = malloc( sizeof(DynArrayInfo) ); + + info->addrOfPtrToArray = addrOfPtrToArray; + info->sizeOfArray = sizeOfArray; + info->numInArray = 0; + } + +DynArrayInfo * +makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ) + { DynArrayInfo *info; + + info = malloc( sizeof(DynArrayInfo) ); + + info->addrOfPtrToArray = addrOfPtrToArray; + + *(addrOfPtrToArray) = malloc( sizeOfArray * sizeof(void *) ); + info->sizeOfArray = sizeOfArray; + info->numInArray = 0; + } + + +/*A dynamic array is same as any other array, but add a DynArrayInfo next + * to it. Accesses and updates of array indexes are done normally, it's + * only when add a new element into array that use the extra info. + * An add can cause the pointer to the normal array to change.. so must + * be protected to single VP at a time. + * + *Only need to use this Fn when need a new index, higher than any previous + */ +int32 +addToDynArray( void *value, DynArrayInfo *info ) + { int32 numInArray, sizeOfArray; + void **array; + + numInArray = info->numInArray; + sizeOfArray = info->sizeOfArray; + + if( numInArray >= sizeOfArray ) + { + increaseSizeOfDynArrayTo( info, sizeOfArray * 2 ); + } + + array = *(info->addrOfPtrToArray); + array[ numInArray ] = value; + info->numInArray++; + + return numInArray; //pre-incr value is the index put value into + } + + +/*Use this when know how many things going to add in -- then can do this + * once and use as normal array afterwards. If later add another chunk, + * do this again. Note, this makes new size be just big enough to hold + * highest index, so will do a linear number of copies if use only this. + *To cut down on number of copies, can use the increaseSizeTo Fn to + * exponentially increase size.. + */ +void +makeHighestDynArrayIndexBe( DynArrayInfo *info, int32 highestIndex ) + { + if( info->sizeOfArray <= highestIndex ) + { + increaseSizeOfDynArrayTo( info, highestIndex + 1 ); + } + info->numInArray = highestIndex + 1; + } + + +/*Only use this if certain new size is bigger than current size + */ +void +increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ) + { int32 oldSizeOfArray, i; + void **newArray, **oldArray; + + oldSizeOfArray = info->sizeOfArray; + if( newSize <= oldSizeOfArray ) return; + + oldArray = *(info->addrOfPtrToArray); + newArray = malloc( newSize * sizeof(void *) ); + + for( i = 0; i < oldSizeOfArray; i++ ) + { + newArray[i] = oldArray[i]; + } + *(info->addrOfPtrToArray) = newArray; //change location of array-ptr + info->sizeOfArray = newSize; + + free( oldArray ); + } + + +/* Frees the array, plus the info + */ +void +freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr ) + { + forAllInDynArrayDo( info, freeFnPtr ); + free( *(info->addrOfPtrToArray) ); + free( info ); + } + +/* Only frees the info + */ +void +freeDynArrayFlat( DynArrayInfo *info ) + { + free( info ); + } + + +/*The function has a fixed prototype: takes a void * returns void + * So, the function has to internally cast void * to whatever data struc.. + */ +void +forAllInDynArrayDo( DynArrayInfo *info, DynArrayFnPtr fnPtr ) + { int32 idx; + void **array; + + array = *(info->addrOfPtrToArray); + for( idx = 0; idx < info->numInArray; idx++ ) + { + (*fnPtr)(array[idx]); + } + } +