diff DynArray.c @ 14:9de0a9369134

added eol handling and .brch__default to indicate brch (and reason for it)
author Me@portablequad
date Sat, 11 Feb 2012 17:43:20 -0800
parents 601709e9f2a4
children 62b3a4793b6e
line diff
     1.1 --- a/DynArray.c	Thu Feb 09 15:44:39 2012 +0100
     1.2 +++ b/DynArray.c	Sat Feb 11 17:43:20 2012 -0800
     1.3 @@ -7,31 +7,49 @@
     1.4  
     1.5  
     1.6  #include <stdio.h>
     1.7 -#include <malloc.h>
     1.8  
     1.9  #include "DynArray.h"
    1.10 +#include "../vmalloc.h"
    1.11  
    1.12 +//== declarations
    1.13 +void
    1.14 +increaseSizeOfDynArrayTo_Ext( PrivDynArrayInfo *info, int32 newSize );
    1.15 +//==
    1.16  
    1.17 +PrivDynArrayInfo *
    1.18 +makePrivDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray )
    1.19 + { PrivDynArrayInfo *info;
    1.20  
    1.21 -DynArrayInfo *
    1.22 -makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray )
    1.23 - { DynArrayInfo *info;
    1.24 -
    1.25 -   info = malloc( sizeof(DynArrayInfo) );
    1.26 +   info = malloc( sizeof(PrivDynArrayInfo) );
    1.27  
    1.28     info->addrOfPtrToArray = addrOfPtrToArray;
    1.29     info->sizeOfArray      = sizeOfArray;
    1.30     info->numInArray       = 0;
    1.31 +   return info;
    1.32   }
    1.33  
    1.34 -DynArrayInfo *
    1.35 -makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray )
    1.36 - { DynArrayInfo *info;
    1.37 +PrivDynArrayInfo *
    1.38 +makePrivDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray )
    1.39 + { PrivDynArrayInfo *info;
    1.40  
    1.41 -   info = malloc( sizeof(DynArrayInfo) );
    1.42 +   info = malloc( sizeof(PrivDynArrayInfo) );
    1.43  
    1.44     info->addrOfPtrToArray = addrOfPtrToArray;
    1.45 -   
    1.46 +
    1.47 +   *(addrOfPtrToArray)    = malloc( sizeOfArray * sizeof(void *) );
    1.48 +   info->sizeOfArray      = sizeOfArray;
    1.49 +   info->numInArray       = 0;
    1.50 +   return info;
    1.51 + }
    1.52 +
    1.53 +PrivDynArrayInfo *
    1.54 +makePrivDynArrayOfSize_Ext( void ***addrOfPtrToArray, int32 sizeOfArray )
    1.55 + { PrivDynArrayInfo *info;
    1.56 +
    1.57 +   info = malloc( sizeof(PrivDynArrayInfo) );
    1.58 +
    1.59 +   info->addrOfPtrToArray = addrOfPtrToArray;
    1.60 +
    1.61     *(addrOfPtrToArray)    = malloc( sizeOfArray * sizeof(void *) );
    1.62     info->sizeOfArray      = sizeOfArray;
    1.63     info->numInArray       = 0;
    1.64 @@ -47,10 +65,10 @@
    1.65   *Only need to use this Fn when need a new index, higher than any previous
    1.66   */
    1.67  int32
    1.68 -addToDynArray( void *value, DynArrayInfo *info )
    1.69 +addToDynArray( void *value, PrivDynArrayInfo *info )
    1.70   { int32 numInArray, sizeOfArray;
    1.71     void **array;
    1.72 - 
    1.73 +
    1.74     numInArray = info->numInArray;
    1.75     sizeOfArray    = info->sizeOfArray;
    1.76  
    1.77 @@ -58,7 +76,26 @@
    1.78      {
    1.79        increaseSizeOfDynArrayTo( info, sizeOfArray * 2 );
    1.80      }
    1.81 -   
    1.82 +
    1.83 +   array = *(info->addrOfPtrToArray);
    1.84 +   array[ numInArray ] = value;
    1.85 +   info->numInArray++;
    1.86 +
    1.87 +   return numInArray; //pre-incr value is the index put value into
    1.88 + }
    1.89 +int32
    1.90 +addToDynArray_Ext( void *value, PrivDynArrayInfo *info )
    1.91 + { int32 numInArray, sizeOfArray;
    1.92 +   void **array;
    1.93 +
    1.94 +   numInArray = info->numInArray;
    1.95 +   sizeOfArray    = info->sizeOfArray;
    1.96 +
    1.97 +   if( numInArray >= sizeOfArray )
    1.98 +    {
    1.99 +      increaseSizeOfDynArrayTo_Ext( info, sizeOfArray * 2 );
   1.100 +    }
   1.101 +
   1.102     array = *(info->addrOfPtrToArray);
   1.103     array[ numInArray ] = value;
   1.104     info->numInArray++;
   1.105 @@ -75,7 +112,7 @@
   1.106   * exponentially increase size..
   1.107   */
   1.108  void
   1.109 -makeHighestDynArrayIndexBe( DynArrayInfo *info, int32 highestIndex )
   1.110 +makeHighestDynArrayIndexBe( PrivDynArrayInfo *info, int32 highestIndex )
   1.111   {
   1.112     if( info->sizeOfArray <= highestIndex )
   1.113      {
   1.114 @@ -84,17 +121,24 @@
   1.115     info->numInArray = highestIndex + 1;
   1.116   }
   1.117  
   1.118 +void
   1.119 +makeHighestDynArrayIndexBeAtLeast(PrivDynArrayInfo *info, int32 index)
   1.120 + {
   1.121 +   if( index < info->numInArray ) return;
   1.122 +   else makeHighestDynArrayIndexBe( info, index );
   1.123 + }
   1.124 +
   1.125  
   1.126  /*Only use this if certain new size is bigger than current size
   1.127   */
   1.128  void
   1.129 -increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize )
   1.130 +increaseSizeOfDynArrayTo( PrivDynArrayInfo *info, int32 newSize )
   1.131   { int32 oldSizeOfArray, i;
   1.132     void **newArray, **oldArray;
   1.133 - 
   1.134 +
   1.135     oldSizeOfArray   = info->sizeOfArray;
   1.136     if( newSize <= oldSizeOfArray ) return;
   1.137 -   
   1.138 +
   1.139     oldArray         = *(info->addrOfPtrToArray);
   1.140     newArray         = malloc( newSize * sizeof(void *) );
   1.141  
   1.142 @@ -108,11 +152,36 @@
   1.143     free( oldArray );
   1.144   }
   1.145  
   1.146 +/*Can't mix malloc locations with external malloc locations -- so use
   1.147 + * this version inside VMS, which will perform normal malloc in the core
   1.148 + * loop -- hopefully avoiding the annoying system-stack bugs..
   1.149 + */
   1.150 +void
   1.151 +increaseSizeOfDynArrayTo_Ext( PrivDynArrayInfo *info, int32 newSize )
   1.152 + { int32 oldSizeOfArray, i;
   1.153 +   void **newArray, **oldArray;
   1.154 +
   1.155 +   oldSizeOfArray   = info->sizeOfArray;
   1.156 +   if( newSize <= oldSizeOfArray ) return;
   1.157 +
   1.158 +   oldArray         = *(info->addrOfPtrToArray);
   1.159 +   newArray         = malloc( newSize * sizeof(void *) );
   1.160 +
   1.161 +   for( i = 0; i < oldSizeOfArray; i++ )
   1.162 +    {
   1.163 +      newArray[i] = oldArray[i];
   1.164 +    }
   1.165 +   *(info->addrOfPtrToArray) = newArray; //change location of array-ptr
   1.166 +   info->sizeOfArray = newSize;
   1.167 +
   1.168 +   free( oldArray );
   1.169 + }
   1.170 +
   1.171  
   1.172  /* Frees the array, plus the info
   1.173   */
   1.174  void
   1.175 -freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr )
   1.176 +freeDynArrayDeep( PrivDynArrayInfo *info, FreeFnPtr freeFnPtr )
   1.177   {
   1.178     forAllInDynArrayDo( info, freeFnPtr );
   1.179     free( *(info->addrOfPtrToArray) );
   1.180 @@ -122,7 +191,7 @@
   1.181  /* Only frees the info
   1.182   */
   1.183  void
   1.184 -freeDynArrayFlat( DynArrayInfo *info )
   1.185 +freeDynArrayFlat( PrivDynArrayInfo *info )
   1.186   {
   1.187     free( info );
   1.188   }
   1.189 @@ -132,7 +201,7 @@
   1.190   * So, the function has to internally cast void * to whatever data struc..
   1.191   */
   1.192  void
   1.193 -forAllInDynArrayDo( DynArrayInfo *info, DynArrayFnPtr fnPtr )
   1.194 +forAllInDynArrayDo( PrivDynArrayInfo *info, DynArrayFnPtr fnPtr )
   1.195   { int32 idx;
   1.196     void **array;
   1.197