+static unsigned int keys_encountered = 0;
+
+static int parse_bind_val(const char *val, int *type)
+{
+ int i;
+
+ *type = IN_BINDTYPE_NONE;
+ if (val[0] == 0)
+ return 0;
+
+ if (strncasecmp(val, "player", 6) == 0)
+ {
+ int player, shift = 0;
+ player = atoi(val + 6) - 1;
+
+ if (player > 1)
+ return -1;
+ if (player == 1)
+ shift = 16;
+
+ *type = IN_BINDTYPE_PLAYER12;
+ for (i = 0; i < sizeof(me_ctrl_actions) / sizeof(me_ctrl_actions[0]); i++) {
+ if (strncasecmp(me_ctrl_actions[i].name, val + 8, strlen(val + 8)) == 0)
+ return me_ctrl_actions[i].mask << shift;
+ }
+ }
+ for (i = 0; emuctrl_actions[i].name != NULL; i++) {
+ if (strncasecmp(emuctrl_actions[i].name, val, strlen(val)) == 0) {
+ *type = IN_BINDTYPE_EMU;
+ return emuctrl_actions[i].mask;
+ }
+ }
+
+ return -1;
+}
+
+static void keys_parse(const char *key, const char *val, int dev_id)
+{
+ int acts, type;
+
+ acts = parse_bind_val(val, &type);
+ if (acts == -1) {
+ lprintf("config: unhandled action \"%s\"\n", val);
+ return;
+ }
+
+ in_config_bind_key(dev_id, key, acts, type);
+}
+
+static int get_numvar_num(const char *var)
+{
+ char *p = NULL;
+ int num;
+
+ if (var[0] == ' ')
+ return 0;
+
+ num = strtoul(var, &p, 10);
+ if (*p == 0 || *p == ' ')
+ return num;
+
+ return -1;
+}
+
+/* map dev number in confing to input dev number */
+static unsigned char input_dev_map[IN_MAX_DEVS];
+