bool PlainFile::seek(int64_t offset, int whence /* = SEEK_SET */) { assert(valid()); if (whence == SEEK_CUR) { off_t result = lseek(getFd(), 0, SEEK_CUR); if (result != (off_t)-1) { offset += result - (bufferedLen() + getPosition()); } if (offset > 0 && offset < bufferedLen()) { setReadPosition(getReadPosition() + offset); setPosition(getPosition() + offset); return true; } offset += getPosition(); whence = SEEK_SET; } // invalidate the current buffer setWritePosition(0); setReadPosition(0); // clear the eof flag setEof(false); flush(); // lseek instead of seek to be consistent with read off_t result = lseek(getFd(), offset, whence); setPosition(result); return result != (off_t)-1; }
bool ZipFile::seek(int64_t offset, int whence /* = SEEK_SET */) { assert(m_gzFile); if (whence == SEEK_CUR) { off_t result = gzseek(m_gzFile, 0, SEEK_CUR); if (result != (off_t)-1) { offset += result - (bufferedLen() + getPosition()); } if (offset > 0 && offset < bufferedLen()) { setReadPosition(getReadPosition() + offset); setPosition(getPosition() + offset); return true; } offset += getPosition(); whence = SEEK_SET; } // invalidate the current buffer setWritePosition(0); setReadPosition(0); setEof(false); flush(); off_t result = gzseek(m_gzFile, offset, whence); setPosition(result); return result != (off_t)-1; }
bool PlainFile::rewind() { assert(valid()); seek(0); setWritePosition(0); setReadPosition(0); setPosition(0); return true; }
bool MemFile::rewind() { assertx(m_len != -1); m_cursor = 0; setWritePosition(0); setReadPosition(0); setPosition(0); return true; }
bool UserFile::seek(int64_t offset, int whence /* = SEEK_SET */) { assert(seekable()); // Seek within m_buffer if we can, otherwise kill it and call user stream_seek / stream_tell if (whence == SEEK_CUR && 0 <= getReadPosition() + offset && getReadPosition() + offset < getWritePosition()) { setReadPosition(getReadPosition() + offset); setPosition(getPosition() + offset); return true; } else if (whence == SEEK_SET && 0 <= offset - getPosition() + getReadPosition() && offset - getPosition() + getReadPosition() < getWritePosition()) { setReadPosition(offset - getPosition() + getReadPosition()); setPosition(offset); return true; } else { if (whence == SEEK_CUR) { offset += getReadPosition() - getWritePosition(); } setReadPosition(0); setWritePosition(0); } // bool stream_seek($offset, $whence) bool invoked = false; bool sought = invoke( m_StreamSeek, s_stream_seek, make_packed_array(offset, whence), invoked ).toBoolean(); if (!invoked) { always_assert("No seek method? But I found one earlier?"); } if (!sought) { return false; } // int stream_tell() Variant ret = invoke(m_StreamTell, s_stream_tell, Array::Create(), invoked); if (!invoked) { raise_warning("%s::stream_tell is not implemented!", m_cls->name()->data()); return false; } setPosition(ret.isInteger() ? ret.toInt64() : -1); return true; }
bool ZipFile::rewind() { assert(m_gzFile); seek(0); setWritePosition(0); setReadPosition(0); setPosition(0); setEof(false); gzrewind(m_gzFile); return true; }
bool MemFile::seek(int64_t offset, int whence /* = SEEK_SET */) { assertx(m_len != -1); if (whence == SEEK_CUR) { if (offset > 0 && offset < bufferedLen()) { setReadPosition(getReadPosition() + offset); setPosition(getPosition() + offset); return true; } offset += getPosition(); whence = SEEK_SET; } // invalidate the current buffer setWritePosition(0); setReadPosition(0); if (whence == SEEK_SET) { m_cursor = offset; } else { assertx(whence == SEEK_END); m_cursor = m_len + offset; } setPosition(m_cursor); return true; }