From 1dd622fcbb43b23b2cba2900efe8ea3a66ccb3dc Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Sat, 21 Dec 2024 15:22:44 +0300 Subject: [PATCH] engine: client: keys: refactoring, remove NULL sentinels, make keys structs and few more functions private to keys.c file --- engine/client/cl_game.c | 11 ----- engine/client/client.h | 3 +- engine/client/keys.c | 98 ++++++++++++++++++----------------------- engine/common/common.c | 2 +- engine/common/common.h | 1 + 5 files changed, 46 insertions(+), 69 deletions(-) diff --git a/engine/client/cl_game.c b/engine/client/cl_game.c index 878d5097..8ad9f993 100644 --- a/engine/client/cl_game.c +++ b/engine/client/cl_game.c @@ -2709,17 +2709,6 @@ static const char *pfnGetGameDirectory( void ) return szGetGameDir; } -/* -============= -Key_LookupBinding - -============= -*/ -static const char *Key_LookupBinding( const char *pBinding ) -{ - return Key_KeynumToString( Key_GetKey( pBinding )); -} - /* ============= pfnGetLevelName diff --git a/engine/client/client.h b/engine/client/client.h index 6b33578c..6ddacb47 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -1197,10 +1197,9 @@ void Key_Init( void ); void Key_WriteBindings( file_t *f ); const char *Key_GetBinding( int keynum ); void Key_SetBinding( int keynum, const char *binding ); +const char *Key_LookupBinding( const char *pBinding ); void Key_ClearStates( void ); const char *Key_KeynumToString( int keynum ); -int Key_StringToKeynum( const char *str ); -int Key_GetKey( const char *binding ); void Key_EnumCmds_f( void ); void Key_SetKeyDest( int key_dest ); void Key_EnableTextInput( qboolean enable, qboolean force ); diff --git a/engine/client/keys.c b/engine/client/keys.c index 168532b7..7acf3788 100644 --- a/engine/client/keys.c +++ b/engine/client/keys.c @@ -34,9 +34,9 @@ typedef struct keyname_s const char *binding; // default bind } keyname_t; -enginekey_t keys[256]; +static enginekey_t keys[256]; -keyname_t keynames[] = +static const keyname_t keynames[] = { {"TAB", K_TAB, "" }, {"ENTER", K_ENTER, "" }, @@ -139,7 +139,6 @@ keyname_t keynames[] = // raw semicolon seperates commands {"SEMICOLON", ';', "" }, -{NULL, 0, NULL }, }; static void OSK_EnableTextInput( qboolean enable, qboolean force ); @@ -172,48 +171,25 @@ the K_* names are matched up. to be configured even if they don't have defined names. =================== */ -int Key_StringToKeynum( const char *str ) +static int Key_StringToKeynum( const char *str ) { - keyname_t *kn; + int i; - if( !str || !str[0] ) return -1; - if( !str[1] ) return str[0]; + if( !str || !str[0] ) + return -1; + + if( !str[1] ) + return str[0]; // check for hex code if( str[0] == '0' && str[1] == 'x' && Q_strlen( str ) == 4 ) - { - int n1, n2; - - n1 = str[2]; - if( n1 >= '0' && n1 <= '9' ) - { - n1 -= '0'; - } - else if( n1 >= 'a' && n1 <= 'f' ) - { - n1 = n1 - 'a' + 10; - } - else n1 = 0; - - n2 = str[3]; - if( n2 >= '0' && n2 <= '9' ) - { - n2 -= '0'; - } - else if( n2 >= 'a' && n2 <= 'f' ) - { - n2 = n2 - 'a' + 10; - } - else n2 = 0; - - return n1 * 16 + n2; - } + return COM_Nibble( str[2] ) << 4 | COM_Nibble( str[3] ); // scan for a text match - for( kn = keynames; kn->name; kn++ ) + for( i = 0; i < ARRAYSIZE( keynames ); i++ ) { - if( !Q_stricmp( str, kn->name )) - return kn->keynum; + if( !Q_stricmp( str, keynames[i].name )) + return keynames[i].keynum; } return -1; @@ -229,12 +205,14 @@ given keynum. */ const char *Key_KeynumToString( int keynum ) { - keyname_t *kn; static char tinystr[5]; int i, j; - if ( keynum == -1 ) return ""; - if ( keynum < 0 || keynum > 255 ) return ""; + if( keynum == -1 ) + return ""; + + if( keynum < 0 || keynum > 255 ) + return ""; // check for printable ascii (don't use quote) if( keynum > 32 && keynum < 127 && keynum != '"' && keynum != ';' && keynum != K_SCROLLOCK ) @@ -245,10 +223,10 @@ const char *Key_KeynumToString( int keynum ) } // check for a key string - for( kn = keynames; kn->name; kn++ ) + for( i = 0; i < ARRAYSIZE( keynames ); i++ ) { - if( keynum == kn->keynum ) - return kn->name; + if( keynum == keynames[i].keynum ) + return keynames[i].name; } // make a hex string @@ -301,7 +279,7 @@ const char *Key_GetBinding( int keynum ) Key_GetKey =================== */ -int Key_GetKey( const char *pBinding ) +static int Key_GetKey( const char *pBinding ) { int i, len; const char *p; @@ -327,6 +305,17 @@ int Key_GetKey( const char *pBinding ) return -1; } +/* +============= +Key_LookupBinding + +============= +*/ +const char *Key_LookupBinding( const char *pBinding ) +{ + return Key_KeynumToString( Key_GetKey( pBinding )); +} + /* =================== Key_Unbind_f @@ -380,7 +369,6 @@ Key_Reset_f */ static void Key_Reset_f( void ) { - keyname_t *kn; int i; // clear all keys first @@ -391,8 +379,8 @@ static void Key_Reset_f( void ) } // apply default values - for( kn = keynames; kn->name; kn++ ) - Key_SetBinding( kn->keynum, kn->binding ); + for( i = 0; i < ARRAYSIZE( keynames ); i++ ) + Key_SetBinding( keynames[i].keynum, keynames[i].binding ); } /* @@ -500,7 +488,7 @@ Key_Init */ void Key_Init( void ) { - keyname_t *kn; + int i; // register our functions Cmd_AddRestrictedCommand( "bind", Key_Bind_f, "binds a command to the specified key in bindmap" ); @@ -511,7 +499,8 @@ void Key_Init( void ) Cmd_AddCommand( "makehelp", Key_EnumCmds_f, "write help.txt that contains all console cvars and cmds" ); // setup default binding. "unbindall" from config.cfg will be reset it - for( kn = keynames; kn->name; kn++ ) Key_SetBinding( kn->keynum, kn->binding ); + for( i = 0; i < ARRAYSIZE( keynames ); i++ ) + Key_SetBinding( keynames[i].keynum, keynames[i].binding ); Cvar_RegisterVariable( &osk_enable ); Cvar_RegisterVariable( &key_rotate ); @@ -909,17 +898,16 @@ A helper function if platform input doesn't support text mode properly */ int Key_ToUpper( int keynum ) { - keynum = Q_toupper( keynum ); if( keynum == '-' ) - keynum = '_'; + return '_'; if( keynum == '=' ) - keynum = '+'; + return '+'; if( keynum == ';' ) - keynum = ':'; + return ':'; if( keynum == '\'' ) - keynum = '"'; + return '"'; - return keynum; + return Q_toupper( keynum ); } /* On-screen keyboard: diff --git a/engine/common/common.c b/engine/common/common.c index f3a37f16..dea018db 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -612,7 +612,7 @@ COM_Nibble Returns the 4 bit nibble for a hex character ================== */ -static byte COM_Nibble( char c ) +byte COM_Nibble( char c ) { if(( c >= '0' ) && ( c <= '9' )) { diff --git a/engine/common/common.h b/engine/common/common.h index 27046b47..72a486c0 100644 --- a/engine/common/common.h +++ b/engine/common/common.h @@ -597,6 +597,7 @@ qboolean SV_Active( void ); */ char *COM_MemFgets( byte *pMemFile, int fileSize, int *filePos, char *pBuffer, int bufferSize ); void COM_HexConvert( const char *pszInput, int nInputLength, byte *pOutput ); +byte COM_Nibble( char c ); int COM_SaveFile( const char *filename, const void *data, int len ); byte *COM_LoadFileForMe( const char *filename, int *pLength ) MALLOC_LIKE( free, 1 ); qboolean COM_IsSafeFileToDownload( const char *filename );