@@ -43,10 +43,16 @@ } #endif return self; } + +- (BOOL)atEndOfStream +{ + @throw [OFNotImplementedException newWithClass: isa + andSelector: _cmd]; +} - (size_t)readNBytes: (size_t)size intoBuffer: (char*)buf { @throw [OFNotImplementedException newWithClass: isa @@ -95,10 +101,33 @@ /* Read until we get a newline or \0 */ tmp = [self allocMemoryWithSize: pagesize]; for (;;) { + if ([self atEndOfStream]) { + [self freeMemory: tmp]; + + if (cache == NULL) + return nil; + + ret_c = [self allocMemoryWithSize: cache_len + 1]; + memcpy(ret_c, cache, cache_len); + ret_c[cache_len] = '\0'; + + @try { + ret = [OFString stringWithCString: ret_c]; + } @finally { + [self freeMemory: ret_c]; + } + + [self freeMemory: cache]; + cache = NULL; + cache_len = 0; + + return ret; + } + @try { len = [self readNBytes: pagesize - 1 intoBuffer: tmp]; } @catch (OFException *e) { [self freeMemory: tmp]; @@ -117,11 +146,11 @@ @throw e; } if (cache != NULL) memcpy(ret_c, cache, cache_len); memcpy(ret_c + cache_len, tmp, i); - ret_c[i] = '\0'; + ret_c[cache_len + i] = '\0'; if (i < len) { @try { tmp2 = [self allocMemoryWithSize: len - @@ -141,12 +170,12 @@ if (cache != NULL) [self freeMemory: cache]; cache = NULL; cache_len = 0; } - [self freeMemory: tmp]; + @try { ret = [OFString stringWithCString: ret_c]; } @finally { [self freeMemory: ret_c];