forked from QW-Group/ezquake-source
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cmd.h
227 lines (166 loc) · 7.25 KB
/
cmd.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
/*
Copyright (C) 1996-1997 Id Software, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// cmd.h -- 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 ();
*/
typedef struct cbuf_s {
char *text_buf;
int maxsize;
int text_start;
int text_end;
qbool wait;
int waitCount;
int runAwayLoop;
} cbuf_t;
extern cbuf_t cbuf_main;
extern cbuf_t cbuf_safe; // msg_trigger commands
extern cbuf_t cbuf_formatted_comms;
extern cbuf_t cbuf_svc; // svc_stufftext commands
extern cbuf_t cbuf_server; // mod commands
extern cbuf_t *cbuf_current;
void Cbuf_AddTextEx (cbuf_t *cbuf, const char *text);
void Cbuf_InsertTextEx (cbuf_t *cbuf, const char *text);
void Cbuf_ExecuteEx (cbuf_t *cbuf);
void Cbuf_Init (void);
// allocates an initial text buffer that will grow as needed
void Cbuf_AddText (const char *text);
// as new commands are generated from the console or keybindings,
// the text is added to the end of the command buffer.
void Cbuf_InsertText (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_Execute (void);
// 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!
//===========================================================================
/*
Command execution takes a null terminated string, breaks it into tokens,
then searches for a command or variable that matches the first token.
*/
typedef void (*xcommand_t) (void);
typedef struct cmd_function_s {
struct cmd_function_s *hash_next;
struct cmd_function_s *next;
char *name;
xcommand_t function;
qbool zmalloced;
} cmd_function_t;
void Cmd_Init (void);
void Cmd_Shutdown (void);
void Cmd_AddCommand (char *cmd_name, xcommand_t function);
// 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
// if function is NULL, the command will be forwarded to the server
// as a clc_stringcmd instead of executed locally
// plugins use it; command is Q_malloced, name is stored within the same memory piece
qbool Cmd_AddRemCommand (char *cmd_name, xcommand_t function);
// only used by plugins, other commands stay in the client forever
void Cmd_RemoveCommand (char *cmd_name);
qbool Cmd_Exists (char *cmd_name);
// used by the cvar code to check for cvar / command name overlap
cmd_function_t *Cmd_FindCommand (const char *cmd_name); // for message triggers
char *Cmd_CompleteCommand (char *partial);
// attempts to match a partial command for automatic command line completion
// returns NULL if nothing fits
#define MAX_ARGS 80
typedef struct tokenizecontext_s
{
int cmd_argc; // arguments count
char *cmd_argv[MAX_ARGS]; // links to argv_buf[]
// FIXME: MAX_COM_TOKEN not defined here, need redesign headers or something
char argv_buf[/*MAX_COM_TOKEN*/ 1024]; // here we store data for *cmd_argv[]
char cmd_args[/*MAX_COM_TOKEN*/ 1024 * 2]; // here we store original of what we parse, from argv(1) to argv(argc() - 1)
char text[/*MAX_COM_TOKEN*/ 1024]; // this is used/overwrite each time we using Cmd_MakeArgs()
} tokenizecontext_t;
int Cmd_ArgcEx (tokenizecontext_t *ctx);
char *Cmd_ArgvEx (tokenizecontext_t *ctx, int arg);
//Returns a single string containing argv(1) to argv(argc() - 1)
char *Cmd_ArgsEx (tokenizecontext_t *ctx);
//Returns a single string containing argv(start) to argv(argc() - 1)
//Unlike Cmd_Args, shrinks spaces between argvs
char *Cmd_MakeArgsEx (tokenizecontext_t *ctx, int start);
//Parses the given string into command line tokens.
void Cmd_TokenizeStringEx (tokenizecontext_t *ctx, char *text);
int Cmd_Argc (void);
char *Cmd_Argv (int arg);
char *Cmd_Args (void);
char *Cmd_MakeArgs (int start);
// save cmd_tokenizecontext struct to ctx
void Cmd_SaveContext(tokenizecontext_t *ctx);
// restore cmd_tokenizecontext struct from ctx
void Cmd_RestoreContext(tokenizecontext_t *ctx);
// 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.
void Cmd_ExpandString (const char *data, char *dest);
// Expands all $cvar or $macro expressions.
// dest should point to a 1024-byte buffer
void Cmd_TokenizeString (char *text);
// Takes a null terminated string. Does not need to be /n terminated.
// breaks the string up into arg tokens.
void Cmd_ExecuteString (char *text);
// Parses a single line of text into arguments and tries to execute it
// as if it was typed at the console
void Cmd_ForwardToServer (void);
// 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 Cbuf_AddEarlyCommands (void);
void Cmd_StuffCmds_f (void);
qbool Cmd_IsLegacyCommand (char *oldname);
void Cmd_AddLegacyCommand (char *oldname, char *newname);
//===========================================================================
#define MAX_ALIAS_NAME 32
#define ALIAS_ARCHIVE 1
#define ALIAS_SERVER 2
#define ALIAS_TEMP 4
#define ALIAS_HAS_PARAMETERS 8
#ifdef WITH_TCL
#define ALIAS_TCL 16
#endif
typedef struct cmd_alias_s {
struct cmd_alias_s *hash_next;
struct cmd_alias_s *next;
char name[MAX_ALIAS_NAME];
char *value;
int flags;
} cmd_alias_t;
qbool Cmd_DeleteAlias (char *name); // return true if successful
cmd_alias_t *Cmd_FindAlias (const char *name); // returns NULL on failure
char *Cmd_AliasString (char *name); // returns NULL on failure
void DeleteServerAliases (void);
#define MAX_MACRO_NAME 32
#define MACRO_NORULES -1
#define MACRO_ALLOWED 0
#define MACRO_DISALLOWED 1
typedef struct
{
char name[MAX_MACRO_NAME];
char *(*func) (void);
int teamplay;
} macro_command_t;
void Cmd_AddMacro (const char *s, char *(*f)(void));
void Cmd_AddMacroEx (const char *s, char *(*f) (void), int teamplay);
char *Cmd_MacroString (const char *s, int *macro_length);