@@ -9,15 +9,18 @@ * the packaging of this file. */ #import #import +#import #import "OFArray.h" #import "OFExceptions.h" #import "OFMacros.h" + +static size_t pagesize = 0; @implementation OFArray + newWithItemSize: (size_t)is { return [[OFArray alloc] initWithItemSize: is]; @@ -62,10 +65,13 @@ return data + (items - 1) * itemsize; } - add: (void*)item { + if (SIZE_MAX - items < 1) + [[OFOutOfRangeException newWithObject: self] raise]; + data = [self resizeMem: data toNItems: items + 1 ofSize: itemsize]; memcpy(data + items++ * itemsize, item, itemsize); @@ -110,24 +116,54 @@ return [[OFBigArray alloc] initWithItemSize: is]; } - initWithItemSize: (size_t)is { - if ((self = [super init])) + if (pagesize == 0) + pagesize = getpagesize(); + + if ((self = [super initWithItemSize: is])) size = 0; return self; } - addNItems: (size_t)nitems fromCArray: (void*)carray { - /* FIXME */ - OF_NOT_IMPLEMENTED(self) + size_t nsize; + + if (nitems > SIZE_MAX - items || items + nitems > SIZE_MAX / itemsize) + [[OFOutOfRangeException newWithObject: self] raise]; + + nsize = (((items + nitems) * itemsize) / pagesize) + 1; + + if (size != nsize) + data = [self resizeMem: data + toSize: nsize]; + + memcpy(data + items * itemsize, carray, nitems * itemsize); + items += nitems; + size = nsize; + + return self; } - removeNItems: (size_t)nitems { - /* FIXME */ - OF_NOT_IMPLEMENTED(self) + size_t nsize; + + if (nitems > items) + [[OFOutOfRangeException newWithObject: self] raise]; + + nsize = (((items - nitems) * itemsize) / pagesize) + 1; + + if (size != nsize) + data = [self resizeMem: data + toSize: nsize]; + + items -= nitems; + size = nsize; + + return self; } @end