summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/cl_demo.c14
-rw-r--r--source/files.c57
-rw-r--r--source/ui_menu.c8
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 ) ) {