From da4062ede93d8b0c0219415cdca86cb89a09eea3 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Tue, 9 Jul 2019 16:36:34 +0300 Subject: [PATCH] engine: cmd: add apropos command from old engine --- engine/common/cmd.c | 78 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/engine/common/cmd.c b/engine/common/cmd.c index 4d61064e..03347ff4 100644 --- a/engine/common/cmd.c +++ b/engine/common/cmd.c @@ -1139,6 +1139,83 @@ void Cmd_Unlink( int group ) Con_Reportf( "unlink %i commands\n", count ); } +static void Cmd_Apropos_f( void ) +{ + cmd_t *cmd; + convar_t *var; + cmdalias_t *alias; + const char *partial; + int count = 0; + qboolean ispattern; + + if( Cmd_Argc() > 1 ) + { + partial = Cmd_Args(); + } + else + { + Msg( "apropos what?\n" ); + return; + } + + ispattern = partial && ( Q_strchr( partial, '*' ) || Q_strchr( partial, '?' )); + if( !ispattern ) + partial = va( "*%s*", partial ); + + for( var = (convar_t*)Cvar_GetList(); var; var = var->next ) + { + if( !matchpattern_with_separator( var->name, partial, true, "", false ) ) + { + const char *desc; + + if( var->flags & FCVAR_EXTENDED ) + desc = var->desc; + else desc = "game cvar"; + + if( !desc ) + desc = "user cvar"; + + if( !matchpattern_with_separator( desc, partial, true, "", false )) + continue; + } + + // TODO: maybe add flags output like cvarlist, also + // fix inconsistencies in output from different commands + Msg( "cvar ^3%s^7 is \"%s\" [\"%s\"] %s\n", + var->name, var->string, + ( var->flags & FCVAR_EXTENDED ) ? var->def_string : "", + ( var->flags & FCVAR_EXTENDED ) ? var->desc : "game cvar"); + count++; + } + + for( cmd = Cmd_GetFirstFunctionHandle(); cmd; cmd = Cmd_GetNextFunctionHandle( cmd ) ) + { + if( cmd->name[0] == '@' ) + continue; // never show system cmds + + if( !matchpattern_with_separator( cmd->name, partial, true, "", false ) && + !matchpattern_with_separator( cmd->desc, partial, true, "", false )) + continue; + + Msg( "command ^2%s^7: %s\n", cmd->name, cmd->desc ); + count++; + } + + for( alias = Cmd_AliasGetList(); alias; alias = alias->next ) + { + // proceed a bit differently here as an alias value always got a final \n + if( !matchpattern_with_separator( alias->name, partial, true, "", false ) && + !matchpattern_with_separator( alias->value, partial, true, "\n", false )) // when \n is a separator, wildcards don't match it //-V666 + continue; + + Msg( "alias ^5%s^7: %s", alias->name, alias->value ); // do not print an extra \n + count++; + } + + Msg( "\n%i result%s\n\n", count, (count > 1) ? "s" : "" ); +} + + /* ============ Cmd_Null_f @@ -1170,6 +1247,7 @@ void Cmd_Init( void ) Cmd_AddCommand( "wait", Cmd_Wait_f, "make script execution wait for some rendered frames" ); Cmd_AddCommand( "cmdlist", Cmd_List_f, "display all console commands beginning with the specified prefix" ); Cmd_AddCommand( "stuffcmds", Cmd_StuffCmds_f, "execute commandline parameters (must be present in .rc script)" ); + Cmd_AddCommand( "apropos", Cmd_Apropos_f, "lists all console variables/commands/aliases containing the specified string in the name or description" ); #ifndef XASH_DEDICATED Cmd_AddCommand( "cmd", Cmd_ForwardToServer, "send a console commandline to the server" ); #endif