14c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include <android/utils/vector.h> 24c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include <limits.h> 34c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 44c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerextern void 54c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner_avector_ensure( void** items, size_t itemSize, unsigned* pMaxItems, unsigned newCount ) 64c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{ 74c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner unsigned oldMax = *pMaxItems; 84c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 94c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (newCount > oldMax) { 104c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner unsigned newMax = oldMax; 114c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner unsigned bigMax = UINT_MAX / itemSize; 124c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 134c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (itemSize == 0) { 144c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AASSERT_FAIL("trying to reallocate array of 0-size items (count=%d)\n", newCount); 154c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } 164c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 174c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (newCount > bigMax) { 184c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AASSERT_FAIL("trying to reallocate over-sized array of %d-bytes items (%d > %d)\n", 194c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner itemSize, newCount, bigMax); 204c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } 214c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 224c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner while (newMax < newCount) { 234c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner unsigned newMax2 = newMax + (newMax >> 1) + 4; 244c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (newMax2 < newMax || newMax2 > bigMax) 254c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner newMax2 = bigMax; 264c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner newMax = newMax2; 274c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } 284c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 294c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner *items = _android_array_realloc( *items, itemSize, newMax ); 304c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner *pMaxItems = newMax; 314c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } 324c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} 334c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 34