23 cmd_handler_t function;
27 /* The list of cmds */
28 static cmd_t *cmd_list = NULL;
31 #define ALIAS_NAME_MAX 32
32 typedef struct cmd_alias_s
34 char name[ALIAS_NAME_MAX];
36 struct cmd_alias_s *next;
39 /* The list of aliases */
40 static cmd_alias_t *cmd_alias_list = NULL;
43 /* The list of keybindings */
44 static char *cmd_keybinding_list[256];
47 /* add a new console command */
48 void cmd_addcommand(char *cmd_name, cmd_handler_t cmd_func)
52 Assert(cmd_name != NULL);
54 for (cmd = cmd_list; cmd; cmd = cmd->next) {
55 if (!stricmp(cmd_name, cmd->name))
58 con_printf(CON_NORMAL, "command %s already exists, not adding\n", cmd_name);
63 /* create command, insert at front of list */
64 MALLOC(cmd, cmd_t, 1);
66 cmd->function = cmd_func;
72 /* execute a parsed command */
73 void cmd_execute(int argc, char **argv)
78 for (cmd = cmd_list; cmd; cmd = cmd->next) {
79 if (!stricmp(argv[0], cmd->name))
80 return cmd->function(argc, argv);
83 for (alias = cmd_alias_list; alias; alias = alias->next) {
84 if (!stricmp(argv[0], alias->name))
85 return cmd_parse(alias->value);
89 if (argc > 1) // set value of cvar
90 cvar_set(argv[0], argv[1]);
91 con_printf(CON_NORMAL, "%s: %f\n", argv[0], cvar(argv[0]));
95 /* Parse an input string */
96 void cmd_parse(char *input)
98 char buffer[CMD_MAX_LENGTH];
99 char *tokens[CMD_MAX_TOKENS];
103 Assert(input != NULL);
105 /* Strip leading spaces */
106 for (i=0; isspace(input[i]); i++) ;
107 strncpy( buffer, &input[i], CMD_MAX_LENGTH );
109 //printf("lead strip \"%s\"\n",buffer);
111 /* If command is empty, give up */
114 /* Strip trailing spaces */
115 for (i=l-1; i>0 && isspace(buffer[i]); i--) ;
117 //printf("trail strip \"%s\"\n",buffer);
119 /* Split into tokens */
124 for (i=1; i<l; i++) {
125 if (isspace(buffer[i])) {
127 while (isspace(buffer[i+1]) && (i+1 < l)) i++;
128 tokens[num_tokens++] = &buffer[i+1];
132 /* Check for matching commands */
133 cmd_execute(num_tokens, tokens);
137 int cmd_handle_keybinding(unsigned char key)
139 if (cmd_keybinding_list[key]) {
140 cmd_parse(cmd_keybinding_list[key]);
149 void cmd_alias(int argc, char **argv)
152 char buf[CMD_MAX_LENGTH] = "";
157 con_printf(CON_NORMAL, "aliases:\n");
158 for (alias = cmd_alias_list; alias; alias = alias->next)
159 con_printf(CON_NORMAL, "%s: %s\n", alias->name, alias->value);
163 for (i = 2; i < argc; i++) {
165 strncat(buf, " ", CMD_MAX_LENGTH);
166 strncat(buf, argv[i], CMD_MAX_LENGTH);
169 for (alias = cmd_alias_list; alias; alias = alias->next) {
170 if (!stricmp(argv[1], alias->name))
172 d_free(alias->value);
173 alias->value = d_strdup(buf);
178 MALLOC(alias, cmd_alias_t, 1);
179 strncpy(alias->name, argv[1], ALIAS_NAME_MAX);
180 alias->value = d_strdup(buf);
181 alias->next = cmd_alias_list;
182 cmd_alias_list = alias;
186 /* FIXME: key_text is not really adequate for this */
187 void cmd_bind(int argc, char **argv)
189 char buf[CMD_MAX_LENGTH] = "";
190 unsigned char key = 0;
195 con_printf(CON_NORMAL, "key bindings:\n");
196 for (i = 0; i < 256; i++) {
197 if (!cmd_keybinding_list[i])
199 con_printf(CON_NORMAL, "%s: %s\n", key_text[i], cmd_keybinding_list[i]);
204 for (i = 2; i < argc; i++) {
206 strncat(buf, " ", CMD_MAX_LENGTH);
207 strncat(buf, argv[i], CMD_MAX_LENGTH);
210 for (i = 0; i < 256; i++) {
211 if (!stricmp(argv[1], key_text[i])) {
218 con_printf(CON_CRITICAL, "bind: key %s not found\n", argv[1]);
222 if (cmd_keybinding_list[key])
223 d_free(cmd_keybinding_list[key]);
224 cmd_keybinding_list[key] = d_strdup(buf);
228 int Console_button_states[CMD_NUM_BUTTONS];
229 void cmd_attack_on(int argc, char **argv) { Console_button_states[CMD_ATTACK] = 1; }
230 void cmd_attack_off(int argc, char **argv) { Console_button_states[CMD_ATTACK] = 0; }
231 void cmd_attack2_on(int argc, char **argv) { Console_button_states[CMD_ATTACK2] = 1; }
232 void cmd_attack2_off(int argc, char **argv) { Console_button_states[CMD_ATTACK2] = 0; }
235 void cmd_impulse(int argc, char**argv) {
238 int n = atoi(argv[1]);
239 if (n >= 1 && n <= 20) {
240 select_weapon((n-1) % 10, (n-1) / 10, 0, 1);
244 /* echo to console */
245 void cmd_echo(int argc, char **argv) {
246 char buf[CMD_MAX_LENGTH] = "";
248 for (i = 1; i < argc; i++) {
250 strncat(buf, " ", CMD_MAX_LENGTH);
251 strncat(buf, argv[i], CMD_MAX_LENGTH);
253 con_printf(CON_NORMAL, "%s\n", buf);
257 void cmd_exec(int argc, char **argv) {
259 char buf[CMD_MAX_LENGTH] = "";
263 f = PHYSFSX_openReadBuffered(argv[1]);
265 con_printf(CON_CRITICAL, "exec: %s not found\n", argv[1]);
268 while (PHYSFSX_gets(f, buf)) {
283 p = ((cmd_t *)p)->next;
289 d_free(((cmd_alias_t *)p)->value);
291 p = ((cmd_alias_t *)p)->next;
295 for (i = 0; i < 256; i++)
296 if (cmd_keybinding_list[i])
297 d_free(cmd_keybinding_list[i]);
302 memset(Console_button_states, 0, sizeof(int) * CMD_NUM_BUTTONS);
304 cmd_addcommand("alias", cmd_alias);
305 cmd_addcommand("bind", cmd_bind);
307 cmd_addcommand("+attack", cmd_attack_on);
308 cmd_addcommand("-attack", cmd_attack_off);
309 cmd_addcommand("+attack2", cmd_attack2_on);
310 cmd_addcommand("-attack2", cmd_attack2_off);
312 cmd_addcommand("impulse", cmd_impulse);
314 cmd_addcommand("echo", cmd_echo);
316 cmd_addcommand("exec", cmd_exec);