#pragma once// Command buffer and command execution/* * Any number of commands can be added in a frame, from several different sources. * Most commands come from either keybindings or console line input, but remote * servers can also send across commands and entire text files can be execed. * * The + command line options are also added to the command buffer. * * The game starts with a Cbuf_AddText("exec quake.rc\n"); Cbuf_Execute(); *//* * Command execution takes a null terminated string, breaks it into tokens, * then searches for a command or variable that matches the first token. * * Commands can come from three sources, but the handler functions may choose * to dissallow the action or forward it to a remote server if the source is * not apropriate. */typedef struct cmd_t cmd_t;typedef void (*cmdfun_t)(cmd_t *cmd);struct cmd_t { char *name; char *_dummy; bool _dummy2; bool hidden; cmdfun_t f; char *alias;};#define iscmd(p) (((cmd_t *)(p))->_dummy == nil)#define ishidden(p) \ (((cmd_t *)(p))->hidden) // both cmds and cvars have the same first three fieldstypedef enum { src_client, // came in over a net connection as a clc_stringcmd // host_client will be valid during this state. src_command, // from the command buffer} cmd_source_t;extern cmd_source_t cmd_source;void Cmd_Init(void);// called by the init functions of other parts of the program to// register commands and functions to call for them.// The cmd_name is referenced later, so it should not be in temp memorycmd_t *Cmd_AddCommand(char *cmd_name, cmdfun_t f);// used by the cvar code to check for cvar / command name overlapbool Cmd_Exists(char *cmd_name);// attempts to match a partial command for automatic command line completion// returns NULL if nothing fitschar *Cmd_CompleteCommand(char *partial);// The functions that execute commands get their parameters with these// functions. Cmd_Argv () will return an empty string, not a NULL// if arg > argc, so string operations are always safe.int Cmd_Argc(void);const char *Cmd_Argv(int arg);const char *Cmd_Args(void);// Parses a single line of text into arguments and tries to execute it.// The text can come from the command buffer, a remote client, or stdin.void Cmd_ExecuteString(const char *text, cmd_source_t src);// adds the current command line as a clc_stringcmd to the client message.// things like godmode, noclip, etc, are commands directed to the server,// so when they are typed in at the console, they will need to be forwarded.void Cmd_ForwardToServer(cmd_t *c);// allocates an initial text buffer that will grow as neededvoid Cbuf_Init(void);// as new commands are generated from the console or keybindings,// the text is added to the end of the command buffer.void Cbuf_AddText(const char *text);// when a command wants to issue other commands immediately, the text is// inserted at the beginning of the buffer, before any remaining unexecuted// commands.void Cbuf_InsertText(const char *text);// Pulls off \n terminated lines of text from the command buffer and sends// them through Cmd_ExecuteString. Stops when the buffer is empty.// Normally called once per frame, but may be explicitly invoked.// Do not call inside a command function!void Cbuf_Execute(void);
#pragma once
// Command buffer and command execution
/*
* Any number of commands can be added in a frame, from several different sources.
* Most commands come from either keybindings or console line input, but remote
* servers can also send across commands and entire text files can be execed.
*
* The + command line options are also added to the command buffer.
*
* The game starts with a Cbuf_AddText("exec quake.rc\n"); Cbuf_Execute();
*/
/*
* Command execution takes a null terminated string, breaks it into tokens,
* then searches for a command or variable that matches the first token.
*
* Commands can come from three sources, but the handler functions may choose
* to dissallow the action or forward it to a remote server if the source is
* not apropriate.
*/
typedef struct cmd_t cmd_t;
typedef void (*cmdfun_t)(cmd_t *cmd);
struct cmd_t {
char *name;
char *_dummy;
bool _dummy2;
bool hidden;
cmdfun_t f;
char *alias;
};
#define iscmd(p) (((cmd_t *)(p))->_dummy == nil)
#define ishidden(p) \
(((cmd_t *)(p))->hidden) // both cmds and cvars have the same first three fields
typedef enum {
src_client, // came in over a net connection as a clc_stringcmd
// host_client will be valid during this state.
src_command, // from the command buffer
} cmd_source_t;
extern cmd_source_t cmd_source;
void Cmd_Init(void);
// called by the init functions of other parts of the program to
// register commands and functions to call for them.
// The cmd_name is referenced later, so it should not be in temp memory
cmd_t *Cmd_AddCommand(char *cmd_name, cmdfun_t f);
// used by the cvar code to check for cvar / command name overlap
bool Cmd_Exists(char *cmd_name);
// attempts to match a partial command for automatic command line completion
// returns NULL if nothing fits
char *Cmd_CompleteCommand(char *partial);
// The functions that execute commands get their parameters with these
// functions. Cmd_Argv () will return an empty string, not a NULL
// if arg > argc, so string operations are always safe.
int Cmd_Argc(void);
const char *Cmd_Argv(int arg);
const char *Cmd_Args(void);
// Parses a single line of text into arguments and tries to execute it.
// The text can come from the command buffer, a remote client, or stdin.
void Cmd_ExecuteString(const char *text, cmd_source_t src);
// adds the current command line as a clc_stringcmd to the client message.
// things like godmode, noclip, etc, are commands directed to the server,
// so when they are typed in at the console, they will need to be forwarded.
void Cmd_ForwardToServer(cmd_t *c);
// allocates an initial text buffer that will grow as needed
void Cbuf_Init(void);
// as new commands are generated from the console or keybindings,
// the text is added to the end of the command buffer.
void Cbuf_AddText(const char *text);
// when a command wants to issue other commands immediately, the text is
// inserted at the beginning of the buffer, before any remaining unexecuted
// commands.
void Cbuf_InsertText(const char *text);
// Pulls off \n terminated lines of text from the command buffer and sends
// them through Cmd_ExecuteString. Stops when the buffer is empty.
// Normally called once per frame, but may be explicitly invoked.
// Do not call inside a command function!
void Cbuf_Execute(void);