]> icculus.org git repositories - btb/d2x.git/blob - main/cmd.c
free cmd memory
[btb/d2x.git] / main / cmd.c
1 #ifdef HAVE_CONFIG_H
2 #include <conf.h>
3 #endif
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <ctype.h>
9
10 #include "pstypes.h"
11 #include "cmd.h"
12 #include "console.h"
13 #include "error.h"
14 #include "u_mem.h"
15 #include "strutil.h"
16
17
18 typedef struct cmd_s
19 {
20         char          *name;
21         cmd_handler_t function;
22         struct cmd_s  *next;
23 } cmd_t;
24
25 static cmd_t *cmd_list = NULL;
26
27
28 /* add a new console command */
29 void cmd_addcommand(char *cmd_name, cmd_handler_t cmd_func)
30 {
31         cmd_t *cmd;
32
33         Assert(cmd_name != NULL);
34
35         for (cmd = cmd_list; cmd; cmd = cmd->next) {
36                 if (!stricmp(cmd_name, cmd->name))
37                 {
38                         Int3();
39                         con_printf(CON_NORMAL, "command %s already exists, not adding\n", cmd_name);
40                         return;
41                 }
42         }
43
44         /* create command, insert at front of list */
45         MALLOC(cmd, cmd_t, 1);
46         cmd->name = cmd_name;
47         cmd->function = cmd_func;
48         cmd->next = cmd_list;
49         cmd_list = cmd;
50 }
51
52
53 /* execute a parsed command */
54 void cmd_execute(int argc, char **argv)
55 {
56         cmd_t *cmd;
57         for (cmd = cmd_list; cmd; cmd = cmd->next) {
58                 if (!stricmp(argv[0], cmd->name))
59                         return cmd->function(argc, argv);
60         }
61
62         /* Otherwise */
63         if (argc > 1)  // set value of cvar
64                 cvar_set(argv[0], argv[1]);
65         con_printf(CON_NORMAL, "%s: %f\n", argv[0], cvar(argv[0]));
66 }
67
68
69 /* Parse an input string */
70 void cmd_parse(char *input)
71 {
72         char buffer[CMD_MAX_LENGTH];
73         char *tokens[CMD_MAX_TOKENS];
74         int num_tokens;
75         int i, l;
76
77         Assert(input != NULL);
78         
79         /* Strip leading spaces */
80         for (i=0; isspace(input[i]); i++) ;
81         strncpy( buffer, &input[i], CMD_MAX_LENGTH );
82
83         printf("lead strip \"%s\"\n",buffer);
84         l = strlen(buffer);
85         /* If command is empty, give up */
86         if (l==0) return;
87
88         /* Strip trailing spaces */
89         for (i=l-1; i>0 && isspace(buffer[i]); i--) ;
90         buffer[i+1] = 0;
91         printf("trail strip \"%s\"\n",buffer);
92
93         /* Split into tokens */
94         l = strlen(buffer);
95         num_tokens = 1;
96
97         tokens[0] = buffer;
98         for (i=1; i<l; i++) {
99                 if (isspace(buffer[i])) {
100                         buffer[i] = 0;
101                         while (isspace(buffer[i+1]) && (i+1 < l)) i++;
102                         tokens[num_tokens++] = &buffer[i+1];
103                 }
104         }
105
106         /* Check for matching commands */
107         cmd_execute(num_tokens, tokens);
108 }
109
110
111
112 /* +/- actions */
113
114 int Console_button_states[CMD_NUM_BUTTONS];
115
116 void cmd_attack_on(int argc, char **argv) { Console_button_states[CMD_ATTACK] = 1; }
117 void cmd_attack_off(int argc, char **argv) { Console_button_states[CMD_ATTACK] = 0; }
118 void cmd_attack2_on(int argc, char **argv) { Console_button_states[CMD_ATTACK2] = 1; }
119 void cmd_attack2_off(int argc, char **argv) { Console_button_states[CMD_ATTACK2] = 0; }
120
121
122 void cmd_free(void)
123 {
124         cmd_t *p = cmd_list, *temp;
125
126         while (p) {
127                 temp = p;
128                 p = p->next;
129                 d_free(temp);
130         }
131 }
132
133
134 void cmd_init(void){
135         memset(Console_button_states, 0, sizeof(int) * CMD_NUM_BUTTONS);
136
137         cmd_addcommand("+attack", cmd_attack_on);
138         cmd_addcommand("-attack", cmd_attack_off);
139         cmd_addcommand("+attack2", cmd_attack2_on);
140         cmd_addcommand("-attack2", cmd_attack2_off);
141
142         atexit(cmd_free);
143 }