engine: common: get rid of NULL sentinels at the end of arrays

This commit is contained in:
Alibek Omarov 2024-12-22 07:22:10 +03:00
parent 0c471aecb1
commit ac9d960eef
3 changed files with 41 additions and 53 deletions

View file

@ -1040,7 +1040,6 @@ static const autocomplete_list_t cmd_list[] =
{ "map", 1, Cmd_GetMapList }, { "map", 1, Cmd_GetMapList },
{ "cd", 1, Cmd_GetCDList }, { "cd", 1, Cmd_GetCDList },
{ "mp3", 1, Cmd_GetCDList }, { "mp3", 1, Cmd_GetCDList },
{ NULL }, // termiantor
}; };
/* /*
@ -1073,12 +1072,12 @@ for various cmds
*/ */
static qboolean Cmd_AutocompleteName( const char *source, int arg, char *buffer, size_t bufsize ) static qboolean Cmd_AutocompleteName( const char *source, int arg, char *buffer, size_t bufsize )
{ {
const autocomplete_list_t *list; int i;
for( list = cmd_list; list->name; list++ ) for( i = 0; i < ARRAYSIZE( cmd_list ); i++ )
{ {
if( list->arg == arg && Cmd_CheckName( list->name )) if( cmd_list[i].arg == arg && Cmd_CheckName( cmd_list[i].name ))
return list->func( source, buffer, bufsize ); return cmd_list[i].func( source, buffer, bufsize );
} }
return false; return false;

View file

@ -39,8 +39,6 @@ GNU General Public License for more details.
#define DT_SIGNED BIT( 8 ) // sign modificator #define DT_SIGNED BIT( 8 ) // sign modificator
#define DT_SIGNED_GS BIT( 31 ) // GoldSrc-specific sign modificator #define DT_SIGNED_GS BIT( 31 ) // GoldSrc-specific sign modificator
#define NUM_FIELDS( x ) ((sizeof( x ) / sizeof( x[0] )) - 1)
// helper macroses // helper macroses
#define ENTS_DEF( x ) #x, offsetof( entity_state_t, x ), sizeof( ((entity_state_t *)0)->x ) #define ENTS_DEF( x ) #x, offsetof( entity_state_t, x ), sizeof( ((entity_state_t *)0)->x )
#define UCMD_DEF( x ) #x, offsetof( usercmd_t, x ), sizeof( ((usercmd_t *)0)->x ) #define UCMD_DEF( x ) #x, offsetof( usercmd_t, x ), sizeof( ((usercmd_t *)0)->x )
@ -71,7 +69,6 @@ static const delta_field_t cmd_fields[] =
{ UCMD_DEF( impact_position[0] ) }, { UCMD_DEF( impact_position[0] ) },
{ UCMD_DEF( impact_position[1] ) }, { UCMD_DEF( impact_position[1] ) },
{ UCMD_DEF( impact_position[2] ) }, { UCMD_DEF( impact_position[2] ) },
{ NULL },
}; };
static const delta_field_t pm_fields[] = static const delta_field_t pm_fields[] =
@ -107,7 +104,6 @@ static const delta_field_t pm_fields[] =
{ PHYS_DEF( skydir_y ) }, { PHYS_DEF( skydir_y ) },
{ PHYS_DEF( skydir_z ) }, { PHYS_DEF( skydir_z ) },
{ PHYS_DEF( skyangle ) }, { PHYS_DEF( skyangle ) },
{ NULL },
}; };
static const delta_field_t ev_fields[] = static const delta_field_t ev_fields[] =
@ -130,7 +126,6 @@ static const delta_field_t ev_fields[] =
{ EVNT_DEF( iparam2 ) }, { EVNT_DEF( iparam2 ) },
{ EVNT_DEF( bparam1 ) }, { EVNT_DEF( bparam1 ) },
{ EVNT_DEF( bparam2 ) }, { EVNT_DEF( bparam2 ) },
{ NULL },
}; };
static const delta_field_t wd_fields[] = static const delta_field_t wd_fields[] =
@ -157,7 +152,6 @@ static const delta_field_t wd_fields[] =
{ WPDT_DEF( fuser2 ) }, { WPDT_DEF( fuser2 ) },
{ WPDT_DEF( fuser3 ) }, { WPDT_DEF( fuser3 ) },
{ WPDT_DEF( fuser4 ) }, { WPDT_DEF( fuser4 ) },
{ NULL },
}; };
static const delta_field_t cd_fields[] = static const delta_field_t cd_fields[] =
@ -218,7 +212,6 @@ static const delta_field_t cd_fields[] =
{ CLDT_DEF( vuser4[0] ) }, { CLDT_DEF( vuser4[0] ) },
{ CLDT_DEF( vuser4[1] ) }, { CLDT_DEF( vuser4[1] ) },
{ CLDT_DEF( vuser4[2] ) }, { CLDT_DEF( vuser4[2] ) },
{ NULL },
}; };
static const delta_field_t ent_fields[] = static const delta_field_t ent_fields[] =
@ -314,7 +307,6 @@ static const delta_field_t ent_fields[] =
{ ENTS_DEF( vuser4[0] ) }, { ENTS_DEF( vuser4[0] ) },
{ ENTS_DEF( vuser4[1] ) }, { ENTS_DEF( vuser4[1] ) },
{ ENTS_DEF( vuser4[2] ) }, { ENTS_DEF( vuser4[2] ) },
{ NULL },
}; };
static const delta_field_t meta_fields[] = static const delta_field_t meta_fields[] =
@ -326,7 +318,6 @@ static const delta_field_t meta_fields[] =
{ DESC_DEF( significant_bits ), }, { DESC_DEF( significant_bits ), },
{ DESC_DEF( premultiply ), }, { DESC_DEF( premultiply ), },
{ DESC_DEF( postmultiply ), }, { DESC_DEF( postmultiply ), },
{ NULL },
}; };
#if XASH_ENGINE_TESTS #if XASH_ENGINE_TESTS
@ -362,24 +353,22 @@ static const delta_field_t test_fields[] =
{ TEST_DEF( dt_short_unsigned ) }, { TEST_DEF( dt_short_unsigned ) },
{ TEST_DEF( dt_byte_signed ) }, { TEST_DEF( dt_byte_signed ) },
{ TEST_DEF( dt_byte_unsigned ) }, { TEST_DEF( dt_byte_unsigned ) },
{ NULL },
}; };
#endif #endif
static delta_info_t dt_info[] = static delta_info_t dt_info[] =
{ {
[DT_EVENT_T] = { "event_t", ev_fields, NUM_FIELDS( ev_fields ) }, [DT_EVENT_T] = { "event_t", ev_fields, ARRAYSIZE( ev_fields ) },
[DT_MOVEVARS_T] = { "movevars_t", pm_fields, NUM_FIELDS( pm_fields ) }, [DT_MOVEVARS_T] = { "movevars_t", pm_fields, ARRAYSIZE( pm_fields ) },
[DT_USERCMD_T] = { "usercmd_t", cmd_fields, NUM_FIELDS( cmd_fields ) }, [DT_USERCMD_T] = { "usercmd_t", cmd_fields, ARRAYSIZE( cmd_fields ) },
[DT_CLIENTDATA_T] = { "clientdata_t", cd_fields, NUM_FIELDS( cd_fields ) }, [DT_CLIENTDATA_T] = { "clientdata_t", cd_fields, ARRAYSIZE( cd_fields ) },
[DT_WEAPONDATA_T] = { "weapon_data_t", wd_fields, NUM_FIELDS( wd_fields ) }, [DT_WEAPONDATA_T] = { "weapon_data_t", wd_fields, ARRAYSIZE( wd_fields ) },
[DT_ENTITY_STATE_T] = { "entity_state_t", ent_fields, NUM_FIELDS( ent_fields ) }, [DT_ENTITY_STATE_T] = { "entity_state_t", ent_fields, ARRAYSIZE( ent_fields ) },
[DT_ENTITY_STATE_PLAYER_T] = { "entity_state_player_t", ent_fields, NUM_FIELDS( ent_fields ) }, [DT_ENTITY_STATE_PLAYER_T] = { "entity_state_player_t", ent_fields, ARRAYSIZE( ent_fields ) },
[DT_CUSTOM_ENTITY_STATE_T] = { "custom_entity_state_t", ent_fields, NUM_FIELDS( ent_fields ) }, [DT_CUSTOM_ENTITY_STATE_T] = { "custom_entity_state_t", ent_fields, ARRAYSIZE( ent_fields ) },
#if XASH_ENGINE_TESTS #if XASH_ENGINE_TESTS
[DT_DELTA_TEST_STRUCT_T] = { "delta_test_struct_t", test_fields, NUM_FIELDS( test_fields ) }, [DT_DELTA_TEST_STRUCT_T] = { "delta_test_struct_t", test_fields, ARRAYSIZE( test_fields ) },
#endif #endif
[DT_STRUCT_COUNT] = { NULL },
}; };
// meta description is special, it cannot be overriden // meta description is special, it cannot be overriden
@ -387,9 +376,9 @@ static const delta_info_t dt_goldsrc_meta =
{ {
.pName = "goldsrc_delta_t", .pName = "goldsrc_delta_t",
.pInfo = meta_fields, .pInfo = meta_fields,
.maxFields = NUM_FIELDS( meta_fields ), .maxFields = ARRAYSIZE( meta_fields ),
.numFields = NUM_FIELDS( meta_fields ), .numFields = ARRAYSIZE( meta_fields ),
.pFields = (delta_t[NUM_FIELDS( meta_fields )]) .pFields = (delta_t[ARRAYSIZE( meta_fields )])
{ {
{ {
DESC_DEF( fieldType ), DESC_DEF( fieldType ),
@ -451,7 +440,7 @@ static delta_info_t *Delta_FindStruct( const char *name )
if( !COM_CheckString( name )) if( !COM_CheckString( name ))
return NULL; return NULL;
for( i = 0; i < NUM_FIELDS( dt_info ); i++ ) for( i = 0; i < ARRAYSIZE( dt_info ); i++ )
{ {
if( !Q_stricmp( dt_info[i].pName, name )) if( !Q_stricmp( dt_info[i].pName, name ))
return &dt_info[i]; return &dt_info[i];
@ -465,7 +454,7 @@ static delta_info_t *Delta_FindStruct( const char *name )
static int Delta_NumTables( void ) static int Delta_NumTables( void )
{ {
return NUM_FIELDS( dt_info ); return ARRAYSIZE( dt_info );
} }
static delta_info_t *Delta_FindStructByIndex( int index ) static delta_info_t *Delta_FindStructByIndex( int index )
@ -480,7 +469,7 @@ static delta_info_t *Delta_FindStructByEncoder( const char *encoderName )
if( !COM_CheckString( encoderName ) ) if( !COM_CheckString( encoderName ) )
return NULL; return NULL;
for( i = 0; i < NUM_FIELDS( dt_info ); i++ ) for( i = 0; i < ARRAYSIZE( dt_info ); i++ )
{ {
if( !Q_stricmp( dt_info[i].funcName, encoderName )) if( !Q_stricmp( dt_info[i].funcName, encoderName ))
return &dt_info[i]; return &dt_info[i];
@ -495,7 +484,7 @@ static delta_info_t *Delta_FindStructByDelta( const delta_t *pFields )
if( !pFields ) return NULL; if( !pFields ) return NULL;
for( i = 0; i < NUM_FIELDS( dt_info ); i++ ) for( i = 0; i < ARRAYSIZE( dt_info ); i++ )
{ {
if( dt_info[i].pFields == pFields ) if( dt_info[i].pFields == pFields )
return &dt_info[i]; return &dt_info[i];
@ -518,29 +507,32 @@ static void Delta_CustomEncode( delta_info_t *dt, const void *from, const void *
dt->userCallback( dt->pFields, from, to ); dt->userCallback( dt->pFields, from, to );
} }
static delta_field_t *Delta_FindFieldInfo( const delta_field_t *pInfo, const char *fieldName ) static const delta_field_t *Delta_FindFieldInfo( const delta_field_t *pInfo, const char *fieldName, int maxFields )
{ {
int i;
if( !fieldName || !*fieldName ) if( !fieldName || !*fieldName )
return NULL; return NULL;
for( ; pInfo->name; pInfo++ ) for( i = 0; i < maxFields; i++ )
{ {
if( !Q_strcmp( pInfo->name, fieldName )) if( !Q_strcmp( pInfo[i].name, fieldName ))
return (delta_field_t *)pInfo; return &pInfo[i];
} }
return NULL; return NULL;
} }
static int Delta_IndexForFieldInfo( const delta_field_t *pInfo, const char *fieldName ) static int Delta_IndexForFieldInfo( const delta_field_t *pInfo, const char *fieldName, int maxFields )
{ {
int i; int i;
if( !fieldName || !*fieldName ) if( !fieldName || !*fieldName )
return -1; return -1;
for( i = 0; pInfo->name; i++, pInfo++ ) for( i = 0; i < maxFields; i++ )
{ {
if( !Q_strcmp( pInfo->name, fieldName )) if( !Q_strcmp( pInfo[i].name, fieldName ))
return i; return i;
} }
return -1; return -1;
@ -548,7 +540,7 @@ static int Delta_IndexForFieldInfo( const delta_field_t *pInfo, const char *fiel
static qboolean Delta_AddField( delta_info_t *dt, const char *pName, int flags, int bits, float mul, float post_mul ) static qboolean Delta_AddField( delta_info_t *dt, const char *pName, int flags, int bits, float mul, float post_mul )
{ {
delta_field_t *pFieldInfo; const delta_field_t *pFieldInfo;
delta_t *pField; delta_t *pField;
int i; int i;
@ -567,7 +559,7 @@ static qboolean Delta_AddField( delta_info_t *dt, const char *pName, int flags,
} }
// find field description // find field description
pFieldInfo = Delta_FindFieldInfo( dt->pInfo, pName ); pFieldInfo = Delta_FindFieldInfo( dt->pInfo, pName, dt->maxFields );
if( !pFieldInfo ) if( !pFieldInfo )
{ {
Con_DPrintf( S_ERROR "%s: couldn't find description for %s->%s\n", __func__, dt->pName, pName ); Con_DPrintf( S_ERROR "%s: couldn't find description for %s->%s\n", __func__, dt->pName, pName );
@ -610,7 +602,7 @@ static void Delta_WriteTableField( sizebuf_t *msg, int tableIndex, const delta_t
dt = Delta_FindStructByIndex( tableIndex ); dt = Delta_FindStructByIndex( tableIndex );
Assert( dt && dt->bInitialized ); Assert( dt && dt->bInitialized );
nameIndex = Delta_IndexForFieldInfo( dt->pInfo, pField->name ); nameIndex = Delta_IndexForFieldInfo( dt->pInfo, pField->name, dt->maxFields );
Assert( nameIndex >= 0 && nameIndex < dt->maxFields ); Assert( nameIndex >= 0 && nameIndex < dt->maxFields );
MSG_BeginServerCmd( msg, svc_deltatable ); MSG_BeginServerCmd( msg, svc_deltatable );
@ -681,10 +673,10 @@ void Delta_ParseTableField( sizebuf_t *msg )
Delta_AddField( dt, pName, flags, bits, mul, post_mul ); Delta_AddField( dt, pName, flags, bits, mul, post_mul );
} }
static qboolean Delta_ParseField( char **delta_script, const delta_field_t *pInfo, delta_t *pField, qboolean bPost ) static qboolean Delta_ParseField( char **delta_script, const delta_info_t *dt, delta_t *pField, qboolean bPost )
{ {
const delta_field_t *pFieldInfo;
string token; string token;
delta_field_t *pFieldInfo;
char *oldpos; char *oldpos;
*delta_script = COM_ParseFile( *delta_script, token, sizeof( token )); *delta_script = COM_ParseFile( *delta_script, token, sizeof( token ));
@ -701,7 +693,7 @@ static qboolean Delta_ParseField( char **delta_script, const delta_field_t *pInf
return false; return false;
} }
pFieldInfo = Delta_FindFieldInfo( pInfo, token ); pFieldInfo = Delta_FindFieldInfo( dt->pInfo, token, dt->maxFields );
if( !pFieldInfo ) if( !pFieldInfo )
{ {
Con_DPrintf( S_ERROR "%s: unable to find field %s\n", __func__, token ); Con_DPrintf( S_ERROR "%s: unable to find field %s\n", __func__, token );
@ -825,13 +817,11 @@ static void Delta_ParseTable( char **delta_script, delta_info_t *dt, const char
{ {
string token; string token;
delta_t *pField; delta_t *pField;
const delta_field_t *pInfo;
// allocate the delta-structures // allocate the delta-structures
if( !dt->pFields ) dt->pFields = (delta_t *)Z_Calloc( dt->maxFields * sizeof( delta_t )); if( !dt->pFields ) dt->pFields = (delta_t *)Z_Calloc( dt->maxFields * sizeof( delta_t ));
pField = dt->pFields; pField = dt->pFields;
pInfo = dt->pInfo;
dt->numFields = 0; dt->numFields = 0;
// assume we have handled '{' // assume we have handled '{'
@ -841,12 +831,12 @@ static void Delta_ParseTable( char **delta_script, delta_info_t *dt, const char
if( !Q_strcmp( token, "DEFINE_DELTA" )) if( !Q_strcmp( token, "DEFINE_DELTA" ))
{ {
if( Delta_ParseField( delta_script, pInfo, &pField[dt->numFields], false )) if( Delta_ParseField( delta_script, dt, &pField[dt->numFields], false ))
dt->numFields++; dt->numFields++;
} }
else if( !Q_strcmp( token, "DEFINE_DELTA_POST" )) else if( !Q_strcmp( token, "DEFINE_DELTA_POST" ))
{ {
if( Delta_ParseField( delta_script, pInfo, &pField[dt->numFields], true )) if( Delta_ParseField( delta_script, dt, &pField[dt->numFields], true ))
dt->numFields++; dt->numFields++;
} }
else if( token[0] == '}' ) else if( token[0] == '}' )
@ -963,7 +953,7 @@ void Delta_Init( void )
Delta_AddField( dt, "skyvec_z", DT_FLOAT|DT_SIGNED, 16, 32.0f, 1.0f ); Delta_AddField( dt, "skyvec_z", DT_FLOAT|DT_SIGNED, 16, 32.0f, 1.0f );
Delta_AddField( dt, "wateralpha", DT_FLOAT|DT_SIGNED, 16, 32.0f, 1.0f ); Delta_AddField( dt, "wateralpha", DT_FLOAT|DT_SIGNED, 16, 32.0f, 1.0f );
Delta_AddField( dt, "fog_settings", DT_INTEGER, 32, 1.0f, 1.0f ); Delta_AddField( dt, "fog_settings", DT_INTEGER, 32, 1.0f, 1.0f );
dt->numFields = NUM_FIELDS( pm_fields ) - 4; dt->numFields = ARRAYSIZE( pm_fields ) - 4;
// now done // now done
dt->bInitialized = true; dt->bInitialized = true;
@ -976,7 +966,7 @@ void Delta_InitClient( void )
// already initalized // already initalized
if( delta_init ) return; if( delta_init ) return;
for( i = 0; i < NUM_FIELDS( dt_info ); i++ ) for( i = 0; i < ARRAYSIZE( dt_info ); i++ )
{ {
if( dt_info[i].numFields > 0 ) if( dt_info[i].numFields > 0 )
{ {
@ -994,7 +984,7 @@ void Delta_Shutdown( void )
if( !delta_init ) return; if( !delta_init ) return;
for( i = 0; i < NUM_FIELDS( dt_info ); i++ ) for( i = 0; i < ARRAYSIZE( dt_info ); i++ )
{ {
dt_info[i].numFields = 0; dt_info[i].numFields = 0;
dt_info[i].customEncode = CUSTOM_NONE; dt_info[i].customEncode = CUSTOM_NONE;

View file

@ -46,7 +46,6 @@ enum
#if XASH_ENGINE_TESTS #if XASH_ENGINE_TESTS
DT_DELTA_TEST_STRUCT_T, DT_DELTA_TEST_STRUCT_T,
#endif #endif
DT_STRUCT_COUNT
}; };
// struct info (filled by engine) // struct info (filled by engine)