]> icculus.org git repositories - btb/d2x.git/blob - main/cmd.c
add exec cmd
[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 #include "weapon.h"
17
18
19 /* The list of cmds */
20 typedef struct cmd_s
21 {
22         char          *name;
23         cmd_handler_t function;
24         struct cmd_s  *next;
25 } cmd_t;
26
27 static cmd_t *cmd_list = NULL;
28
29
30 /* add a new console command */
31 void cmd_addcommand(char *cmd_name, cmd_handler_t cmd_func)
32 {
33         cmd_t *cmd;
34
35         Assert(cmd_name != NULL);
36
37         for (cmd = cmd_list; cmd; cmd = cmd->next) {
38                 if (!stricmp(cmd_name, cmd->name))
39                 {
40                         Int3();
41                         con_printf(CON_NORMAL, "command %s already exists, not adding\n", cmd_name);
42                         return;
43                 }
44         }
45
46         /* create command, insert at front of list */
47         MALLOC(cmd, cmd_t, 1);
48         cmd->name = cmd_name;
49         cmd->function = cmd_func;
50         cmd->next = cmd_list;
51         cmd_list = cmd;
52 }
53
54
55 /* execute a parsed command */
56 void cmd_execute(int argc, char **argv)
57 {
58         cmd_t *cmd;
59         for (cmd = cmd_list; cmd; cmd = cmd->next) {
60                 if (!stricmp(argv[0], cmd->name))
61                         return cmd->function(argc, argv);
62         }
63
64         /* Otherwise */
65         if (argc > 1)  // set value of cvar
66                 cvar_set(argv[0], argv[1]);
67         con_printf(CON_NORMAL, "%s: %f\n", argv[0], cvar(argv[0]));
68 }
69
70
71 /* Parse an input string */
72 void cmd_parse(char *input)
73 {
74         char buffer[CMD_MAX_LENGTH];
75         char *tokens[CMD_MAX_TOKENS];
76         int num_tokens;
77         int i, l;
78
79         Assert(input != NULL);
80         
81         /* Strip leading spaces */
82         for (i=0; isspace(input[i]); i++) ;
83         strncpy( buffer, &input[i], CMD_MAX_LENGTH );
84
85         //printf("lead strip \"%s\"\n",buffer);
86         l = strlen(buffer);
87         /* If command is empty, give up */
88         if (l==0) return;
89
90         /* Strip trailing spaces */
91         for (i=l-1; i>0 && isspace(buffer[i]); i--) ;
92         buffer[i+1] = 0;
93         //printf("trail strip \"%s\"\n",buffer);
94
95         /* Split into tokens */
96         l = strlen(buffer);
97         num_tokens = 1;
98
99         tokens[0] = buffer;
100         for (i=1; i<l; i++) {
101                 if (isspace(buffer[i])) {
102                         buffer[i] = 0;
103                         while (isspace(buffer[i+1]) && (i+1 < l)) i++;
104                         tokens[num_tokens++] = &buffer[i+1];
105                 }
106         }
107
108         /* Check for matching commands */
109         cmd_execute(num_tokens, tokens);
110 }
111
112
113
114 /* +/- actions */
115
116 int Console_button_states[CMD_NUM_BUTTONS];
117
118 void cmd_attack_on(int argc, char **argv) { Console_button_states[CMD_ATTACK] = 1; }
119 void cmd_attack_off(int argc, char **argv) { Console_button_states[CMD_ATTACK] = 0; }
120 void cmd_attack2_on(int argc, char **argv) { Console_button_states[CMD_ATTACK2] = 1; }
121 void cmd_attack2_off(int argc, char **argv) { Console_button_states[CMD_ATTACK2] = 0; }
122
123 /* weapon select */
124 void cmd_impulse(int argc, char**argv) {
125         if (argc < 2)
126                 return;
127         int n = atoi(argv[1]);
128         if (n >= 1 && n <= 20) {
129                 select_weapon((n-1) % 10, (n-1) / 10, 0, 1);
130         }
131 }
132
133 /* echo to console */
134 void cmd_echo(int argc, char **argv) {
135         char buf[1024] = "";
136         int i;
137         for (i = 1; i < argc; i++) {
138                 if (i > 1)
139                         strncat(buf, " ", 1024);
140                 strncat(buf, argv[i], 1024);
141         }
142         con_printf(CON_NORMAL, "%s\n", buf);
143 }
144
145 /* execute script */
146 void cmd_exec(int argc, char **argv) {
147         PHYSFS_File *f;
148         char buf[1024] = "";
149
150         if (argc < 2)
151                 return;
152         f = PHYSFSX_openReadBuffered(argv[1]);
153         if (!f) {
154                 con_printf(CON_CRITICAL, "exec: %s not found\n", argv[1]);
155                 return;
156         }
157         while (PHYSFSX_gets(f, buf)) {
158                 cmd_parse(buf);
159         }
160         PHYSFS_close(f);
161 }
162
163
164 void cmd_free(void)
165 {
166         cmd_t *p = cmd_list, *temp;
167
168         while (p) {
169                 temp = p;
170                 p = p->next;
171                 d_free(temp);
172         }
173 }
174
175
176 void cmd_init(void){
177         memset(Console_button_states, 0, sizeof(int) * CMD_NUM_BUTTONS);
178
179         cmd_addcommand("+attack", cmd_attack_on);
180         cmd_addcommand("-attack", cmd_attack_off);
181         cmd_addcommand("+attack2", cmd_attack2_on);
182         cmd_addcommand("-attack2", cmd_attack2_off);
183
184         cmd_addcommand("impulse", cmd_impulse);
185
186         cmd_addcommand("echo", cmd_echo);
187
188         cmd_addcommand("exec", cmd_exec);
189
190         atexit(cmd_free);
191 }