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);
|
typedef void (*xcommand_t) (void);
|
||||||
|
|
||||||
|
void Cmd_Init_Hash (void);
|
||||||
void Cmd_Init (void);
|
void Cmd_Init (void);
|
||||||
void cl_Cmd_Init (void);
|
void cl_Cmd_Init (void);
|
||||||
|
|
||||||
|
|
|
@ -1641,6 +1641,7 @@ Host_Init (void)
|
||||||
host_parms.memsize / (float) 0x100000);
|
host_parms.memsize / (float) 0x100000);
|
||||||
|
|
||||||
Cvar_Init_Hash ();
|
Cvar_Init_Hash ();
|
||||||
|
Cmd_Init_Hash ();
|
||||||
Memory_Init (host_parms.membase, host_parms.memsize);
|
Memory_Init (host_parms.membase, host_parms.memsize);
|
||||||
Cvar_Init ();
|
Cvar_Init ();
|
||||||
Sys_Init_Cvars ();
|
Sys_Init_Cvars ();
|
||||||
|
|
102
source/cmd.c
102
source/cmd.c
|
@ -41,6 +41,7 @@
|
||||||
#include "cvar.h"
|
#include "cvar.h"
|
||||||
#include "cmd.h"
|
#include "cmd.h"
|
||||||
#include "console.h"
|
#include "console.h"
|
||||||
|
#include "hash.h"
|
||||||
#include "host.h"
|
#include "host.h"
|
||||||
#include "qargs.h"
|
#include "qargs.h"
|
||||||
#include "qendian.h"
|
#include "qendian.h"
|
||||||
|
@ -65,6 +66,9 @@ qboolean cmd_wait;
|
||||||
|
|
||||||
cvar_t *cl_warncmd;
|
cvar_t *cl_warncmd;
|
||||||
|
|
||||||
|
hashtab_t *cmd_alias_hash;
|
||||||
|
hashtab_t *cmd_hash;
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -452,19 +456,18 @@ Cmd_Alias_f (void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// if the alias allready exists, reuse it
|
// if the alias allready exists, reuse it
|
||||||
for (a = cmd_alias; a; a = a->next) {
|
a = (cmdalias_t*)Hash_Find (cmd_alias_hash, s);
|
||||||
if (!strcmp (s, a->name)) {
|
if (a) {
|
||||||
free (a->value);
|
free (a->value);
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!a) {
|
if (!a) {
|
||||||
a = calloc (1, sizeof (cmdalias_t));
|
a = calloc (1, sizeof (cmdalias_t));
|
||||||
a->next = cmd_alias;
|
a->next = cmd_alias;
|
||||||
cmd_alias = a;
|
cmd_alias = a;
|
||||||
|
strcpy (a->name, s);
|
||||||
|
Hash_Add (cmd_alias_hash, a);
|
||||||
}
|
}
|
||||||
strcpy (a->name, s);
|
|
||||||
|
|
||||||
// copy the rest of the command line
|
// copy the rest of the command line
|
||||||
cmd[0] = 0; // start out with a null string
|
cmd[0] = 0; // start out with a null string
|
||||||
|
@ -499,6 +502,7 @@ Cmd_UnAlias_f (void)
|
||||||
prev = cmd_alias;
|
prev = cmd_alias;
|
||||||
for (a = cmd_alias; a; a = a->next) {
|
for (a = cmd_alias; a; a = a->next) {
|
||||||
if (!strcmp (s, a->name)) {
|
if (!strcmp (s, a->name)) {
|
||||||
|
Hash_Del (cmd_alias_hash, s);
|
||||||
free (a->value);
|
free (a->value);
|
||||||
prev->next = a->next;
|
prev->next = a->next;
|
||||||
if (a == cmd_alias)
|
if (a == cmd_alias)
|
||||||
|
@ -634,9 +638,7 @@ Cmd_TokenizeString (char *text)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============
|
Cmd_AddCommand
|
||||||
Cmd_AddCommand
|
|
||||||
============
|
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
Cmd_AddCommand (char *cmd_name, xcommand_t function)
|
Cmd_AddCommand (char *cmd_name, xcommand_t function)
|
||||||
|
@ -647,17 +649,16 @@ Cmd_AddCommand (char *cmd_name, xcommand_t function)
|
||||||
// stomped
|
// stomped
|
||||||
Sys_Error ("Cmd_AddCommand after host_initialized");
|
Sys_Error ("Cmd_AddCommand after host_initialized");
|
||||||
|
|
||||||
// fail if the command is a variable name
|
// fail if the command is a variable name
|
||||||
if (Cvar_VariableString (cmd_name)[0]) {
|
if (Cvar_FindVar (cmd_name)) {
|
||||||
Con_Printf ("Cmd_AddCommand: %s already defined as a var\n", cmd_name);
|
Con_Printf ("Cmd_AddCommand: %s already defined as a var\n", cmd_name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// fail if the command already exists
|
// fail if the command already exists
|
||||||
for (cmd = cmd_functions; cmd; cmd = cmd->next) {
|
cmd = (cmd_function_t*)Hash_Find (cmd_hash, cmd_name);
|
||||||
if (!strcmp (cmd_name, cmd->name)) {
|
if (cmd) {
|
||||||
Con_Printf ("Cmd_AddCommand: %s already defined\n", cmd_name);
|
Con_Printf ("Cmd_AddCommand: %s already defined\n", cmd_name);
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd = Hunk_Alloc (sizeof (cmd_function_t));
|
cmd = Hunk_Alloc (sizeof (cmd_function_t));
|
||||||
|
@ -665,6 +666,7 @@ Cmd_AddCommand (char *cmd_name, xcommand_t function)
|
||||||
cmd->function = function;
|
cmd->function = function;
|
||||||
cmd->next = cmd_functions;
|
cmd->next = cmd_functions;
|
||||||
cmd_functions = cmd;
|
cmd_functions = cmd;
|
||||||
|
Hash_Add (cmd_hash, cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -677,9 +679,9 @@ Cmd_Exists (char *cmd_name)
|
||||||
{
|
{
|
||||||
cmd_function_t *cmd;
|
cmd_function_t *cmd;
|
||||||
|
|
||||||
for (cmd = cmd_functions; cmd; cmd = cmd->next) {
|
cmd = (cmd_function_t*)Hash_Find (cmd_hash, cmd_name);
|
||||||
if (!strcmp (cmd_name, cmd->name))
|
if (cmd) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -823,14 +825,13 @@ Cmd_ExecuteString (char *text)
|
||||||
return; // no tokens
|
return; // no tokens
|
||||||
|
|
||||||
// check functions
|
// check functions
|
||||||
for (cmd = cmd_functions; cmd; cmd = cmd->next) {
|
cmd = (cmd_function_t*)Hash_Find (cmd_hash, cmd_argv[0]);
|
||||||
if (!strcasecmp (cmd_argv[0], cmd->name)) {
|
if (cmd) {
|
||||||
if (!cmd->function)
|
if (!cmd->function)
|
||||||
Cmd_ForwardToServer ();
|
Cmd_ForwardToServer ();
|
||||||
else
|
else
|
||||||
cmd->function ();
|
cmd->function ();
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tonik: check cvars
|
// Tonik: check cvars
|
||||||
|
@ -838,16 +839,14 @@ Cmd_ExecuteString (char *text)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// check alias
|
// check alias
|
||||||
for (a = cmd_alias; a; a = a->next) {
|
a = (cmdalias_t*)Hash_Find (cmd_alias_hash, cmd_argv[0]);
|
||||||
if (!strcasecmp (cmd_argv[0], a->name)) {
|
if (a) {
|
||||||
Cbuf_InsertText (a->value);
|
Cbuf_InsertText (a->value);
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cl_warncmd->int_val || developer->int_val)
|
if (cl_warncmd->int_val || developer->int_val)
|
||||||
Con_Printf ("Unknown command \"%s\"\n", Cmd_Argv (0));
|
Con_Printf ("Unknown command \"%s\"\n", Cmd_Argv (0));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -888,6 +887,41 @@ Cmd_CmdList_f (void)
|
||||||
Con_Printf ("------------\n%d commands\n", i);
|
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
|
Cmd_Init
|
||||||
|
|
|
@ -1868,6 +1868,7 @@ SV_Init (void)
|
||||||
host_parms.memsize / (float) 0x100000);
|
host_parms.memsize / (float) 0x100000);
|
||||||
|
|
||||||
Cvar_Init_Hash ();
|
Cvar_Init_Hash ();
|
||||||
|
Cmd_Init_Hash ();
|
||||||
Memory_Init (host_parms.membase, host_parms.memsize);
|
Memory_Init (host_parms.membase, host_parms.memsize);
|
||||||
Cvar_Init ();
|
Cvar_Init ();
|
||||||
Sys_Init_Cvars ();
|
Sys_Init_Cvars ();
|
||||||
|
|
Loading…
Reference in a new issue