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 + -
显示快捷键?