@@ -36,18 +36,19 @@ #endif #import "OFStream.h" #import "OFStream+Private.h" #import "OFString.h" -#import "OFDataArray.h" +#import "OFData.h" #import "OFSystemInfo.h" #import "OFRunLoop.h" #import "OFRunLoop+Private.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFNotImplementedException.h" +#import "OFOutOfMemoryException.h" #import "OFOutOfRangeException.h" #import "OFSetOptionFailedException.h" #import "OFTruncatedDataException.h" #import "of_asprintf.h" @@ -552,63 +553,67 @@ #endif return size; } -- (OFDataArray *)readDataArrayWithCount: (size_t)count -{ - return [self readDataArrayWithItemSize: 1 - count: count]; -} - -- (OFDataArray *)readDataArrayWithItemSize: (size_t)itemSize - count: (size_t)count -{ - OFDataArray *dataArray; - char *tmp; - - dataArray = [OFDataArray dataArrayWithItemSize: itemSize]; - tmp = [self allocMemoryWithSize: itemSize - count: count]; - - @try { - [self readIntoBuffer: tmp +- (OFData *)readDataWithCount: (size_t)count +{ + return [self readDataWithItemSize: 1 + count: count]; +} + +- (OFData *)readDataWithItemSize: (size_t)itemSize + count: (size_t)count +{ + OFData *ret; + char *buffer; + + if OF_UNLIKELY (count > SIZE_MAX / itemSize) + @throw [OFOutOfRangeException exception]; + + if OF_UNLIKELY ((buffer = malloc(count * itemSize)) == NULL) + @throw [OFOutOfMemoryException + exceptionWithRequestedSize: count * itemSize]; + + @try { + [self readIntoBuffer: buffer exactLength: count * itemSize]; - [dataArray addItems: tmp - count: count]; - } @finally { - [self freeMemory: tmp]; - } - - return dataArray; -} - -- (OFDataArray *)readDataArrayTillEndOfStream -{ - OFDataArray *dataArray; - size_t pageSize; - char *buffer; - - dataArray = [OFDataArray dataArray]; - pageSize = [OFSystemInfo pageSize]; - buffer = [self allocMemoryWithSize: pageSize]; + ret = [OFData dataWithItemsNoCopy: buffer + itemSize: itemSize + count: count + freeWhenDone: true]; + } @catch (id e) { + free(buffer); + @throw e; + } + + return ret; +} + +- (OFData *)readDataUntilEndOfStream +{ + OFMutableData *data = [OFMutableData data]; + size_t pageSize = [OFSystemInfo pageSize]; + char *buffer = [self allocMemoryWithSize: pageSize]; @try { while (![self isAtEndOfStream]) { size_t length; length = [self readIntoBuffer: buffer length: pageSize]; - [dataArray addItems: buffer - count: length]; + [data addItems: buffer + count: length]; } } @finally { [self freeMemory: buffer]; } - return dataArray; + [data makeImmutable]; + + return data; } - (OFString *)readStringWithLength: (size_t)length { return [self readStringWithLength: length @@ -1441,15 +1446,15 @@ #endif return size; } -- (size_t)writeDataArray: (OFDataArray *)dataArray +- (size_t)writeData: (OFData *)data { - size_t length = [dataArray count] * [dataArray itemSize]; + size_t length = [data count] * [data itemSize]; - [self writeBuffer: [dataArray items] + [self writeBuffer: [data items] length: length]; return length; }