mirror of
https://git.code.sf.net/p/quake/newtree
synced 2025-03-13 03:33:28 +00:00
commands and aliases now use hash tables
This commit is contained in:
parent
57b02fad06
commit
dd5363cdb5
4 changed files with 71 additions and 34 deletions
|
@ -75,6 +75,7 @@ then searches for a command or variable that matches the first token.
|
|||
|
||||
typedef void (*xcommand_t) (void);
|
||||
|
||||
void Cmd_Init_Hash (void);
|
||||
void Cmd_Init (void);
|
||||
void cl_Cmd_Init (void);
|
||||
|
||||
|
|
|
@ -1641,6 +1641,7 @@ Host_Init (void)
|
|||
host_parms.memsize / (float) 0x100000);
|
||||
|
||||
Cvar_Init_Hash ();
|
||||
Cmd_Init_Hash ();
|
||||
Memory_Init (host_parms.membase, host_parms.memsize);
|
||||
Cvar_Init ();
|
||||
Sys_Init_Cvars ();
|
||||
|
|
80
source/cmd.c
80
source/cmd.c
|
@ -41,6 +41,7 @@
|
|||
#include "cvar.h"
|
||||
#include "cmd.h"
|
||||
#include "console.h"
|
||||
#include "hash.h"
|
||||
#include "host.h"
|
||||
#include "qargs.h"
|
||||
#include "qendian.h"
|
||||
|
@ -65,6 +66,9 @@ qboolean cmd_wait;
|
|||
|
||||
cvar_t *cl_warncmd;
|
||||
|
||||
hashtab_t *cmd_alias_hash;
|
||||
hashtab_t *cmd_hash;
|
||||
|
||||
//=============================================================================
|
||||
|
||||
/*
|
||||
|
@ -452,19 +456,18 @@ Cmd_Alias_f (void)
|
|||
return;
|
||||
}
|
||||
// if the alias allready exists, reuse it
|
||||
for (a = cmd_alias; a; a = a->next) {
|
||||
if (!strcmp (s, a->name)) {
|
||||
a = (cmdalias_t*)Hash_Find (cmd_alias_hash, s);
|
||||
if (a) {
|
||||
free (a->value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!a) {
|
||||
a = calloc (1, sizeof (cmdalias_t));
|
||||
a->next = cmd_alias;
|
||||
cmd_alias = a;
|
||||
}
|
||||
strcpy (a->name, s);
|
||||
Hash_Add (cmd_alias_hash, a);
|
||||
}
|
||||
|
||||
// copy the rest of the command line
|
||||
cmd[0] = 0; // start out with a null string
|
||||
|
@ -499,6 +502,7 @@ Cmd_UnAlias_f (void)
|
|||
prev = cmd_alias;
|
||||
for (a = cmd_alias; a; a = a->next) {
|
||||
if (!strcmp (s, a->name)) {
|
||||
Hash_Del (cmd_alias_hash, s);
|
||||
free (a->value);
|
||||
prev->next = a->next;
|
||||
if (a == cmd_alias)
|
||||
|
@ -634,9 +638,7 @@ Cmd_TokenizeString (char *text)
|
|||
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_AddCommand
|
||||
============
|
||||
Cmd_AddCommand
|
||||
*/
|
||||
void
|
||||
Cmd_AddCommand (char *cmd_name, xcommand_t function)
|
||||
|
@ -647,24 +649,24 @@ Cmd_AddCommand (char *cmd_name, xcommand_t function)
|
|||
// stomped
|
||||
Sys_Error ("Cmd_AddCommand after host_initialized");
|
||||
|
||||
// fail if the command is a variable name
|
||||
if (Cvar_VariableString (cmd_name)[0]) {
|
||||
// fail if the command is a variable name
|
||||
if (Cvar_FindVar (cmd_name)) {
|
||||
Con_Printf ("Cmd_AddCommand: %s already defined as a var\n", cmd_name);
|
||||
return;
|
||||
}
|
||||
// fail if the command already exists
|
||||
for (cmd = cmd_functions; cmd; cmd = cmd->next) {
|
||||
if (!strcmp (cmd_name, cmd->name)) {
|
||||
// fail if the command already exists
|
||||
cmd = (cmd_function_t*)Hash_Find (cmd_hash, cmd_name);
|
||||
if (cmd) {
|
||||
Con_Printf ("Cmd_AddCommand: %s already defined\n", cmd_name);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
cmd = Hunk_Alloc (sizeof (cmd_function_t));
|
||||
cmd->name = cmd_name;
|
||||
cmd->function = function;
|
||||
cmd->next = cmd_functions;
|
||||
cmd_functions = cmd;
|
||||
Hash_Add (cmd_hash, cmd);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -677,8 +679,8 @@ Cmd_Exists (char *cmd_name)
|
|||
{
|
||||
cmd_function_t *cmd;
|
||||
|
||||
for (cmd = cmd_functions; cmd; cmd = cmd->next) {
|
||||
if (!strcmp (cmd_name, cmd->name))
|
||||
cmd = (cmd_function_t*)Hash_Find (cmd_hash, cmd_name);
|
||||
if (cmd) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -823,31 +825,28 @@ Cmd_ExecuteString (char *text)
|
|||
return; // no tokens
|
||||
|
||||
// check functions
|
||||
for (cmd = cmd_functions; cmd; cmd = cmd->next) {
|
||||
if (!strcasecmp (cmd_argv[0], cmd->name)) {
|
||||
cmd = (cmd_function_t*)Hash_Find (cmd_hash, cmd_argv[0]);
|
||||
if (cmd) {
|
||||
if (!cmd->function)
|
||||
Cmd_ForwardToServer ();
|
||||
else
|
||||
cmd->function ();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Tonik: check cvars
|
||||
if (Cvar_Command ())
|
||||
return;
|
||||
|
||||
// check alias
|
||||
for (a = cmd_alias; a; a = a->next) {
|
||||
if (!strcasecmp (cmd_argv[0], a->name)) {
|
||||
a = (cmdalias_t*)Hash_Find (cmd_alias_hash, cmd_argv[0]);
|
||||
if (a) {
|
||||
Cbuf_InsertText (a->value);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (cl_warncmd->int_val || developer->int_val)
|
||||
Con_Printf ("Unknown command \"%s\"\n", Cmd_Argv (0));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -888,6 +887,41 @@ Cmd_CmdList_f (void)
|
|||
Con_Printf ("------------\n%d commands\n", i);
|
||||
}
|
||||
|
||||
static void
|
||||
cmd_alias_free (void *_a)
|
||||
{
|
||||
cmdalias_t *a = (cmdalias_t*)_a;
|
||||
free (a->value);
|
||||
free (a);
|
||||
}
|
||||
|
||||
static char *
|
||||
cmd_alias_get_key (void *_a)
|
||||
{
|
||||
cmdalias_t *a = (cmdalias_t*)_a;
|
||||
return a->name;
|
||||
}
|
||||
|
||||
static char *
|
||||
cmd_get_key (void *c)
|
||||
{
|
||||
cmd_function_t *cmd = (cmd_function_t*)c;
|
||||
return cmd->name;
|
||||
}
|
||||
|
||||
/*
|
||||
Cmd_Init_Hash
|
||||
|
||||
initialise the command and alias hash tables
|
||||
*/
|
||||
|
||||
void
|
||||
Cmd_Init_Hash (void)
|
||||
{
|
||||
cmd_hash = Hash_NewTable (1021, cmd_get_key, 0);
|
||||
cmd_alias_hash = Hash_NewTable (1021, cmd_alias_get_key, cmd_alias_free);
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_Init
|
||||
|
|
|
@ -1868,6 +1868,7 @@ SV_Init (void)
|
|||
host_parms.memsize / (float) 0x100000);
|
||||
|
||||
Cvar_Init_Hash ();
|
||||
Cmd_Init_Hash ();
|
||||
Memory_Init (host_parms.membase, host_parms.memsize);
|
||||
Cvar_Init ();
|
||||
Sys_Init_Cvars ();
|
||||
|
|
Loading…
Reference in a new issue