// Wrapper for lseek or the like. streamoff _Filebuf_base::_M_seek(streamoff offset, ios_base::seekdir dir) { int whence; switch ( dir ) { case ios_base::beg: if (offset < 0 /* || offset > _M_file_size() */ ) return streamoff(-1); whence = SEEK_SET; break; case ios_base::cur: whence = SEEK_CUR; break; case ios_base::end: if (/* offset > 0 || */ -offset > _M_file_size() ) return streamoff(-1); whence = SEEK_END; break; default: return streamoff(-1); } if ( FSEEK(_M_file, offset, whence) == 0 ) { return FTELL(_M_file); } return streamoff(-1); }
// Wrapper for lseek or the like. streamoff _Filebuf_base::_M_seek(streamoff offset, ios_base::seekdir dir) { streamoff result = -1; int whence; switch(dir) { case ios_base::beg: if (offset < 0 /* || offset > _M_file_size() */ ) return streamoff(-1); whence = STL_SEEK_SET; break; case ios_base::cur: whence = STL_SEEK_CUR; break; case ios_base::end: if (/* offset > 0 || */ -offset > _M_file_size() ) return streamoff(-1); whence = STL_SEEK_END; break; default: return streamoff(-1); } #if defined (_STLP_USE_UNIX_IO) || defined (_STLP_USE_UNIX_EMULATION_IO) result = LSEEK(_M_file_id, offset, whence); #elif defined (_STLP_USE_STDIO_IO) result = fseek(_M_file, offset, whence); #elif defined (_STLP_USE_WIN32_IO) LARGE_INTEGER li; li.QuadPart = offset; li.LowPart = SetFilePointer(_M_file_id, li.LowPart, &li.HighPart, whence); if (li.LowPart == 0xFFFFFFFF && GetLastError() != NO_ERROR) result = -1; // Error else result = li.QuadPart; #else # error "Port!" #endif return result; }