annotate DynArray.c @ 22:ffdffedd579e

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