@@ -50,17 +50,55 @@ return self; } - (BOOL)atEndOfStream { + if (cache != NULL) + return NO; + + return [self atEndOfStreamWithoutCache]; +} + +- (BOOL)atEndOfStreamWithoutCache +{ @throw [OFNotImplementedException newWithClass: isa selector: _cmd]; } - (size_t)readNBytes: (size_t)size intoBuffer: (char*)buf { + if (cache == NULL) + return [self readNBytesWithoutCache: size + intoBuffer: buf]; + + if (size >= cache_len) { + size_t ret = cache_len; + memcpy(buf, cache, cache_len); + + [self freeMemory: cache]; + cache = NULL; + cache_len = 0; + + return ret; + } else { + char *tmp = [self allocMemoryWithSize: cache_len - size]; + memcpy(tmp, cache + size, cache_len - size); + + memcpy(buf, cache, size); + + [self freeMemory: cache]; + cache = tmp; + cache_len -= size; + + return size; + } +} + +- (size_t)readNBytesWithoutCache: (size_t)size + intoBuffer: (char*)buf +{ @throw [OFNotImplementedException newWithClass: isa selector: _cmd]; } - (OFString*)readLine @@ -98,11 +136,11 @@ /* Read until we get a newline or \0 */ tmp = [self allocMemoryWithSize: pagesize]; for (;;) { - if ([self atEndOfStream]) { + if ([self atEndOfStreamWithoutCache]) { [self freeMemory: tmp]; if (cache == NULL) return nil; @@ -116,12 +154,12 @@ return ret; } @try { - len = [self readNBytes: pagesize - 1 - intoBuffer: tmp]; + len = [self readNBytesWithoutCache: pagesize + intoBuffer: tmp]; } @catch (OFException *e) { [self freeMemory: tmp]; @throw e; } @@ -205,29 +243,11 @@ { return [self writeNBytes: [str cStringLength] fromBuffer: [str cString]]; } -- (size_t)getCache: (char**)ptr -{ - if (ptr != NULL) - *ptr = cache; - - return cache_len; -} - -- clearCache -{ - [self freeMemory: cache]; - - cache = NULL; - cache_len = 0; - - return self; -} - - close { @throw [OFNotImplementedException newWithClass: isa selector: _cmd]; } @end