#include "../qcommon/exe_headers.h" #define CMD_MAX_NUM 512 #define CMD_MAX_NAME 32 typedef struct cmd_function_s { char name[CMD_MAX_NAME]; xcommand_t function; } cmd_function_t; static cmd_function_t cmd_functions[CMD_MAX_NUM] = {0}; // possible commands to execute /* ============ Cmd_AddCommand ============ */ void Cmd_AddCommand( const char *cmd_name, xcommand_t function ) { cmd_function_t *cmd; cmd_function_t *add = NULL; int i; // fail if the command already exists for (i=0; iname ) ) { // allow completion-only commands to be silently doubled if ( function != NULL ) { Com_Printf ("Cmd_AddCommand: %s already defined\n", cmd_name); } return; } if(add == NULL && cmd->name[0] == 0) { add = cmd; } } if(!add) { Com_Printf("Cmd_AddCommand: Too many commands registered\n"); return; } if(strlen(cmd_name) >= CMD_MAX_NAME - 1) { Com_Printf("Cmd_AddCommand: Excessively long command name\n"); } else { Q_strncpyz(add->name, cmd_name, CMD_MAX_NAME); add->function = function; } } /* ============ Cmd_RemoveCommand ============ */ void Cmd_RemoveCommand( const char *cmd_name ) { cmd_function_t *cmd; int i; for(i=0; iname ) ) { cmd->name[0] = 0; return; } } } /* ============ Cmd_ExecuteString A complete command line has been parsed, so try to execute it ============ */ void Cmd_ExecuteString( const char *text ) { int i; // execute the command line Cmd_TokenizeString( text ); if ( !Cmd_Argc() ) { return; // no tokens } // check registered command functions for(i=0; iinteger && CL_GameCommand() ) { return; } // check server game commands if ( com_sv_running && com_sv_running->integer && SV_GameCommand() ) { return; } // check ui commands if ( com_cl_running && com_cl_running->integer && UI_GameCommand() ) { return; } // send it as a server command if we are connected // this will usually result in a chat message //CL_ForwardCommandToServer ( text ); CL_ForwardCommandToServer ( text ); } /* ============ Cmd_List_f ============ */ void Cmd_List_f (void) { cmd_function_t *cmd; int i; char *match; if ( Cmd_Argc() > 1 ) { match = Cmd_Argv( 1 ); } else { match = NULL; } i = 0; for(int c=0; cname, qfalse)) continue; Com_Printf ("%s\n", cmd->name); i++; } Com_Printf ("%i commands\n", i); }