cmd.c
来自「quake1 dos源代码最新版本」· C语言 代码 · 共 979 行 · 第 1/2 页
C
979 行
Cmd_AddCommand ("echo",Cmd_Echo_f);
Cmd_AddCommand ("alias",Cmd_Alias_f);
Cmd_AddCommand ("cmd", Cmd_ForwardToServer);
Cmd_AddCommand ("wait", Cmd_Wait_f);
Cmd_AddCommand ("cmdlist", Cmd_List_f); // 2000-01-09 CmdList command by Maddes
}
/*
============
Cmd_Argc
============
*/
int Cmd_Argc (void)
{
return cmd_argc;
}
/*
============
Cmd_Argv
============
*/
char *Cmd_Argv (int arg)
{
if ( (unsigned)arg >= cmd_argc )
return cmd_null_string;
return cmd_argv[arg];
}
/*
============
Cmd_Args
============
*/
char *Cmd_Args (void)
{
return cmd_args;
}
/*
============
Cmd_TokenizeString
Parses the given string into command line tokens.
============
*/
void Cmd_TokenizeString (char *text)
{
int i;
// clear the args from the last string
for (i=0 ; i<cmd_argc ; i++)
Z_Free (mainzone, cmd_argv[i]); // 2001-09-20 Enhanced zone handling by Maddes
cmd_argc = 0;
cmd_args = NULL;
while (1)
{
// skip whitespace up to a /n
while (*text && *text <= ' ' && *text != '\n')
{
text++;
}
if (*text == '\n')
{ // a newline seperates commands in the buffer
text++;
break;
}
if (!*text)
return;
if (cmd_argc == 1)
cmd_args = text;
text = COM_Parse (text);
if (!text)
return;
if (cmd_argc < MAX_ARGS)
{
cmd_argv[cmd_argc] = Z_Malloc (mainzone, strlen(com_token)+1); // 2001-09-20 Enhanced zone handling by Maddes
strcpy (cmd_argv[cmd_argc], com_token);
cmd_argc++;
}
}
}
/*
============
Cmd_AddCommand
============
*/
void Cmd_AddCommand (char *cmd_name, xcommand_t function)
{
cmd_function_t *cmd;
if (host_initialized) // because hunk allocation would get stomped
Sys_Error ("Cmd_AddCommand after host_initialized");
// 2001-09-18 New cvar system by Maddes start
/*
// fail if the command is a variable name
if (Cvar_VariableString(cmd_name)[0])
{
Con_Printf ("Cmd_AddCommand: %s already defined as a var\n", cmd_name);
return;
}
*/
// 2001-09-18 New cvar system by Maddes end
// fail if the command already exists
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
{
if (!Q_strcasecmp (cmd_name, cmd->name))
{
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;
}
/*
============
Cmd_Exists
============
*/
qboolean Cmd_Exists (char *cmd_name)
{
cmd_function_t *cmd;
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
{
if (!Q_strcasecmp (cmd_name,cmd->name)) // 2001-09-16 New BuiltIn Function: cmd_find() by Maddes
return true;
}
return false;
}
/*
============
Cmd_CompleteCommand
============
*/
char *Cmd_CompleteCommand (char *partial)
{
cmd_function_t *cmd;
int len;
len = strlen(partial);
if (!len)
return NULL;
// check functions
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
if (!Q_strncasecmp (partial,cmd->name, len))
return cmd->name;
// 2001-12-15 Enhanced console command completion by Fett/Maddes start
/*
// 2001-12-15 Tab Completion of Alias Commands by Shelob start
// check aliases
cmdalias_t *a;
for (a=cmd_alias ; a ; a=a->next)
if (!Q_strncasecmp (partial, a->name, len))
return a->name;
// 2001-12-15 Tab Completion of Alias Commands by Shelob end
*/
// 2001-12-15 Enhanced console command completion by Fett/Maddes end
return NULL;
}
// 2001-12-15 Enhanced console command completion by Fett/Maddes start
/*
============
Pad_CompletePrint
Formats a string for completion lists: 19 chars of string and a space
If string is smaller than 19 chars it is padded with spaces, if it is bigger
then the 19th char is replaced with an asterik (*)
============
*/
char *Pad_CompletePrint(char *input)
{
static char sout[21];
int len;
len = strlen(input);
if (len > 19)
{
strncpy(sout, input, 18);
sout[18] = '*';
}
else
{
strcpy(sout, input);
// Pad with spaces
for (; len<19;)
{
sout[len++] = ' ';
sout[len] = 0;
}
}
sout[19] = ' ';
sout[20] = 0;
return sout;
}
/*
============
Cmd_CompleteCountPossible
============
*/
int Cmd_CompleteCountPossible (char *partial)
{
cmd_function_t *cmd;
int len;
int h;
h=0;
len = strlen(partial);
if (!len)
return 0;
// Loop through the command list and count all partial matches
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
if (!Q_strncasecmp (partial,cmd->name, len))
h++;
return h;
}
/*
============
Cmd_CompletePrintPossible
============
*/
void Cmd_CompletePrintPossible (char *partial)
{
cmd_function_t *cmd;
int len;
int maxcnt, cnt;
int con_linewidth;
char *sout;
len = strlen(partial);
// Determine the width of the console - 1
con_linewidth = (vid.width >> 3) - 3;
maxcnt = con_linewidth / 20; // entries per line
cnt = 0;
// Loop through the command list and print all matches
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
{
if (!Q_strncasecmp (partial,cmd->name, len))
{
sout = Pad_CompletePrint(cmd->name);
Con_Printf ("%s", sout);
cnt++;
if (cnt >= maxcnt)
{
cnt = 0;
Con_Printf ("\n");
}
}
}
if (cnt)
{
Con_Printf ("\n");
}
Con_Printf ("\n");
}
/*
============
Cmd_CompleteAlias
============
*/
char *Cmd_CompleteAlias (char *partial)
{
cmdalias_t *alias;
int len;
len = strlen(partial);
if (!len)
return NULL;
// check aliases
for (alias=cmd_alias ; alias ; alias=alias->next)
if (!Q_strncasecmp (partial,alias->name, len))
return alias->name;
return NULL;
}
/*
============
Cmd_CompleteAliasCountPossible
============
*/
int Cmd_CompleteAliasCountPossible (char *partial)
{
cmdalias_t *alias;
int len;
int h;
h=0;
len = strlen(partial);
if (!len)
return 0;
// Loop through the command list and count all partial matches
for (alias=cmd_alias ; alias ; alias=alias->next)
if (!Q_strncasecmp (partial,alias->name, len))
h++;
return h;
}
/*
============
Cmd_CompleteAliasPrintPossible
============
*/
void Cmd_CompleteAliasPrintPossible (char *partial)
{
cmdalias_t *alias;
int len;
int maxcnt, cnt;
int con_linewidth;
char *sout;
len = strlen(partial);
// Determine the width of the console -1
con_linewidth = (vid.width >> 3) - 3;
maxcnt = con_linewidth / 20; // entries per line
cnt = 0;
// Loop through the alias list and print all matches
for (alias=cmd_alias ; alias ; alias=alias->next)
{
if (!Q_strncasecmp (partial,alias->name, len))
{
sout = Pad_CompletePrint(alias->name);
Con_Printf ("%s", sout);
cnt++;
if (cnt >= maxcnt)
{
cnt = 0;
Con_Printf ("\n");
}
}
}
if (cnt)
{
Con_Printf ("\n");
}
Con_Printf ("\n");
}
// 2001-12-15 Enhanced console command completion by Fett/Maddes end
/*
============
Cmd_ExecuteString
A complete command line has been parsed, so try to execute it
FIXME: lookupnoadd the token to speed search?
============
*/
void Cmd_ExecuteString (char *text, cmd_source_t src)
{
cmd_function_t *cmd;
cmdalias_t *a;
cmd_source = src;
Cmd_TokenizeString (text);
// execute the command line
if (!Cmd_Argc())
return; // no tokens
// check functions
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
{
if (!Q_strcasecmp (cmd_argv[0],cmd->name))
{
cmd->function ();
return;
}
}
// check alias
for (a=cmd_alias ; a ; a=a->next)
{
if (!Q_strcasecmp (cmd_argv[0], a->name))
{
Cbuf_InsertText (a->value);
return;
}
}
// check cvars
if (!Cvar_Command ())
Con_Printf ("Unknown command \"%s\"\n", Cmd_Argv(0));
}
/*
===================
Cmd_ForwardToServer
Sends the entire command line over to the server
===================
*/
void Cmd_ForwardToServer (void)
{
if (cls.state != ca_connected)
{
Con_Printf ("Can't \"%s\", not connected\n", Cmd_Argv(0));
return;
}
if (cls.demoplayback)
return; // not really connected
MSG_WriteByte (&cls.message, clc_stringcmd);
if (Q_strcasecmp(Cmd_Argv(0), "cmd") != 0)
{
SZ_Print (&cls.message, Cmd_Argv(0));
SZ_Print (&cls.message, " ");
}
if (Cmd_Argc() > 1)
SZ_Print (&cls.message, Cmd_Args());
else
SZ_Print (&cls.message, "\n");
}
/*
================
Cmd_CheckParm
Returns the position (1 to argc-1) in the command's argument list
where the given parameter apears, or 0 if not present
================
*/
int Cmd_CheckParm (char *parm)
{
int i;
if (!parm)
Sys_Error ("Cmd_CheckParm: NULL");
for (i = 1; i < Cmd_Argc (); i++)
if (! Q_strcasecmp (parm, Cmd_Argv (i)))
return i;
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?