More gracious error handling for state tracker.

This commit is contained in:
Themaister 2011-10-26 19:51:10 +02:00
parent 97f937ec6d
commit fad89f9d2d
4 changed files with 20 additions and 24 deletions

View File

@ -490,8 +490,8 @@ static bool load_imports(const char *dir_path, config_file_t *conf)
unsigned addr = 0; unsigned addr = 0;
#ifdef HAVE_PYTHON #ifdef HAVE_PYTHON
if (tracker_type != SSNES_STATE_PYTHON) if (tracker_type != SSNES_STATE_PYTHON)
{
#endif #endif
{
unsigned input_slot = 0; unsigned input_slot = 0;
if (config_get_hex(conf, input_slot_buf, &input_slot)) if (config_get_hex(conf, input_slot_buf, &input_slot))
{ {
@ -525,11 +525,9 @@ static bool load_imports(const char *dir_path, config_file_t *conf)
SSNES_ERR("No address assigned to semantic.\n"); SSNES_ERR("No address assigned to semantic.\n");
goto error; goto error;
} }
#ifdef HAVE_PYTHON
} }
#endif
int memtype = 0; unsigned memtype;
switch (ram_type) switch (ram_type)
{ {
case SSNES_STATE_WRAM: case SSNES_STATE_WRAM:
@ -549,10 +547,10 @@ static bool load_imports(const char *dir_path, config_file_t *conf)
break; break;
default: default:
memtype = SNES_MEMORY_WRAM; memtype = -1u;
} }
if (addr >= psnes_get_memory_size(memtype)) if ((memtype != -1u) && (addr >= psnes_get_memory_size(memtype)))
{ {
SSNES_ERR("Address out of bounds.\n"); SSNES_ERR("Address out of bounds.\n");
goto error; goto error;
@ -581,7 +579,7 @@ static bool load_imports(const char *dir_path, config_file_t *conf)
.oam = psnes_get_memory_data(SNES_MEMORY_OAM), .oam = psnes_get_memory_data(SNES_MEMORY_OAM),
.apuram = psnes_get_memory_data(SNES_MEMORY_APURAM), .apuram = psnes_get_memory_data(SNES_MEMORY_APURAM),
.info = info, .info = info,
.info_elem = info_cnt .info_elem = info_cnt,
}; };
#ifdef HAVE_PYTHON #ifdef HAVE_PYTHON
@ -613,7 +611,6 @@ static bool load_imports(const char *dir_path, config_file_t *conf)
#endif #endif
free(imports); free(imports);
return true; return true;
error: error:

View File

@ -483,13 +483,13 @@ static bool get_import_value(xmlNodePtr ptr)
goto error; goto error;
} }
enum snes_ram_type ram_type = SSNES_STATE_WRAM; enum snes_ram_type ram_type = SSNES_STATE_NONE;
uint32_t addr = 0; uint32_t addr = 0;
#ifdef HAVE_PYTHON #ifdef HAVE_PYTHON
if (tracker_type != SSNES_STATE_PYTHON) if (tracker_type != SSNES_STATE_PYTHON)
{
#endif #endif
{
if (input) if (input)
{ {
unsigned slot = strtoul((const char*)input, NULL, 0); unsigned slot = strtoul((const char*)input, NULL, 0);
@ -517,11 +517,9 @@ static bool get_import_value(xmlNodePtr ptr)
SSNES_ERR("No RAM address specificed for import value.\n"); SSNES_ERR("No RAM address specificed for import value.\n");
goto error; goto error;
} }
#ifdef HAVE_PYTHON
} }
#endif
int memtype = 0; unsigned memtype;
switch (ram_type) switch (ram_type)
{ {
case SSNES_STATE_WRAM: case SSNES_STATE_WRAM:
@ -541,10 +539,10 @@ static bool get_import_value(xmlNodePtr ptr)
break; break;
default: default:
memtype = SNES_MEMORY_WRAM; memtype = -1u;
} }
if (addr >= psnes_get_memory_size(memtype)) if ((memtype != -1u) && (addr >= psnes_get_memory_size(memtype)))
{ {
SSNES_ERR("Address out of bounds.\n"); SSNES_ERR("Address out of bounds.\n");
goto error; goto error;

View File

@ -88,32 +88,32 @@ snes_tracker_t* snes_tracker_init(const struct snes_tracker_info *info)
strlcpy(tracker->info[i].id, info->info[i].id, sizeof(tracker->info[i].id)); strlcpy(tracker->info[i].id, info->info[i].id, sizeof(tracker->info[i].id));
tracker->info[i].addr = info->info[i].addr; tracker->info[i].addr = info->info[i].addr;
tracker->info[i].type = info->info[i].type; tracker->info[i].type = info->info[i].type;
tracker->info[i].mask = (info->info[i].mask == 0) ? 0xffffffffu : info->info[i].mask; tracker->info[i].mask = (info->info[i].mask == 0) ? -1u : info->info[i].mask;
#ifdef HAVE_PYTHON #ifdef HAVE_PYTHON
if (info->info[i].type == SSNES_STATE_PYTHON) if (info->info[i].type == SSNES_STATE_PYTHON)
tracker->info[i].py = tracker->py; tracker->info[i].py = tracker->py;
#endif #endif
assert(info->wram && info->vram && info->cgram && // If we don't have a valid pointer.
info->oam && info->apuram); static const uint8_t empty = 0;
switch (info->info[i].ram_type) switch (info->info[i].ram_type)
{ {
case SSNES_STATE_WRAM: case SSNES_STATE_WRAM:
tracker->info[i].ptr = info->wram; tracker->info[i].ptr = info->wram ? info->wram : ∅
break; break;
case SSNES_STATE_APURAM: case SSNES_STATE_APURAM:
tracker->info[i].ptr = info->apuram; tracker->info[i].ptr = info->apuram ? info->apuram : ∅
break; break;
case SSNES_STATE_OAM: case SSNES_STATE_OAM:
tracker->info[i].ptr = info->oam; tracker->info[i].ptr = info->oam ? info->oam : ∅
break; break;
case SSNES_STATE_CGRAM: case SSNES_STATE_CGRAM:
tracker->info[i].ptr = info->cgram; tracker->info[i].ptr = info->cgram ? info->cgram : ∅
break; break;
case SSNES_STATE_VRAM: case SSNES_STATE_VRAM:
tracker->info[i].ptr = info->vram; tracker->info[i].ptr = info->vram ? info->vram : ∅
break; break;
case SSNES_STATE_INPUT_SLOT1: case SSNES_STATE_INPUT_SLOT1:
tracker->info[i].input_ptr = &tracker->input_state[0]; tracker->info[i].input_ptr = &tracker->input_state[0];
@ -125,7 +125,7 @@ snes_tracker_t* snes_tracker_init(const struct snes_tracker_info *info)
break; break;
default: default:
tracker->info[i].ptr = NULL; tracker->info[i].ptr = ∅
} }
} }

View File

@ -39,6 +39,7 @@ enum snes_tracker_type
enum snes_ram_type enum snes_ram_type
{ {
SSNES_STATE_NONE,
SSNES_STATE_WRAM, SSNES_STATE_WRAM,
SSNES_STATE_APURAM, SSNES_STATE_APURAM,
SSNES_STATE_OAM, SSNES_STATE_OAM,