Index: src/OFHTTPClient.m ================================================================== --- src/OFHTTPClient.m +++ src/OFHTTPClient.m @@ -165,13 +165,14 @@ - (int)fileDescriptorForReading { return [_socket fileDescriptorForReading]; } -- (size_t)pendingBytes +- (size_t)numberOfBytesInReadBuffer { - return [super pendingBytes] + [_socket pendingBytes]; + return [super numberOfBytesInReadBuffer] + + [_socket numberOfBytesInReadBuffer]; } - (void)close { [_socket close]; Index: src/OFSeekableStream.m ================================================================== --- src/OFSeekableStream.m +++ src/OFSeekableStream.m @@ -32,10 +32,10 @@ whence: (int)whence { [self lowlevelSeekToOffset: offset whence: whence]; - [self freeMemory: _cache]; - _cache = NULL; - _cacheLength = 0; + [self freeMemory: _readBuffer]; + _readBuffer = NULL; + _readBufferLength = 0; } @end Index: src/OFStream.h ================================================================== --- src/OFStream.h +++ src/OFStream.h @@ -55,15 +55,13 @@ * override these methods without the lowlevel prefix, you *will* break * caching and get broken results! */ @interface OFStream: OFObject { - char *_cache; - char *_writeBuffer; - size_t _cacheLength, _writeBufferLength; - BOOL _writeBufferEnabled; - BOOL _blocking, _waitingForDelimiter; + char *_readBuffer, *_writeBuffer; + size_t _readBufferLength, _writeBufferLength; + BOOL _writeBufferEnabled, _blocking, _waitingForDelimiter; } #ifdef OF_HAVE_PROPERTIES @property (getter=isWriteBufferEnabled) BOOL writeBufferEnabled; @property (getter=isBlocking) BOOL blocking; @@ -982,15 +980,15 @@ */ - (size_t)writeFormat: (OFConstantString*)format arguments: (va_list)arguments; /*! - * @brief Returns the number of bytes still present in the internal read cache. + * @brief Returns the number of bytes still present in the internal read buffer. * - * @return The number of bytes still present in the internal read cache. + * @return The number of bytes still present in the internal read buffer. */ -- (size_t)pendingBytes; +- (size_t)numberOfBytesInReadBuffer; /*! * @brief Returns whether the stream is in blocking mode. * * @return Whether the stream is in blocking mode Index: src/OFStream.m ================================================================== --- src/OFStream.m +++ src/OFStream.m @@ -98,41 +98,43 @@ return [self retain]; } - (BOOL)isAtEndOfStream { - if (_cacheLength > 0) + if (_readBufferLength > 0) return NO; return [self lowlevelIsAtEndOfStream]; } - (size_t)readIntoBuffer: (void*)buffer length: (size_t)length { - if (_cacheLength == 0) + if (_readBufferLength == 0) return [self lowlevelReadIntoBuffer: buffer length: length]; - if (length >= _cacheLength) { - size_t ret = _cacheLength; - memcpy(buffer, _cache, _cacheLength); + if (length >= _readBufferLength) { + size_t ret = _readBufferLength; + memcpy(buffer, _readBuffer, _readBufferLength); - [self freeMemory: _cache]; - _cache = NULL; - _cacheLength = 0; + [self freeMemory: _readBuffer]; + _readBuffer = NULL; + _readBufferLength = 0; return ret; } else { - char *tmp = [self allocMemoryWithSize: _cacheLength - length]; - memcpy(tmp, _cache + length, _cacheLength - length); - - memcpy(buffer, _cache, length); - - [self freeMemory: _cache]; - _cache = tmp; - _cacheLength -= length; + char *tmp; + + tmp = [self allocMemoryWithSize: _readBufferLength - length]; + memcpy(tmp, _readBuffer + length, _readBufferLength - length); + + memcpy(buffer, _readBuffer, length); + + [self freeMemory: _readBuffer]; + _readBuffer = tmp; + _readBufferLength -= length; return length; } } @@ -564,36 +566,36 @@ } - (OFString*)tryReadLineWithEncoding: (of_string_encoding_t)encoding { size_t i, pageSize, bufferLength, retLength; - char *retCString, *buffer, *newCache; + char *retCString, *buffer, *readBuffer; OFString *ret; - /* Look if there's a line or \0 in our cache */ - if (!_waitingForDelimiter && _cache != NULL) { - for (i = 0; i < _cacheLength; i++) { - if OF_UNLIKELY (_cache[i] == '\n' || - _cache[i] == '\0') { + /* Look if there's a line or \0 in our buffer */ + if (!_waitingForDelimiter && _readBuffer != NULL) { + for (i = 0; i < _readBufferLength; i++) { + if OF_UNLIKELY (_readBuffer[i] == '\n' || + _readBuffer[i] == '\0') { retLength = i; - if (i > 0 && _cache[i - 1] == '\r') + if (i > 0 && _readBuffer[i - 1] == '\r') retLength--; - ret = [OFString stringWithCString: _cache + ret = [OFString stringWithCString: _readBuffer encoding: encoding length: retLength]; - newCache = [self - allocMemoryWithSize: _cacheLength - i - 1]; - if (newCache != NULL) - memcpy(newCache, _cache + i + 1, - _cacheLength - i - 1); - - [self freeMemory: _cache]; - _cache = newCache; - _cacheLength -= i + 1; + readBuffer = [self allocMemoryWithSize: + _readBufferLength - i - 1]; + if (readBuffer != NULL) + memcpy(readBuffer, _readBuffer + i + 1, + _readBufferLength - i - 1); + + [self freeMemory: _readBuffer]; + _readBuffer = readBuffer; + _readBufferLength -= i + 1; _waitingForDelimiter = NO; return ret; } } @@ -603,27 +605,27 @@ pageSize = [OFSystemInfo pageSize]; buffer = [self allocMemoryWithSize: pageSize]; @try { if ([self lowlevelIsAtEndOfStream]) { - if (_cache == NULL) { + if (_readBuffer == NULL) { _waitingForDelimiter = NO; return nil; } - retLength = _cacheLength; + retLength = _readBufferLength; - if (retLength > 0 && _cache[retLength - 1] == '\r') + if (retLength > 0 && _readBuffer[retLength - 1] == '\r') retLength--; - ret = [OFString stringWithCString: _cache + ret = [OFString stringWithCString: _readBuffer encoding: encoding length: retLength]; - [self freeMemory: _cache]; - _cache = NULL; - _cacheLength = 0; + [self freeMemory: _readBuffer]; + _readBuffer = NULL; + _readBufferLength = 0; _waitingForDelimiter = NO; return ret; } @@ -632,18 +634,19 @@ /* Look if there's a newline or \0 */ for (i = 0; i < bufferLength; i++) { if OF_UNLIKELY (buffer[i] == '\n' || buffer[i] == '\0') { - retLength = _cacheLength + i; + retLength = _readBufferLength + i; retCString = [self allocMemoryWithSize: retLength]; - if (_cache != NULL) - memcpy(retCString, _cache, - _cacheLength); - memcpy(retCString + _cacheLength, buffer, i); + if (_readBuffer != NULL) + memcpy(retCString, _readBuffer, + _readBufferLength); + memcpy(retCString + _readBufferLength, + buffer, i); if (retLength > 0 && retCString[retLength - 1] == '\r') retLength--; @@ -655,56 +658,59 @@ stringWithCString: rcs encoding: encoding length: rl]; } @catch (id e) { /* - * Append data to cache to prevent loss - * of data due to wrong encoding. + * Append data to readBuffer to prevent + * loss of data due to wrong encoding. */ - _cache = [self - resizeMemory: _cache - size: _cacheLength + + _readBuffer = [self + resizeMemory: _readBuffer + size: _readBufferLength + bufferLength]; - if (_cache != NULL) - memcpy(_cache + _cacheLength, + if (_readBuffer != NULL) + memcpy(_readBuffer + + _readBufferLength, buffer, bufferLength); - _cacheLength += bufferLength; + _readBufferLength += bufferLength; @throw e; } @finally { [self freeMemory: retCString]; } - newCache = [self allocMemoryWithSize: - bufferLength - i - 1]; - if (newCache != NULL) - memcpy(newCache, buffer + i + 1, + readBuffer = [self + allocMemoryWithSize: bufferLength - i - 1]; + if (readBuffer != NULL) + memcpy(readBuffer, buffer + i + 1, bufferLength - i - 1); - [self freeMemory: _cache]; - _cache = newCache; - _cacheLength = bufferLength - i - 1; + [self freeMemory: _readBuffer]; + _readBuffer = readBuffer; + _readBufferLength = bufferLength - i - 1; _waitingForDelimiter = NO; return ret; } } /* There was no newline or \0 */ - _cache = [self resizeMemory: _cache - size: _cacheLength + bufferLength]; + _readBuffer = [self resizeMemory: _readBuffer + size: _readBufferLength + + bufferLength]; /* - * It's possible that _cacheLength + bufferLength is 0 and thus - * _cache was set to NULL by resizeMemory:size:. + * It's possible that _readBufferLength + bufferLength is 0 and + * thus _readBuffer was set to NULL by resizeMemory:size:. */ - if (_cache != NULL) - memcpy(_cache + _cacheLength, buffer, bufferLength); + if (_readBuffer != NULL) + memcpy(_readBuffer + _readBufferLength, + buffer, bufferLength); - _cacheLength += bufferLength; + _readBufferLength += bufferLength; } @finally { [self freeMemory: buffer]; } _waitingForDelimiter = YES; @@ -769,11 +775,11 @@ - (OFString*)tryReadTillDelimiter: (OFString*)delimiter encoding: (of_string_encoding_t)encoding { const char *delimiterCString; size_t i, j, delimiterLength, pageSize, bufferLength, retLength; - char *retCString, *buffer, *newCache; + char *retCString, *buffer, *readBuffer; OFString *ret; delimiterCString = [delimiter cStringWithEncoding: encoding]; delimiterLength = [delimiter cStringLengthWithEncoding: encoding]; j = 0; @@ -781,34 +787,34 @@ if (delimiterLength == 0) @throw [OFInvalidArgumentException exceptionWithClass: [self class] selector: _cmd]; - /* Look if there's something in our cache */ - if (!_waitingForDelimiter && _cache != NULL) { - for (i = 0; i < _cacheLength; i++) { - if (_cache[i] != delimiterCString[j++]) + /* Look if there's something in our buffer */ + if (!_waitingForDelimiter && _readBuffer != NULL) { + for (i = 0; i < _readBufferLength; i++) { + if (_readBuffer[i] != delimiterCString[j++]) j = 0; - if (j == delimiterLength || _cache[i] == '\0') { - if (_cache[i] == '\0') + if (j == delimiterLength || _readBuffer[i] == '\0') { + if (_readBuffer[i] == '\0') delimiterLength = 1; ret = [OFString - stringWithCString: _cache + stringWithCString: _readBuffer encoding: encoding length: i + 1 - delimiterLength]; - newCache = [self allocMemoryWithSize: - _cacheLength - i - 1]; - if (newCache != NULL) - memcpy(newCache, _cache + i + 1, - _cacheLength - i - 1); - - [self freeMemory: _cache]; - _cache = newCache; - _cacheLength -= i + 1; + readBuffer = [self allocMemoryWithSize: + _readBufferLength - i - 1]; + if (readBuffer != NULL) + memcpy(readBuffer, _readBuffer + i + 1, + _readBufferLength - i - 1); + + [self freeMemory: _readBuffer]; + _readBuffer = readBuffer; + _readBufferLength -= i + 1; _waitingForDelimiter = NO; return ret; } } @@ -818,22 +824,22 @@ pageSize = [OFSystemInfo pageSize]; buffer = [self allocMemoryWithSize: pageSize]; @try { if ([self lowlevelIsAtEndOfStream]) { - if (_cache == NULL) { + if (_readBuffer == NULL) { _waitingForDelimiter = NO; return nil; } - ret = [OFString stringWithCString: _cache + ret = [OFString stringWithCString: _readBuffer encoding: encoding - length: _cacheLength]; + length: _readBufferLength]; - [self freeMemory: _cache]; - _cache = NULL; - _cacheLength = 0; + [self freeMemory: _readBuffer]; + _readBuffer = NULL; + _readBufferLength = 0; _waitingForDelimiter = NO; return ret; } @@ -847,22 +853,24 @@ if (j == delimiterLength || buffer[i] == '\0') { if (buffer[i] == '\0') delimiterLength = 1; - retLength = _cacheLength + i + 1 - + retLength = _readBufferLength + i + 1 - delimiterLength; retCString = [self allocMemoryWithSize: retLength]; - if (_cache != NULL && _cacheLength <= retLength) - memcpy(retCString, _cache, - _cacheLength); - else if (_cache != NULL) - memcpy(retCString, _cache, retLength); + if (_readBuffer != NULL && + _readBufferLength <= retLength) + memcpy(retCString, _readBuffer, + _readBufferLength); + else if (_readBuffer != NULL) + memcpy(retCString, _readBuffer, + retLength); if (i >= delimiterLength) - memcpy(retCString + _cacheLength, + memcpy(retCString + _readBufferLength, buffer, i + 1 - delimiterLength); @try { char *rcs = retCString; size_t rl = retLength; @@ -873,37 +881,39 @@ length: rl]; } @finally { [self freeMemory: retCString]; } - newCache = [self allocMemoryWithSize: + readBuffer = [self allocMemoryWithSize: bufferLength - i - 1]; - if (newCache != NULL) - memcpy(newCache, buffer + i + 1, + if (readBuffer != NULL) + memcpy(readBuffer, buffer + i + 1, bufferLength - i - 1); - [self freeMemory: _cache]; - _cache = newCache; - _cacheLength = bufferLength - i - 1; + [self freeMemory: _readBuffer]; + _readBuffer = readBuffer; + _readBufferLength = bufferLength - i - 1; _waitingForDelimiter = NO; return ret; } } /* Neither the delimiter nor \0 was found */ - _cache = [self resizeMemory: _cache - size: _cacheLength + bufferLength]; + _readBuffer = [self resizeMemory: _readBuffer + size: _readBufferLength + + bufferLength]; /* - * It's possible that _cacheLength + bufferLength is 0 and thus - * _cache was set to NULL by resizeMemory:size:. + * It's possible that _readBufferLength + bufferLength is 0 and + * thus _readBuffer was set to NULL by resizeMemory:size:. */ - if (_cache != NULL) - memcpy(_cache + _cacheLength, buffer, bufferLength); + if (_readBuffer != NULL) + memcpy(_readBuffer + _readBufferLength, + buffer, bufferLength); - _cacheLength += bufferLength; + _readBufferLength += bufferLength; } @finally { [self freeMemory: buffer]; } _waitingForDelimiter = YES; @@ -1452,13 +1462,13 @@ } return length; } -- (size_t)pendingBytes +- (size_t)numberOfBytesInReadBuffer { - return _cacheLength; + return _readBufferLength; } - (BOOL)isBlocking { return _blocking; Index: src/OFStreamObserver.m ================================================================== --- src/OFStreamObserver.m +++ src/OFStreamObserver.m @@ -394,11 +394,11 @@ OFStream **objects = [_readStreams objects]; size_t i, count = [_readStreams count]; BOOL foundInCache = NO; for (i = 0; i < count; i++) { - if ([objects[i] pendingBytes] > 0 && + if ([objects[i] numberOfBytesInReadBuffer] > 0 && ![objects[i] OF_isWaitingForDelimiter]) { void *pool = objc_autoreleasePoolPush(); if ([_delegate respondsToSelector: @selector(streamIsReadyForReading:)])