From f9ed578bf1f940251496ef8355f25edb667838ba Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Wed, 22 Apr 2026 20:10:35 +0500 Subject: [PATCH] engine: move CRC32_MapFIle to mod_bmodel, as it's a common function. Use le_struct_swap --- engine/common/mod_bmodel.c | 81 ++++++++++++++++++++++++++++++++++++++ engine/server/sv_init.c | 76 ----------------------------------- 2 files changed, 81 insertions(+), 76 deletions(-) diff --git a/engine/common/mod_bmodel.c b/engine/common/mod_bmodel.c index 922c91df..8dfaca93 100644 --- a/engine/common/mod_bmodel.c +++ b/engine/common/mod_bmodel.c @@ -4067,6 +4067,87 @@ static void Mod_SwapBSPLumps( byte *mod_base, size_t bufferlen ) } } +/* +================= +CRC32_MapFile + +compute CRC for the map lump data +================= +*/ +qboolean CRC32_MapFile( dword *crcvalue, const char *filename, qboolean multiplayer ) +{ + byte headbuf[sizeof( dheader_t )]; + char buffer[1024]; + int i, num_bytes, lumplen; + dheader_t *header; + file_t *f; + + if( !crcvalue ) + return false; + + // always calc same checksum for singleplayer + if( multiplayer == false ) + { + *crcvalue = (('H'<<24)+('S'<<16)+('A'<<8)+'X'); + return true; + } + + f = FS_Open( filename, "rb", false ); + if( !f ) + return false; + + num_bytes = FS_Read( f, headbuf, sizeof( headbuf )); + + if( num_bytes != sizeof( headbuf )) + { + FS_Close( f ); + return false; + } + + header = (dheader_t *)headbuf; + le_struct_swap( dheader_swap, header ); + + switch( header->version ) + { + case Q1BSP_VERSION: + case HLBSP_VERSION: + case QBSP2_VERSION: + break; + default: + FS_Close( f ); + return false; + } + + CRC32_Init( crcvalue ); + + for( i = LUMP_PLANES; i < HEADER_LUMPS; i++ ) + { + lumplen = header->lumps[i].filelen; + FS_Seek( f, header->lumps[i].fileofs, SEEK_SET ); + + while( lumplen > 0 ) + { + if( lumplen >= sizeof( buffer )) + num_bytes = FS_Read( f, buffer, sizeof( buffer )); + else + num_bytes = FS_Read( f, buffer, lumplen ); + + if( num_bytes > 0 ) + { + lumplen -= num_bytes; + CRC32_ProcessBuffer( crcvalue, buffer, num_bytes ); + } + + if( FS_Eof( f )) + break; + } + } + + FS_Close( f ); + + return true; +} + /* ================= Mod_FindEndOfBSPFile diff --git a/engine/server/sv_init.c b/engine/server/sv_init.c index dcf1b326..f253ebcf 100644 --- a/engine/server/sv_init.c +++ b/engine/server/sv_init.c @@ -833,82 +833,6 @@ static void SV_SetupClients( void ) ClearBits( sv_maxclients.flags, FCVAR_CHANGED ); } -qboolean CRC32_MapFile( dword *crcvalue, const char *filename, qboolean multiplayer ) -{ - char headbuf[1024], buffer[1024]; - int i, num_bytes, lumplen; - int version, hdr_size; - dheader_t *header; - file_t *f; - - if( !crcvalue ) return false; - - // always calc same checksum for singleplayer - if( multiplayer == false ) - { - *crcvalue = (('H'<<24)+('S'<<16)+('A'<<8)+'X'); - return true; - } - - f = FS_Open( filename, "rb", false ); - if( !f ) return false; - - // read version number - FS_Read( f, &version, sizeof( int )); - FS_Seek( f, 0, SEEK_SET ); - - hdr_size = sizeof( int ) + sizeof( dlump_t ) * HEADER_LUMPS; - num_bytes = FS_Read( f, headbuf, hdr_size ); - - // corrupted map ? - if( num_bytes != hdr_size ) - { - FS_Close( f ); - return false; - } - - header = (dheader_t *)headbuf; - - // invalid version ? - switch( header->version ) - { - case Q1BSP_VERSION: - case HLBSP_VERSION: - case QBSP2_VERSION: - break; - default: - FS_Close( f ); - return false; - } - - CRC32_Init( crcvalue ); - - for( i = LUMP_PLANES; i < HEADER_LUMPS; i++ ) - { - lumplen = header->lumps[i].filelen; - FS_Seek( f, header->lumps[i].fileofs, SEEK_SET ); - - while( lumplen > 0 ) - { - if( lumplen >= sizeof( buffer )) - num_bytes = FS_Read( f, buffer, sizeof( buffer )); - else num_bytes = FS_Read( f, buffer, lumplen ); - - if( num_bytes > 0 ) - { - lumplen -= num_bytes; - CRC32_ProcessBuffer( crcvalue, buffer, num_bytes ); - } - - // file unexpected end ? - if( FS_Eof( f )) break; - } - } - - FS_Close( f ); - - return 1; -} void SV_FreeTestPacket( void ) {