add SDL2 audio backend
[rofl0r-gnuboy.git] / rccmds.c
blobf6c1b7180bab652a72bc15f2d42e09c44bac75ff
1 #include <string.h>
2 #include <stdlib.h>
4 #include "defs.h"
5 #include "rc.h"
6 #include "rckeys.h"
7 #include "hw.h"
8 #include "emu.h"
9 #include "loader.h"
10 #include "split.h"
14 * define the command functions for the controller pad.
17 #define CMD_PAD(b, B) \
18 static int (cmd_ ## b)(int c, char **v) \
19 { pad_set((PAD_ ## B), v[0][0] == '+'); return 0; } \
20 static int (cmd_ ## b)(int c, char **v)
22 CMD_PAD(up, UP);
23 CMD_PAD(down, DOWN);
24 CMD_PAD(left, LEFT);
25 CMD_PAD(right, RIGHT);
26 CMD_PAD(a, A);
27 CMD_PAD(b, B);
28 CMD_PAD(start, START);
29 CMD_PAD(select, SELECT);
33 * the set command is used to set rc-exported variables.
36 static int cmd_set(int argc, char **argv)
38 if (argc < 3)
39 return -1;
40 return rc_setvar(argv[1], argc-2, argv+2);
46 * the following commands allow keys to be bound to perform rc commands.
49 static int cmd_bind(int argc, char **argv)
51 if (argc < 3)
52 return -1;
53 return rc_bindkey(argv[1], argv[2]);
56 static int cmd_unbind(int argc, char **argv)
58 if (argc < 2)
59 return -1;
60 return rc_unbindkey(argv[1]);
63 static int cmd_unbindall()
65 rc_unbindall();
66 return 0;
69 static int cmd_source(int argc, char **argv)
71 if (argc < 2)
72 return -1;
73 return rc_sourcefile(argv[1]);
76 static int cmd_quit()
78 exit(0);
79 /* NOT REACHED */
82 static int cmd_reset()
84 emu_reset();
85 return 0;
88 static int cmd_savestate(int argc, char **argv)
90 state_save(argc > 1 ? atoi(argv[1]) : -1);
91 return 0;
94 static int cmd_loadstate(int argc, char **argv)
96 state_load(argc > 1 ? atoi(argv[1]) : -1);
97 return 0;
103 * table of command names and the corresponding functions to be called
106 rccmd_t rccmds[] =
108 RCC("set", cmd_set),
109 RCC("bind", cmd_bind),
110 RCC("unbind", cmd_unbind),
111 RCC("unbindall", cmd_unbindall),
112 RCC("source", cmd_source),
113 RCC("reset", cmd_reset),
114 RCC("quit", cmd_quit),
115 RCC("savestate", cmd_savestate),
116 RCC("loadstate", cmd_loadstate),
118 RCC("+up", cmd_up),
119 RCC("-up", cmd_up),
120 RCC("+down", cmd_down),
121 RCC("-down", cmd_down),
122 RCC("+left", cmd_left),
123 RCC("-left", cmd_left),
124 RCC("+right", cmd_right),
125 RCC("-right", cmd_right),
126 RCC("+a", cmd_a),
127 RCC("-a", cmd_a),
128 RCC("+b", cmd_b),
129 RCC("-b", cmd_b),
130 RCC("+start", cmd_start),
131 RCC("-start", cmd_start),
132 RCC("+select", cmd_select),
133 RCC("-select", cmd_select),
135 RCC_END
142 int rc_command(char *line)
144 int i, argc, ret;
145 char *argv[128], *linecopy;
147 linecopy = malloc(strlen(line)+1);
148 strcpy(linecopy, line);
150 argc = splitline(argv, (sizeof argv)/(sizeof argv[0]), linecopy);
151 if (!argc)
153 free(linecopy);
154 return -1;
157 for (i = 0; rccmds[i].name; i++)
159 if (!strcmp(argv[0], rccmds[i].name))
161 ret = rccmds[i].func(argc, argv);
162 free(linecopy);
163 return ret;
167 /* printf("unknown command: %s\n", argv[0]); */
168 free(linecopy);
170 return -1;