@@ -11,23 +11,16 @@ #include "config.h" #include #include -#include #include #import "OFDataArray.h" #import "OFExceptions.h" #import "macros.h" -#ifdef _WIN32 -#include -#endif - -static int lastpagebyte = 0; - @implementation OFDataArray + dataArrayWithItemSize: (size_t)is { return [[[self alloc] initWithItemSize: is] autorelease]; } @@ -267,36 +260,18 @@ return hash; } @end @implementation OFBigDataArray -- initWithItemSize: (size_t)is -{ - self = [super initWithItemSize: is]; - - if (lastpagebyte == 0) { -#ifndef _WIN32 - if ((lastpagebyte = sysconf(_SC_PAGESIZE)) == -1) - lastpagebyte = 4096; - lastpagebyte--; -#else - SYSTEM_INFO si; - GetSystemInfo(&si); - lastpagebyte = si.dwPageSize - 1; -#endif - } - - return self; -} - - addItem: (void*)item { - size_t nsize; + size_t nsize, lastpagebyte; if (SIZE_MAX - count < 1 || count + 1 > SIZE_MAX / itemsize) @throw [OFOutOfRangeException newWithClass: isa]; + lastpagebyte = of_pagesize - 1; nsize = ((count + 1) * itemsize + lastpagebyte) & ~lastpagebyte; if (size != nsize) data = [self resizeMemory: data toSize: nsize]; @@ -310,15 +285,16 @@ } - addNItems: (size_t)nitems fromCArray: (void*)carray { - size_t nsize; + size_t nsize, lastpagebyte; if (nitems > SIZE_MAX - count || count + nitems > SIZE_MAX / itemsize) @throw [OFOutOfRangeException newWithClass: isa]; + lastpagebyte = of_pagesize - 1; nsize = ((count + nitems) * itemsize + lastpagebyte) & ~lastpagebyte; if (size != nsize) data = [self resizeMemory: data toSize: nsize]; @@ -333,15 +309,16 @@ - addNItems: (size_t)nitems fromCArray: (void*)carray atIndex: (size_t)index { - size_t nsize; + size_t nsize, lastpagebyte; if (nitems > SIZE_MAX - count || count + nitems > SIZE_MAX / itemsize) @throw [OFOutOfRangeException newWithClass: isa]; + lastpagebyte = of_pagesize - 1; nsize = ((count + nitems) * itemsize + lastpagebyte) & ~lastpagebyte; if (size != nsize) data = [self resizeMemory: data toNItems: nsize @@ -357,16 +334,17 @@ return self; } - removeNItems: (size_t)nitems { - size_t nsize; + size_t nsize, lastpagebyte; if (nitems > count) @throw [OFOutOfRangeException newWithClass: isa]; count -= nitems; + lastpagebyte = of_pagesize - 1; nsize = (count * itemsize + lastpagebyte) & ~lastpagebyte; if (size != nsize) data = [self resizeMemory: data toSize: nsize]; @@ -376,19 +354,20 @@ } - removeNItems: (size_t)nitems atIndex: (size_t)index { - size_t nsize; + size_t nsize, lastpagebyte; if (nitems > count) @throw [OFOutOfRangeException newWithClass: isa]; memmove(data + index * itemsize, data + (index + nitems) * itemsize, (count - index - nitems) * itemsize); count -= nitems; + lastpagebyte = of_pagesize - 1; nsize = (count * itemsize + lastpagebyte) & ~lastpagebyte; if (size != nsize) data = [self resizeMemory: data toSize: nsize];