diff io.c @ 1326:071e761bcdcf

Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
author Michael Pavone <pavone@retrodev.com>
date Fri, 21 Apr 2017 23:35:32 -0700
parents a719e2c98b54
children 040c5600e2d9
line wrap: on
line diff
--- a/io.c	Fri Apr 21 01:22:52 2017 -0700
+++ b/io.c	Fri Apr 21 23:35:32 2017 -0700
@@ -494,7 +494,7 @@
 			current_system->soft_reset(current_system);
 			break;
 		case UI_SCREENSHOT: {
-			char *screenshot_base = tern_find_path(config, "ui\0screenshot_path\0").ptrval;
+			char *screenshot_base = tern_find_path(config, "ui\0screenshot_path\0", TVAL_PTR).ptrval;
 			if (!screenshot_base) {
 				screenshot_base = "$HOME";
 			}
@@ -505,7 +505,7 @@
 			time_t now = time(NULL);
 			struct tm local_store;
 			char fname_part[256];
-			char *template = tern_find_path(config, "ui\0screenshot_template\0").ptrval;
+			char *template = tern_find_path(config, "ui\0screenshot_template\0", TVAL_PTR).ptrval;
 			if (!template) {
 				template = "blastem_%c.ppm";
 			}
@@ -876,10 +876,10 @@
 {
 	current_io = io;
 	io_port * ports = current_io->ports;
-	tern_node *io_nodes = tern_get_node(tern_find_path(config, "io\0devices\0"));
-	char * io_1 = rom->port1_override ? rom->port1_override : tern_find_ptr(io_nodes, "1");
-	char * io_2 = rom->port2_override ? rom->port2_override : tern_find_ptr(io_nodes, "2");
-	char * io_ext = rom->ext_override ? rom->ext_override : tern_find_ptr(io_nodes, "ext");
+	tern_node *io_nodes = tern_find_path(config, "io\0devices\0", TVAL_NODE).ptrval;
+	char * io_1 = rom->port1_override ? rom->port1_override : io_nodes ? tern_find_ptr(io_nodes, "1") : NULL;
+	char * io_2 = rom->port2_override ? rom->port2_override : io_nodes ? tern_find_ptr(io_nodes, "2") : NULL;
+	char * io_ext = rom->ext_override ? rom->ext_override : io_nodes ? tern_find_ptr(io_nodes, "ext") : NULL;
 
 	process_device(io_1, ports);
 	process_device(io_2, ports+1);
@@ -901,7 +901,7 @@
 #ifndef _WIN32
 		if (ports[i].device_type == IO_SEGA_PARALLEL)
 		{
-			char *pipe_name = tern_find_path(config, "io\0parallel_pipe\0").ptrval;
+			char *pipe_name = tern_find_path(config, "io\0parallel_pipe\0", TVAL_PTR).ptrval;
 			if (!pipe_name)
 			{
 				warning("IO port %s is configured to use the sega parallel board, but no paralell_pipe is set!\n", io_name(i));
@@ -927,7 +927,7 @@
 				}
 			}
 		} else if (ports[i].device_type == IO_GENERIC) {
-			char *sock_name = tern_find_path(config, "io\0socket\0").ptrval;
+			char *sock_name = tern_find_path(config, "io\0socket\0", TVAL_PTR).ptrval;
 			if (!sock_name)
 			{
 				warning("IO port %s is configured to use generic IO, but no socket is set!\n", io_name(i));
@@ -1013,7 +1013,7 @@
 	int       mouseidx;
 } pmb_state;
 
-void process_mouse_button(char *buttonstr, tern_val value, void *data)
+void process_mouse_button(char *buttonstr, tern_val value, uint8_t valtype, void *data)
 {
 	pmb_state *state = data;
 	int buttonnum = atoi(buttonstr);
@@ -1021,6 +1021,10 @@
 		warning("Mouse button %s is out of the supported range of 1-8\n", buttonstr);
 		return;
 	}
+	if (valtype != TVAL_PTR) {
+		warning("Mouse button %s is not a scalar value!\n", buttonstr);
+		return;
+	}
 	buttonnum--;
 	int ui_func, devicenum, button;
 	int bindtype = parse_binding_target(value.ptrval, state->padbuttons, state->mousebuttons, &ui_func, &devicenum, &button);
@@ -1045,17 +1049,17 @@
 
 }
 
-void process_mouse(char *mousenum, tern_val value, void *data)
+void process_mouse(char *mousenum, tern_val value, uint8_t valtype, void *data)
 {
 	tern_node **buttonmaps = data;
-	tern_node *mousedef = tern_get_node(value);
+	if (valtype != TVAL_NODE) {
+		warning("Binding for mouse %s is a scalar!\n", mousenum);
+		return;
+	}
+	tern_node *mousedef = value.ptrval;
 	tern_node *padbuttons = buttonmaps[0];
 	tern_node *mousebuttons = buttonmaps[1];
 
-	if (!mousedef) {
-		warning("Binding for mouse %s is a scalar!\n", mousenum);
-		return;
-	}
 	int mouseidx = atoi(mousenum);
 	if (mouseidx < 0 || mouseidx >= MAX_MICE) {
 		warning("Mouse numbers must be between 0 and %d, but %d is not\n", MAX_MICE, mouseidx);
@@ -1074,7 +1078,7 @@
 			warning("Mouse motion can't be bound to target %s\n", motion);
 		}
 	}
-	tern_node *buttons = tern_get_node(tern_find_path(mousedef, "buttons\0\0"));
+	tern_node *buttons = tern_find_path(mousedef, "buttons\0\0", TVAL_NODE).ptrval;
 	if (buttons) {
 		pmb_state state = {padbuttons, mousebuttons, mouseidx};
 		tern_foreach(buttons, process_mouse_button, &state);
@@ -1087,11 +1091,15 @@
 	tern_node *mousebuttons;
 } pad_button_state;
 
-void process_pad_button(char *key, tern_val val, void *data)
+void process_pad_button(char *key, tern_val val, uint8_t valtype, void *data)
 {
 	pad_button_state *state = data;
 	int hostpadnum = state->padnum;
 	int ui_func, padnum, button;
+	if (valtype != TVAL_PTR) {
+		warning("Pad button %s has a non-scalar value\n", key);
+		return;
+	}
 	int bindtype = parse_binding_target(val.ptrval, state->padbuttons, state->mousebuttons, &ui_func, &padnum, &button);
 	char *end;
 	long hostbutton = strtol(key, &end, 10);
@@ -1129,12 +1137,16 @@
 	}
 }
 
-void process_pad_axis(char *key, tern_val val, void *data)
+void process_pad_axis(char *key, tern_val val, uint8_t valtype, void *data)
 {
 	key = strdup(key);
 	pad_button_state *state = data;
 	int hostpadnum = state->padnum;
 	int ui_func, padnum, button;
+	if (valtype != TVAL_PTR) {
+		warning("Mapping for axis %s has a non-scalar value", key);
+		return;
+	}
 	int bindtype = parse_binding_target(val.ptrval, state->padbuttons, state->mousebuttons, &ui_func, &padnum, &button);
 	char *modifier = strchr(key, '.');
 	int positive = 1;
@@ -1226,19 +1238,19 @@
 	if (joystick > MAX_JOYSTICKS) {
 		return;
 	}
-	tern_node * pads = tern_get_node(tern_find_path(config, "bindings\0pads\0"));
+	tern_node * pads = tern_find_path(config, "bindings\0pads\0", TVAL_NODE).ptrval;
 	if (pads) {
 		char numstr[11];
 		sprintf(numstr, "%d", joystick);
-		tern_node * pad = tern_find_ptr(pads, numstr);
+		tern_node * pad = tern_find_node(pads, numstr);
 		if (pad) {
-			tern_node * dpad_node = tern_find_ptr(pad, "dpads");
+			tern_node * dpad_node = tern_find_node(pad, "dpads");
 			if (dpad_node) {
 				for (int dpad = 0; dpad < 10; dpad++)
 				{
 					numstr[0] = dpad + '0';
 					numstr[1] = 0;
-					tern_node * pad_dpad = tern_find_ptr(dpad_node, numstr);
+					tern_node * pad_dpad = tern_find_node(dpad_node, numstr);
 					char * dirs[] = {"up", "down", "left", "right"};
 					int dirnums[] = {RENDER_DPAD_UP, RENDER_DPAD_DOWN, RENDER_DPAD_LEFT, RENDER_DPAD_RIGHT};
 					for (int dir = 0; dir < sizeof(dirs)/sizeof(dirs[0]); dir++) {
@@ -1255,7 +1267,7 @@
 					}
 				}
 			}
-			tern_node *button_node = tern_find_ptr(pad, "buttons");
+			tern_node *button_node = tern_find_node(pad, "buttons");
 			if (button_node) {
 				pad_button_state state = {
 					.padnum = joystick,
@@ -1264,7 +1276,7 @@
 				};
 				tern_foreach(button_node, process_pad_button, &state);
 			}
-			tern_node *axes_node = tern_find_ptr(pad, "axes");
+			tern_node *axes_node = tern_find_node(pad, "axes");
 			if (axes_node) {
 				pad_button_state state = {
 					.padnum = joystick,
@@ -1347,10 +1359,10 @@
 
 	tern_node *mousebuttons = get_mouse_buttons();
 	
-	tern_node * keys = tern_get_node(tern_find_path(config, "bindings\0keys\0"));
+	tern_node * keys = tern_find_path(config, "bindings\0keys\0", TVAL_NODE).ptrval;
 	process_keys(keys, special, padbuttons, mousebuttons, NULL);
 	char numstr[] = "00";
-	tern_node * pads = tern_get_node(tern_find_path(config, "bindings\0pads\0"));
+	tern_node * pads = tern_find_path(config, "bindings\0pads\0", TVAL_NODE).ptrval;
 	if (pads) {
 		for (int i = 0; i < MAX_JOYSTICKS; i++)
 		{
@@ -1366,12 +1378,12 @@
 		}
 	}
 	memset(mice, 0, sizeof(mice));
-	tern_node * mice = tern_get_node(tern_find_path(config, "bindings\0mice\0"));
+	tern_node * mice = tern_find_path(config, "bindings\0mice\0", TVAL_NODE).ptrval;
 	if (mice) {
 		tern_node *buttonmaps[2] = {padbuttons, mousebuttons};
 		tern_foreach(mice, process_mouse, buttonmaps);
 	}
-	tern_node * speed_nodes = tern_get_node(tern_find_path(config, "clocks\0speeds\0"));
+	tern_node * speed_nodes = tern_find_path(config, "clocks\0speeds\0", TVAL_NODE).ptrval;
 	speeds = malloc(sizeof(uint32_t));
 	speeds[0] = 100;
 	process_speeds(speed_nodes, NULL);