@@ -36,37 +36,44 @@ { @throw [OFNotImplementedException newWithClass: isa andSelector: _cmd]; } -- (char*)readLine +- (OFString*)readLine { size_t i, len; - char *ret, *tmp, *tmp2; + char *ret_c, *tmp, *tmp2; + OFString *ret; /* Look if there's a line or \0 in our cache */ if (cache != NULL) { for (i = 0; i < cache_len; i++) { if (OF_UNLIKELY(cache[i] == '\n' || cache[i] == '\0')) { - ret = [self allocWithSize: i + 1]; - memcpy(ret, cache, i); - ret[i] = '\0'; + ret_c = [self allocWithSize: i + 1]; + memcpy(ret_c, cache, i); + ret_c[i] = '\0'; @try { tmp = [self allocWithSize: cache_len - i - 1]; } @catch (OFException *e) { - [self freeMem: ret]; + [self freeMem: ret_c]; @throw e; } memcpy(tmp, cache + i + 1, cache_len - i - 1); [self freeMem: cache]; cache = tmp; cache_len = cache_len - i - 1; + @try { + ret = [OFString + stringWithCString: ret_c]; + } @finally { + [self freeMem: ret_c]; + } return ret; } } } @@ -84,27 +91,27 @@ /* Look if there's a newline or \0 */ for (i = 0; i < len; i++) { if (OF_UNLIKELY(tmp[i] == '\n' || tmp[i] == '\0')) { @try { - ret = [self + ret_c = [self allocWithSize: cache_len + i + 1]; } @catch (OFException *e) { [self freeMem: tmp]; @throw e; } if (cache != NULL) - memcpy(ret, cache, cache_len); - memcpy(ret + cache_len, tmp, i); - ret[i] = '\0'; + memcpy(ret_c, cache, cache_len); + memcpy(ret_c + cache_len, tmp, i); + ret_c[i] = '\0'; if (i < len) { @try { tmp2 = [self allocWithSize: len - i - 1]; } @catch (OFException *e) { - [self freeMem: ret]; + [self freeMem: ret_c]; [self freeMem: tmp]; @throw e; } memcpy(tmp2, tmp + i + 1, len - i - 1); @@ -118,10 +125,16 @@ cache = NULL; cache_len = 0; } [self freeMem: tmp]; + @try { + ret = [OFString + stringWithCString: ret_c]; + } @finally { + [self freeMem: ret_c]; + } return ret; } } /* There was no newline or \0 */ @@ -142,14 +155,14 @@ { @throw [OFNotImplementedException newWithClass: isa andSelector: _cmd]; } -- (size_t)writeCString: (const char*)str +- (size_t)writeString: (OFString*)str { - return [self writeNBytes: strlen(str) - fromBuffer: str]; + return [self writeNBytes: [str length] + fromBuffer: [str cString]]; } - (size_t)getCache: (char**)ptr { if (ptr != NULL)