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 typedef struct cmd_queue_s
75 struct cmd_queue_s *next;
78 /* The list of commands to be executed */
79 static cmd_queue_t *cmd_queue_head = NULL;
80 static cmd_queue_t *cmd_queue_tail = NULL;
83 /* execute a parsed command */
84 void cmd_execute(int argc, char **argv)
89 for (cmd = cmd_list; cmd; cmd = cmd->next) {
90 if (!stricmp(argv[0], cmd->name))
91 return cmd->function(argc, argv);
94 for (alias = cmd_alias_list; alias; alias = alias->next) {
95 if (!stricmp(argv[0], alias->name)) {
96 cmd_insert(alias->value);
97 cmd_parse(alias->value);
103 if (argc > 1) // set value of cvar
104 cvar_set(argv[0], argv[1]);
105 con_printf(CON_NORMAL, "%s: %f\n", argv[0], cvar(argv[0]));
109 /* Parse an input string */
110 void cmd_parse(char *input)
112 char buffer[CMD_MAX_LENGTH];
113 char *tokens[CMD_MAX_TOKENS];
118 Assert(input != NULL);
120 /* Strip leading spaces */
121 for (i=0; isspace(input[i]); i++) ;
122 strncpy( buffer, &input[i], CMD_MAX_LENGTH );
124 //printf("lead strip \"%s\"\n",buffer);
126 /* If command is empty, give up */
129 /* Strip trailing spaces */
130 for (i=l-1; i>0 && isspace(buffer[i]); i--) ;
132 //printf("trail strip \"%s\"\n",buffer);
134 /* Split into tokens */
139 for (i=1; i<l; i++) {
140 if (buffer[i] == '"') {
144 if (isspace(buffer[i]) && !quoted) {
146 while (isspace(buffer[i+1]) && (i+1 < l)) i++;
147 tokens[num_tokens++] = &buffer[i+1];
151 /* Check for matching commands */
152 cmd_execute(num_tokens, tokens);
155 void cmd_parsef(char *fmt, ...){
157 char buf[CMD_MAX_LENGTH];
159 va_start (arglist, fmt);
160 vsnprintf (buf, CMD_MAX_LENGTH, fmt, arglist);
167 /* Add some commands to the queue to be executed */
168 void cmd_enqueue(int insert, char *input)
170 cmd_queue_t *new, *head, *tail;
173 Assert(input != NULL);
179 /* Strip leading spaces */
180 while(isspace(*input) || *input == ';')
183 /* If command is empty, give up */
187 /* Now at start of a command line */
190 /* Find the end of this line (\n, ;, or nul) */
197 } else if ( *input == '\n' || (!quoted && *input == ';') ) {
203 printf("enqueue: got line: %s\n", line);
205 /* make a new queue item, add it to list */
206 MALLOC(new, cmd_queue_t, 1);
207 new->command_line = strdup(line);
218 /* add our list to the head of the main list */
220 tail->next = cmd_queue_head;
222 cmd_queue_tail = tail;
224 cmd_queue_head = head;
226 /* add our list to the tail of the main list */
228 cmd_queue_head = new;
230 cmd_queue_tail->next = head;
232 cmd_queue_tail = tail;
236 void cmd_enqueuef(int insert, char *fmt, ...){
238 char buf[CMD_MAX_LENGTH];
240 va_start (arglist, fmt);
241 vsnprintf (buf, CMD_MAX_LENGTH, fmt, arglist);
244 cmd_enqueue(insert, buf);
248 /* Attempt to autocomplete an input string */
249 char *cmd_complete(char *input)
251 CON_Out(" No autocomplete yet");
256 int cmd_handle_keybinding(unsigned char key)
258 if (cmd_keybinding_list[key]) {
259 cmd_parse(cmd_keybinding_list[key]);
268 void cmd_alias(int argc, char **argv)
271 char buf[CMD_MAX_LENGTH] = "";
276 con_printf(CON_NORMAL, "aliases:\n");
277 for (alias = cmd_alias_list; alias; alias = alias->next)
278 con_printf(CON_NORMAL, "%s: %s\n", alias->name, alias->value);
282 for (i = 2; i < argc; i++) {
284 strncat(buf, " ", CMD_MAX_LENGTH);
285 strncat(buf, argv[i], CMD_MAX_LENGTH);
288 for (alias = cmd_alias_list; alias; alias = alias->next) {
289 if (!stricmp(argv[1], alias->name))
291 d_free(alias->value);
292 alias->value = d_strdup(buf);
297 MALLOC(alias, cmd_alias_t, 1);
298 strncpy(alias->name, argv[1], ALIAS_NAME_MAX);
299 alias->value = d_strdup(buf);
300 alias->next = cmd_alias_list;
301 cmd_alias_list = alias;
305 /* FIXME: key_text is not really adequate for this */
306 void cmd_bind(int argc, char **argv)
308 char buf[CMD_MAX_LENGTH] = "";
309 unsigned char key = 0;
314 con_printf(CON_NORMAL, "key bindings:\n");
315 for (i = 0; i < 256; i++) {
316 if (!cmd_keybinding_list[i])
318 con_printf(CON_NORMAL, "%s: %s\n", key_text[i], cmd_keybinding_list[i]);
323 for (i = 2; i < argc; i++) {
325 strncat(buf, " ", CMD_MAX_LENGTH);
326 strncat(buf, argv[i], CMD_MAX_LENGTH);
329 for (i = 0; i < 256; i++) {
330 if (!stricmp(argv[1], key_text[i])) {
337 con_printf(CON_CRITICAL, "bind: key %s not found\n", argv[1]);
341 if (cmd_keybinding_list[key])
342 d_free(cmd_keybinding_list[key]);
343 cmd_keybinding_list[key] = d_strdup(buf);
347 int Console_button_states[CMD_NUM_BUTTONS];
348 void cmd_attack_on(int argc, char **argv) { Console_button_states[CMD_ATTACK] = 1; }
349 void cmd_attack_off(int argc, char **argv) { Console_button_states[CMD_ATTACK] = 0; }
350 void cmd_attack2_on(int argc, char **argv) { Console_button_states[CMD_ATTACK2] = 1; }
351 void cmd_attack2_off(int argc, char **argv) { Console_button_states[CMD_ATTACK2] = 0; }
354 void cmd_impulse(int argc, char**argv) {
357 int n = atoi(argv[1]);
358 if (n >= 1 && n <= 20) {
359 select_weapon((n-1) % 10, (n-1) / 10, 0, 1);
363 /* echo to console */
364 void cmd_echo(int argc, char **argv) {
365 char buf[CMD_MAX_LENGTH] = "";
367 for (i = 1; i < argc; i++) {
369 strncat(buf, " ", CMD_MAX_LENGTH);
370 strncat(buf, argv[i], CMD_MAX_LENGTH);
372 con_printf(CON_NORMAL, "%s\n", buf);
376 void cmd_exec(int argc, char **argv) {
378 char buf[CMD_MAX_LENGTH] = "";
382 f = PHYSFSX_openReadBuffered(argv[1]);
384 con_printf(CON_CRITICAL, "exec: %s not found\n", argv[1]);
387 while (PHYSFSX_gets(f, buf)) {
403 p = ((cmd_t *)p)->next;
409 d_free(((cmd_alias_t *)p)->value);
411 p = ((cmd_alias_t *)p)->next;
415 for (i = 0; i < 256; i++)
416 if (cmd_keybinding_list[i])
417 d_free(cmd_keybinding_list[i]);
422 memset(Console_button_states, 0, sizeof(int) * CMD_NUM_BUTTONS);
424 cmd_addcommand("alias", cmd_alias);
425 cmd_addcommand("bind", cmd_bind);
427 cmd_addcommand("+attack", cmd_attack_on);
428 cmd_addcommand("-attack", cmd_attack_off);
429 cmd_addcommand("+attack2", cmd_attack2_on);
430 cmd_addcommand("-attack2", cmd_attack2_off);
432 cmd_addcommand("impulse", cmd_impulse);
434 cmd_addcommand("echo", cmd_echo);
436 cmd_addcommand("exec", cmd_exec);