# HG changeset patch # User Me@portablequad # Date 1329011000 28800 # Node ID 9de0a9369134aae6a229a7163c25fbe2efbc7536 # Parent f9776626259b4bbc558855eaeb5b419857ee70da added eol handling and .brch__default to indicate brch (and reason for it) diff -r f9776626259b -r 9de0a9369134 .brch__default --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.brch__default Sat Feb 11 17:43:20 2012 -0800 @@ -0,0 +1,1 @@ +The default branch is for use with normal C code. Other branches specialize the library for use with VMS.. they may need VMS header files, and the working directory may be located at various different positions relative to the VMS implementation. \ No newline at end of file diff -r f9776626259b -r 9de0a9369134 .hgeol --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgeol Sat Feb 11 17:43:20 2012 -0800 @@ -0,0 +1,14 @@ + +[patterns] +**.py = native +**.txt = native +**.c = native +**.h = native +**.cpp = native +**.java = native +**.class = bin +**.jar = bin +**.sh = native +**.pl = native +**.jpg = bin +**.gif = bin diff -r f9776626259b -r 9de0a9369134 DynArray.c --- a/DynArray.c Thu Feb 09 15:44:39 2012 +0100 +++ b/DynArray.c Sat Feb 11 17:43:20 2012 -0800 @@ -7,31 +7,49 @@ #include -#include #include "DynArray.h" +#include "../vmalloc.h" +//== declarations +void +increaseSizeOfDynArrayTo_Ext( PrivDynArrayInfo *info, int32 newSize ); +//== +PrivDynArrayInfo * +makePrivDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ) + { PrivDynArrayInfo *info; -DynArrayInfo * -makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ) - { DynArrayInfo *info; - - info = malloc( sizeof(DynArrayInfo) ); + info = malloc( sizeof(PrivDynArrayInfo) ); info->addrOfPtrToArray = addrOfPtrToArray; info->sizeOfArray = sizeOfArray; info->numInArray = 0; + return info; } -DynArrayInfo * -makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ) - { DynArrayInfo *info; +PrivDynArrayInfo * +makePrivDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ) + { PrivDynArrayInfo *info; - info = malloc( sizeof(DynArrayInfo) ); + info = malloc( sizeof(PrivDynArrayInfo) ); info->addrOfPtrToArray = addrOfPtrToArray; - + + *(addrOfPtrToArray) = malloc( sizeOfArray * sizeof(void *) ); + info->sizeOfArray = sizeOfArray; + info->numInArray = 0; + return info; + } + +PrivDynArrayInfo * +makePrivDynArrayOfSize_Ext( void ***addrOfPtrToArray, int32 sizeOfArray ) + { PrivDynArrayInfo *info; + + info = malloc( sizeof(PrivDynArrayInfo) ); + + info->addrOfPtrToArray = addrOfPtrToArray; + *(addrOfPtrToArray) = malloc( sizeOfArray * sizeof(void *) ); info->sizeOfArray = sizeOfArray; info->numInArray = 0; @@ -47,10 +65,10 @@ *Only need to use this Fn when need a new index, higher than any previous */ int32 -addToDynArray( void *value, DynArrayInfo *info ) +addToDynArray( void *value, PrivDynArrayInfo *info ) { int32 numInArray, sizeOfArray; void **array; - + numInArray = info->numInArray; sizeOfArray = info->sizeOfArray; @@ -58,7 +76,26 @@ { increaseSizeOfDynArrayTo( info, sizeOfArray * 2 ); } - + + array = *(info->addrOfPtrToArray); + array[ numInArray ] = value; + info->numInArray++; + + return numInArray; //pre-incr value is the index put value into + } +int32 +addToDynArray_Ext( void *value, PrivDynArrayInfo *info ) + { int32 numInArray, sizeOfArray; + void **array; + + numInArray = info->numInArray; + sizeOfArray = info->sizeOfArray; + + if( numInArray >= sizeOfArray ) + { + increaseSizeOfDynArrayTo_Ext( info, sizeOfArray * 2 ); + } + array = *(info->addrOfPtrToArray); array[ numInArray ] = value; info->numInArray++; @@ -75,7 +112,7 @@ * exponentially increase size.. */ void -makeHighestDynArrayIndexBe( DynArrayInfo *info, int32 highestIndex ) +makeHighestDynArrayIndexBe( PrivDynArrayInfo *info, int32 highestIndex ) { if( info->sizeOfArray <= highestIndex ) { @@ -84,17 +121,24 @@ info->numInArray = highestIndex + 1; } +void +makeHighestDynArrayIndexBeAtLeast(PrivDynArrayInfo *info, int32 index) + { + if( index < info->numInArray ) return; + else makeHighestDynArrayIndexBe( info, index ); + } + /*Only use this if certain new size is bigger than current size */ void -increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ) +increaseSizeOfDynArrayTo( PrivDynArrayInfo *info, int32 newSize ) { int32 oldSizeOfArray, i; void **newArray, **oldArray; - + oldSizeOfArray = info->sizeOfArray; if( newSize <= oldSizeOfArray ) return; - + oldArray = *(info->addrOfPtrToArray); newArray = malloc( newSize * sizeof(void *) ); @@ -108,11 +152,36 @@ free( oldArray ); } +/*Can't mix malloc locations with external malloc locations -- so use + * this version inside VMS, which will perform normal malloc in the core + * loop -- hopefully avoiding the annoying system-stack bugs.. + */ +void +increaseSizeOfDynArrayTo_Ext( PrivDynArrayInfo *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 ) +freeDynArrayDeep( PrivDynArrayInfo *info, FreeFnPtr freeFnPtr ) { forAllInDynArrayDo( info, freeFnPtr ); free( *(info->addrOfPtrToArray) ); @@ -122,7 +191,7 @@ /* Only frees the info */ void -freeDynArrayFlat( DynArrayInfo *info ) +freeDynArrayFlat( PrivDynArrayInfo *info ) { free( info ); } @@ -132,7 +201,7 @@ * So, the function has to internally cast void * to whatever data struc.. */ void -forAllInDynArrayDo( DynArrayInfo *info, DynArrayFnPtr fnPtr ) +forAllInDynArrayDo( PrivDynArrayInfo *info, DynArrayFnPtr fnPtr ) { int32 idx; void **array; diff -r f9776626259b -r 9de0a9369134 DynArray.h --- a/DynArray.h Thu Feb 09 15:44:39 2012 +0100 +++ b/DynArray.h Sat Feb 11 17:43:20 2012 -0800 @@ -8,8 +8,6 @@ #ifndef _DYNARRAY_H #define _DYNARRAY_H -#include "../../VMS_Implementations/VMS_impl/VMS_primitive_data_types.h" - //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 @@ -22,36 +20,42 @@ int32 numInArray; int32 sizeOfArray; } -DynArrayInfo; +PrivDynArrayInfo; -DynArrayInfo * -makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ); +PrivDynArrayInfo * +makePrivDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray ); -DynArrayInfo * -makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ); +PrivDynArrayInfo * +makePrivDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray ); + +PrivDynArrayInfo * +makePrivDynArrayOfSize_Ext( void ***addrOfPtrToArray, int32 sizeOfArray ); int32 -addToDynArray( void *value, DynArrayInfo *info ); +addToDynArray( void *value, PrivDynArrayInfo *info ); void -makeHighestDynArrayIndexBe( DynArrayInfo *info, int32 highestIndex ); +makeHighestDynArrayIndexBe( PrivDynArrayInfo *info, int32 highestIndex ); void -increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize ); +makeHighestDynArrayIndexBeAtLeast(PrivDynArrayInfo *info,int32 highestIndex); + +void +increaseSizeOfDynArrayTo( PrivDynArrayInfo *info, int32 newSize ); typedef void (*FreeFnPtr) ( void * ); //fn has to cast void * to whatever void -freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr ); +freeDynArrayDeep( PrivDynArrayInfo *info, FreeFnPtr freeFnPtr ); void -freeDynArrayFlat( DynArrayInfo *info ); +freeDynArrayFlat( PrivDynArrayInfo *info ); typedef void (*DynArrayFnPtr) ( void * ); //fn has to cast void * void -forAllInDynArrayDo( DynArrayInfo *info, DynArrayFnPtr fnPtr ); +forAllInDynArrayDo( PrivDynArrayInfo *info, DynArrayFnPtr fnPtr ); #endif /* _DYNARRAY_H */