From 54c38610bf262e49686e5bf8b0fdd5244e94c753 Mon Sep 17 00:00:00 2001 From: Garux Date: Sat, 23 Jan 2021 17:25:47 +0300 Subject: [PATCH] use std::list --- tools/quake3/q3map2/autopk3.cpp | 22 ++----- tools/quake3/q3map2/bspfile_abstract.cpp | 76 ++++++++---------------- tools/quake3/q3map2/convert_map.cpp | 13 ++-- tools/quake3/q3map2/decals.cpp | 2 +- tools/quake3/q3map2/map.cpp | 9 +-- tools/quake3/q3map2/model.cpp | 7 +-- tools/quake3/q3map2/patch.cpp | 7 +-- tools/quake3/q3map2/q3map2.h | 11 +--- tools/quake3/q3map2/writebsp.cpp | 12 +--- 9 files changed, 46 insertions(+), 113 deletions(-) diff --git a/tools/quake3/q3map2/autopk3.cpp b/tools/quake3/q3map2/autopk3.cpp index 3eca04d4..104d3189 100644 --- a/tools/quake3/q3map2/autopk3.cpp +++ b/tools/quake3/q3map2/autopk3.cpp @@ -302,11 +302,10 @@ int pk3BSPMain( int argc, char **argv ){ } /* Ent keys */ - epair_t *ep; - for ( ep = entities[0].epairs; ep != NULL; ep = ep->next ) + for ( const auto& ep : entities[0].epairs ) { - if ( striEqualPrefix( ep->key, "vertexremapshader" ) ) { - sscanf( ep->value, "%*[^;] %*[;] %s", str ); // textures/remap/from;textures/remap/to + if ( striEqualPrefix( ep.key.c_str(), "vertexremapshader" ) ) { + sscanf( ep.value.c_str(), "%*[^;] %*[;] %s", str ); // textures/remap/from;textures/remap/to res2list( pk3Shaders, str ); } } @@ -977,11 +976,10 @@ int repackBSPMain( int argc, char **argv ){ } /* Ent keys */ - epair_t *ep; - for ( ep = entities[0].epairs; ep != NULL; ep = ep->next ) + for ( const auto& ep : entities[0].epairs ) { - if ( striEqualPrefix( ep->key, "vertexremapshader" ) ) { - sscanf( ep->value, "%*[^;] %*[;] %s", str ); // textures/remap/from;textures/remap/to + if ( striEqualPrefix( ep.key.c_str(), "vertexremapshader" ) ) { + sscanf( ep.value.c_str(), "%*[^;] %*[;] %s", str ); // textures/remap/from;textures/remap/to res2list( pk3Shaders, str ); } } @@ -1074,14 +1072,6 @@ int repackBSPMain( int argc, char **argv ){ //allocatedBSPBrushes = 0; } */ { - for ( const auto& e : entities ){ - ep = e.epairs; - while( ep != NULL){ - epair_t *ep2free = ep; - ep = ep->next; - free( ep2free ); - } - } entities.clear(); //Sys_Printf( "freed entities\n" ); numBSPEntities = 0; diff --git a/tools/quake3/q3map2/bspfile_abstract.cpp b/tools/quake3/q3map2/bspfile_abstract.cpp index 86e848cb..136a1fb6 100644 --- a/tools/quake3/q3map2/bspfile_abstract.cpp +++ b/tools/quake3/q3map2/bspfile_abstract.cpp @@ -523,30 +523,20 @@ void StripTrailing( char *e ){ parses a single quoted "key" "value" pair into an epair struct */ -epair_t *ParseEPair( void ){ - /* allocate and clear new epair */ - epair_t *e = safe_calloc( sizeof( epair_t ) ); - +void ParseEPair( std::list& epairs ){ /* handle key */ - if ( strlen( token ) >= ( MAX_KEY - 1 ) ) { - Error( "ParseEPair: token too long" ); - } - - e->key = copystring( token ); - GetToken( false ); + /* strip trailing spaces that sometimes get accidentally added in the editor */ + StripTrailing( token ); + epair_t ep; + ep.key = token; /* handle value */ - if ( strlen( token ) >= MAX_VALUE - 1 ) { - Error( "ParseEpar: token too long" ); - } - e->value = copystring( token ); + GetToken( false ); + StripTrailing( token ); + ep.value = token; - /* strip trailing spaces that sometimes get accidentally added in the editor */ - StripTrailing( e->key ); - StripTrailing( e->value ); - - /* return it */ - return e; + if( !ep.key.empty() && !ep.value.empty() ) + epairs.emplace_back( ep ); } @@ -557,9 +547,6 @@ epair_t *ParseEPair( void ){ */ bool ParseEntity( void ){ - epair_t *e; - - /* dummy check */ if ( !GetToken( true ) ) { return false; @@ -581,9 +568,7 @@ bool ParseEntity( void ){ if ( strEqual( token, "}" ) ) { break; } - e = ParseEPair(); - e->next = mapEnt->epairs; - mapEnt->epairs = e; + ParseEPair( mapEnt->epairs ); } /* return to sender */ @@ -677,9 +662,8 @@ void UnparseEntities( void ){ entity_t *e = &entities[ i ]; /* get epair */ - if ( e->epairs == NULL ) { + if ( e->epairs.empty() ) { continue; /* ent got removed */ - } /* ydnar: certain entities get stripped from bsp file */ const char *classname = ent_classname( e ); @@ -694,12 +678,12 @@ void UnparseEntities( void ){ end += 2; /* walk epair list */ - for ( epair_t *ep = e->epairs; ep != NULL; ep = ep->next ) + for ( const auto& ep : e->epairs ) { /* copy and clean */ - strcpy( key, ep->key ); + strcpy( key, ep.key.c_str() ); StripTrailing( key ); - strcpy( value, ep->value ); + strcpy( value, ep.value.c_str() ); StripTrailing( value ); /* add to buffer */ @@ -730,13 +714,9 @@ void UnparseEntities( void ){ */ void PrintEntity( const entity_t *ent ){ - epair_t *ep; - - Sys_Printf( "------- entity %p -------\n", ent ); - for ( ep = ent->epairs; ep != NULL; ep = ep->next ) - Sys_Printf( "%s = %s\n", ep->key, ep->value ); - + for ( const auto& ep : ent->epairs ) + Sys_Printf( "%s = %s\n", ep.key.c_str(), ep.value.c_str() ); } @@ -747,25 +727,17 @@ void PrintEntity( const entity_t *ent ){ */ void SetKeyValue( entity_t *ent, const char *key, const char *value ){ - epair_t *ep; - - /* check for existing epair */ - for ( ep = ent->epairs; ep != NULL; ep = ep->next ) + for ( auto& ep : ent->epairs ) { - if ( EPAIR_EQUAL( ep->key, key ) ) { - free( ep->value ); - ep->value = copystring( value ); + if ( EPAIR_EQUAL( ep.key.c_str(), key ) ) { + ep.value = value; return; } } /* create new epair */ - ep = safe_malloc( sizeof( *ep ) ); - ep->next = ent->epairs; - ent->epairs = ep; - ep->key = copystring( key ); - ep->value = copystring( value ); + ent->epairs.emplace_back( epair_t{ key, value } ); } @@ -781,10 +753,10 @@ const char *ValueForKey( const entity_t *ent, const char *key ){ } /* walk epair list */ - for ( epair_t *ep = ent->epairs; ep != NULL; ep = ep->next ) + for ( const auto& ep : ent->epairs ) { - if ( EPAIR_EQUAL( ep->key, key ) ) { - return ep->value; + if ( EPAIR_EQUAL( ep.key.c_str(), key ) ) { + return ep.value.c_str(); } } diff --git a/tools/quake3/q3map2/convert_map.cpp b/tools/quake3/q3map2/convert_map.cpp index c5d8407b..c6a5f4e1 100644 --- a/tools/quake3/q3map2/convert_map.cpp +++ b/tools/quake3/q3map2/convert_map.cpp @@ -967,29 +967,26 @@ static void ConvertModel( FILE *f, bspModel_t *model, int modelNum, vec3_t origi */ static void ConvertEPairs( FILE *f, entity_t *e, bool skip_origin ){ - epair_t *ep; - - /* walk epairs */ - for ( ep = e->epairs; ep != NULL; ep = ep->next ) + for ( const auto& ep : e->epairs ) { /* ignore empty keys/values */ - if ( strEmpty( ep->key ) || strEmpty( ep->value ) ) { + if ( ep.key.empty() || ep.value.empty() ) { continue; } /* ignore model keys with * prefixed values */ - if ( striEqual( ep->key, "model" ) && ep->value[ 0 ] == '*' ) { + if ( striEqual( ep.key.c_str(), "model" ) && ep.value.c_str()[ 0 ] == '*' ) { continue; } /* ignore origin keys if skip_origin is set */ - if ( skip_origin && striEqual( ep->key, "origin" ) ) { + if ( skip_origin && striEqual( ep.key.c_str(), "origin" ) ) { continue; } /* emit the epair */ - fprintf( f, "\t\"%s\" \"%s\"\n", ep->key, ep->value ); + fprintf( f, "\t\"%s\" \"%s\"\n", ep.key.c_str(), ep.value.c_str() ); } } diff --git a/tools/quake3/q3map2/decals.cpp b/tools/quake3/q3map2/decals.cpp index 3b6323b1..59e49c63 100644 --- a/tools/quake3/q3map2/decals.cpp +++ b/tools/quake3/q3map2/decals.cpp @@ -428,7 +428,7 @@ void ProcessDecals( void ){ /* any patches? */ if ( e.patches == NULL ) { Sys_Warning( "Decal entity without any patch meshes, ignoring.\n" ); - e.epairs = NULL; /* fixme: leak! */ + e.epairs.clear(); continue; } diff --git a/tools/quake3/q3map2/map.cpp b/tools/quake3/q3map2/map.cpp index 85285a23..b3a3e43c 100644 --- a/tools/quake3/q3map2/map.cpp +++ b/tools/quake3/q3map2/map.cpp @@ -1664,7 +1664,6 @@ void LoadEntityIndexMap( entity_t *e ){ */ static bool ParseMapEntity( bool onlyLights, bool noCollapseGroups ){ - epair_t *ep; brush_t *brush; parseMesh_t *patch; @@ -1737,13 +1736,7 @@ static bool ParseMapEntity( bool onlyLights, bool noCollapseGroups ){ else { /* parse a key / value pair */ - ep = ParseEPair(); - - /* ydnar: 2002-07-06 fixed wolf bug with empty epairs */ - if ( !strEmpty( ep->key ) && !strEmpty( ep->value ) ) { - ep->next = mapEnt->epairs; - mapEnt->epairs = ep; - } + ParseEPair( mapEnt->epairs ); } } diff --git a/tools/quake3/q3map2/model.cpp b/tools/quake3/q3map2/model.cpp index fdf16305..ff6125a8 100644 --- a/tools/quake3/q3map2/model.cpp +++ b/tools/quake3/q3map2/model.cpp @@ -1424,14 +1424,13 @@ void AddTriangleModels( entity_t *eparent ){ /* get shader remappings */ std::list remaps; - for ( epair_t *ep = e->epairs; ep != NULL; ep = ep->next ) + for ( const auto& ep : e->epairs ) { /* look for keys prefixed with "_remap" */ - if ( !strEmptyOrNull( ep->key ) && !strEmptyOrNull( ep->value ) && - striEqualPrefix( ep->key, "_remap" ) ) { + if ( striEqualPrefix( ep.key.c_str(), "_remap" ) ) { /* create new remapping */ remap_t remap; - strcpy( remap.from, ep->value ); + strcpy( remap.from, ep.value.c_str() ); /* split the string */ char *split = strchr( remap.from, ';' ); diff --git a/tools/quake3/q3map2/patch.cpp b/tools/quake3/q3map2/patch.cpp index 78618878..45c709d4 100644 --- a/tools/quake3/q3map2/patch.cpp +++ b/tools/quake3/q3map2/patch.cpp @@ -223,7 +223,6 @@ void ParsePatch( bool onlyLights ){ parseMesh_t *pm; mesh_t m; bspDrawVert_t *verts; - epair_t *ep; vec4_t delta, delta2, delta3; bool degenerate; float longestCurve; @@ -268,10 +267,8 @@ void ParsePatch( bool onlyLights ){ // if brush primitives format, we may have some epairs to ignore here GetToken( true ); if ( !strEqual( token, "}" ) && ( g_brushType == BPRIMIT_BP || g_brushType == BPRIMIT_UNDEFINED ) ) { - ep = ParseEPair(); - free( ep->key ); - free( ep->value ); - free( ep ); + std::list dummy; + ParseEPair( dummy ); } else{ UnGetToken(); diff --git a/tools/quake3/q3map2/q3map2.h b/tools/quake3/q3map2/q3map2.h index 2a54950a..249c07ca 100644 --- a/tools/quake3/q3map2/q3map2.h +++ b/tools/quake3/q3map2/q3map2.h @@ -323,10 +323,6 @@ brushType_t; #define MAX_MAP_ADVERTISEMENTS 30 -/* key / value pair sizes in the entities lump */ -#define MAX_KEY 32 -#define MAX_VALUE 1024 - /* the editor uses these predefined yaw angles to orient entities up or down */ #define ANGLE_UP -1 #define ANGLE_DOWN -2 @@ -1099,8 +1095,7 @@ metaTriangle_t; typedef struct epair_s { - struct epair_s *next; - char *key, *value; + CopiedString key, value; } epair_t; @@ -1112,7 +1107,7 @@ typedef struct parseMesh_t *patches; int mapEntityNum, firstDrawSurf; int firstBrush, numBrushes; /* only valid during BSP compile */ - epair_t *epairs; + std::list epairs; vec3_t originbrush_origin; } entity_t; @@ -1885,7 +1880,7 @@ void PartialLoadBSPFile( const char *filename ); void WriteBSPFile( const char *filename ); void PrintBSPFileSizes( void ); -epair_t *ParseEPair( void ); +void ParseEPair( std::list& epairs ); void ParseEntities( void ); void UnparseEntities( void ); void PrintEntity( const entity_t *ent ); diff --git a/tools/quake3/q3map2/writebsp.cpp b/tools/quake3/q3map2/writebsp.cpp index 66cc1d69..f8f35163 100644 --- a/tools/quake3/q3map2/writebsp.cpp +++ b/tools/quake3/q3map2/writebsp.cpp @@ -284,7 +284,6 @@ void SetModelNumbers( void ){ void SetLightStyles( void ){ int j, numStyles; entity_t *e; - epair_t *ep, *next; char value[ 10 ]; char lightTargets[ MAX_SWITCHED_LIGHTS ][ 64 ]; int lightStyles[ MAX_SWITCHED_LIGHTS ]; @@ -310,16 +309,7 @@ void SetLightStyles( void ){ if ( !ENT_READKV( &t, e, "targetname" ) ) { /* ydnar: strip the light from the BSP file */ if ( !keepLights ) { - ep = e->epairs; - while ( ep != NULL ) - { - next = ep->next; - free( ep->key ); - free( ep->value ); - free( ep ); - ep = next; - } - e->epairs = NULL; + e->epairs.clear(); numStrippedLights++; }