diff options
-rw-r--r-- | source/cl_demo.c | 14 | ||||
-rw-r--r-- | source/files.c | 57 | ||||
-rw-r--r-- | source/ui_menu.c | 8 |
3 files changed, 35 insertions, 44 deletions
diff --git a/source/cl_demo.c b/source/cl_demo.c index 921f0e4..07dcabe 100644 --- a/source/cl_demo.c +++ b/source/cl_demo.c @@ -404,7 +404,7 @@ static void CL_ParseNextDemoMessage( void ) { CL_ParseServerMessage(); if( cls.demofileSize ) { - pos = FS_Tell( cls.demoplayback ) - cls.demofileFrameOffset; + pos = FS_RawTell( cls.demoplayback ) - cls.demofileFrameOffset; if( pos < 0 ) { pos = 0; } @@ -444,8 +444,7 @@ static void CL_PlayDemo_f( void ) { if( !demofile ) { ext = COM_FileExtension( arg ); if( strcmp( ext, ".dm2" ) ) { - length=Com_sprintf( name, sizeof( name ), "demos/%s.dm2", arg ); - Com_Printf( "%d\n",length); + Com_sprintf( name, sizeof( name ), "demos/%s.dm2", arg ); FS_FOpenFile( name, &demofile, FS_MODE_READ ); } } @@ -478,8 +477,13 @@ static void CL_PlayDemo_f( void ) { } while( cls.state == ca_connected ); length = FS_GetFileLengthNoCache( demofile ); - cls.demofileFrameOffset = FS_Tell( demofile ); - cls.demofileSize = length - cls.demofileFrameOffset; + if( length > 0 ) { + cls.demofileFrameOffset = FS_Tell( demofile ); + cls.demofileSize = length - cls.demofileFrameOffset; + } else { + cls.demofileFrameOffset = 0; + cls.demofileSize = 0; + } if( com_timedemo->integer ) { cls.timeDemoFrames = 0; diff --git a/source/files.c b/source/files.c index b2c9a4e..626ce8b 100644 --- a/source/files.c +++ b/source/files.c @@ -291,45 +291,33 @@ static char *FS_ConvertToSysPath( char *path ) { ================ FS_GetFileLength -Gets current file length. -For GZIP files, returns uncompressed length -(very slow operation because it has to uncompress the whole file). +Returns current length for files opened for writing. +Returns cached length for files opened for reading. +Returns compressed length for GZIP files. ================ */ int FS_GetFileLength( fileHandle_t f ) { fsFile_t *file = FS_FileForHandle( f ); int pos, length; - if( ( file->mode & FS_MODE_MASK ) == FS_MODE_READ ) { #ifdef USE_ZLIB - if( file->type == FS_GZIP ) { - goto gzipHack; - } + if( file->type == FS_GZIP ) { + return -1; + } #endif + + if( ( file->mode & FS_MODE_MASK ) == FS_MODE_READ ) { return file->length; } - switch( file->type ) { - case FS_REAL: - pos = ftell( file->fp ); - fseek( file->fp, 0, SEEK_END ); - length = ftell( file->fp ); - fseek( file->fp, pos, SEEK_SET ); - break; -#ifdef USE_ZLIB - case FS_GZIP: -gzipHack: - pos = gztell( file->zfp ); - gzseek( file->zfp, 0x7FFFFFFF, SEEK_SET ); - length = gztell( file->zfp ); - gzseek( file->zfp, pos, SEEK_SET ); - break; -#endif - default: - Com_Error( ERR_FATAL, "FS_GetFileLength: bad file type" ); - length = -1; - break; - } + if( file->type != FS_REAL ) { + Com_Error( ERR_FATAL, "%s: bad file type", __func__ ); + } + + pos = ftell( file->fp ); + fseek( file->fp, 0, SEEK_END ); + length = ftell( file->fp ); + fseek( file->fp, pos, SEEK_SET ); return length; } @@ -349,20 +337,15 @@ int FS_GetFileLengthNoCache( fileHandle_t f ) { length = file->length; break; #ifdef USE_ZLIB - case FS_GZIP: - pos = gztell( file->zfp ); - gzseek( file->zfp, 0x7FFFFFFF, SEEK_SET ); - length = gztell( file->zfp ); - gzseek( file->zfp, pos, SEEK_SET ); - break; case FS_PK2: length = file->length; break; + case FS_GZIP: + length = -1; + break; #endif default: - Com_Error( ERR_FATAL, "FS_GetFileLengthNoCache: bad file type" ); - length = -1; - break; + Com_Error( ERR_FATAL, "%s: bad file type", __func__ ); } return length; diff --git a/source/ui_menu.c b/source/ui_menu.c index 4db1b44..a0fef6b 100644 --- a/source/ui_menu.c +++ b/source/ui_menu.c @@ -643,14 +643,18 @@ static int MenuList_Key( menuList_t *l, int key ) { case K_HOME: case K_KP_HOME: l->prestep = 0; - return QMS_SILENT; + l->curvalue = 0; + l->generic.parent->callback( l->generic.id, QM_CHANGE, l->curvalue ); + return QMS_MOVE; case K_END: case K_KP_END: if( l->numItems > l->maxItems ) { l->prestep = l->numItems - l->maxItems; } - return QMS_SILENT; + l->curvalue = l->numItems - 1; + l->generic.parent->callback( l->generic.id, QM_CHANGE, l->curvalue ); + return QMS_MOVE; case K_MWHEELUP: if( keys.IsDown( K_CTRL ) ) { |