--- a/src/dreamcast.c Tue Dec 13 12:17:26 2005 +0000 +++ b/src/dreamcast.c Tue Dec 13 14:47:59 2005 +0000 @@ -12,6 +12,7 @@ #define MAX_MODULES 32 static int num_modules = 0; static int dreamcast_state = 0; +static char *dreamcast_config = "DEFAULT"; dreamcast_module_t modules[MAX_MODULES]; /** @@ -93,28 +94,76 @@ struct save_state_header { char magic[16]; uint32_t version; + uint32_t module_count; }; -void dreamcast_load_state( FILE *f ) + +int dreamcast_load_state( FILE *f ) { - int i; + int i,j; + uint32_t count, len; + int have_read[MAX_MODULES]; + char tmp[64]; struct save_state_header header; fread( &header, sizeof(header), 1, f ); if( strncmp( header.magic, DREAMCAST_SAVE_MAGIC, 16 ) != 0 ) { ERROR( "Not a DreamOn save state file" ); - return; + return 1; } if( header.version != DREAMCAST_SAVE_VERSION ) { ERROR( "DreamOn save state version not supported" ); - return; + return 1; + } + fread( &count, sizeof(count), 1, f ); + if( count > MAX_MODULES ) { + ERROR( "DreamOn save state is corrupted" ); + return 1; + } + for( i=0; iload != NULL ) - modules[i]->load(f); - else if( modules[i]->reset != NULL ) - modules[i]->reset(); + for( i=0; i 64 || len < 1 ) { + ERROR( "DreamOn save state is corrupted" ); + return 2; + } + + /* Find the matching module by name */ + for( j=0; jname,tmp) == 0 ) { + have_read[j] = 1; + if( modules[j]->load == NULL ) { + ERROR( "DreamOn save state is corrupted" ); + return 2; + } else if( modules[j]->load(f) != 0 ) { + ERROR( "DreamOn save state is corrupted" ); + return 2; + } + break; + } + } + if( j == num_modules ) { + ERROR( "DreamOn save state contains unrecognized section" ); + return 2; + } + } + + /* Any modules that we didn't load - reset to the default state. + * (ie it's not an error to skip a module if you don't actually + * care about its state). + */ + for( j=0; jreset != NULL ) { + modules[j]->reset(); + } } } @@ -125,9 +174,13 @@ strcpy( header.magic, DREAMCAST_SAVE_MAGIC ); header.version = DREAMCAST_SAVE_VERSION; + header.module_count = num_modules; fwrite( &header, sizeof(header), 1, f ); + fwrite_string( dreamcast_config, f ); for( i=0; isave != NULL ) { + fwrite( "BLCK", 4, 1, f ); + fwrite_string( modules[i]->name, f ); modules[i]->save(f); } }