mirror of https://github.com/OpenTTD/OpenTTD
(svn r18686) -Fix [FS#3470]: in some cases _sl.chs is used when not initialised. As _sl.chs always refers to a single table when initialised replace _sl.chs with the actual table
parent
0f22c6030d
commit
ea75e7da60
|
@ -88,8 +88,6 @@ struct SaveLoadParams {
|
||||||
WriterProc *write_bytes; ///< savegame writer function
|
WriterProc *write_bytes; ///< savegame writer function
|
||||||
ReaderProc *read_bytes; ///< savegame loader function
|
ReaderProc *read_bytes; ///< savegame loader function
|
||||||
|
|
||||||
const ChunkHandler * const *chs; ///< the chunk of data that is being processed atm (vehicles, signs, etc.)
|
|
||||||
|
|
||||||
/* When saving/loading savegames, they are always saved to a temporary memory-place
|
/* When saving/loading savegames, they are always saved to a temporary memory-place
|
||||||
* to be flushed to file (save) or to final place (load) when full. */
|
* to be flushed to file (save) or to final place (load) when full. */
|
||||||
byte *bufp, *bufe; ///< bufp(ointer) gives the current position in the buffer bufe(nd) gives the end of the buffer
|
byte *bufp, *bufe; ///< bufp(ointer) gives the current position in the buffer bufe(nd) gives the end of the buffer
|
||||||
|
@ -105,6 +103,62 @@ struct SaveLoadParams {
|
||||||
char *extra_msg; ///< the error message
|
char *extra_msg; ///< the error message
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* these define the chunks */
|
||||||
|
extern const ChunkHandler _gamelog_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _map_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _misc_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _name_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _cheat_chunk_handlers[] ;
|
||||||
|
extern const ChunkHandler _setting_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _company_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _engine_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _veh_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _waypoint_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _depot_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _order_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _town_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _sign_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _station_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _industry_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _economy_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _subsidy_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _ai_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _animated_tile_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _newgrf_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _group_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _cargopacket_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _autoreplace_chunk_handlers[];
|
||||||
|
extern const ChunkHandler _labelmaps_chunk_handlers[];
|
||||||
|
|
||||||
|
static const ChunkHandler * const _chunk_handlers[] = {
|
||||||
|
_gamelog_chunk_handlers,
|
||||||
|
_map_chunk_handlers,
|
||||||
|
_misc_chunk_handlers,
|
||||||
|
_name_chunk_handlers,
|
||||||
|
_cheat_chunk_handlers,
|
||||||
|
_setting_chunk_handlers,
|
||||||
|
_veh_chunk_handlers,
|
||||||
|
_waypoint_chunk_handlers,
|
||||||
|
_depot_chunk_handlers,
|
||||||
|
_order_chunk_handlers,
|
||||||
|
_industry_chunk_handlers,
|
||||||
|
_economy_chunk_handlers,
|
||||||
|
_subsidy_chunk_handlers,
|
||||||
|
_engine_chunk_handlers,
|
||||||
|
_town_chunk_handlers,
|
||||||
|
_sign_chunk_handlers,
|
||||||
|
_station_chunk_handlers,
|
||||||
|
_company_chunk_handlers,
|
||||||
|
_ai_chunk_handlers,
|
||||||
|
_animated_tile_chunk_handlers,
|
||||||
|
_newgrf_chunk_handlers,
|
||||||
|
_group_chunk_handlers,
|
||||||
|
_cargopacket_chunk_handlers,
|
||||||
|
_autoreplace_chunk_handlers,
|
||||||
|
_labelmaps_chunk_handlers,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
static SaveLoadParams _sl;
|
static SaveLoadParams _sl;
|
||||||
|
|
||||||
/** Null all pointers (convert index -> NULL) */
|
/** Null all pointers (convert index -> NULL) */
|
||||||
|
@ -117,7 +171,7 @@ static void SlNullPointers()
|
||||||
|
|
||||||
DEBUG(sl, 1, "Nulling pointers");
|
DEBUG(sl, 1, "Nulling pointers");
|
||||||
|
|
||||||
for (chsc = _sl.chs; (ch = *chsc++) != NULL;) {
|
for (chsc = _chunk_handlers; (ch = *chsc++) != NULL;) {
|
||||||
while (true) {
|
while (true) {
|
||||||
if (ch->ptrs_proc != NULL) {
|
if (ch->ptrs_proc != NULL) {
|
||||||
DEBUG(sl, 2, "Nulling pointers for %c%c%c%c", ch->id >> 24, ch->id >> 16, ch->id >> 8, ch->id);
|
DEBUG(sl, 2, "Nulling pointers for %c%c%c%c", ch->id >> 24, ch->id >> 16, ch->id >> 8, ch->id);
|
||||||
|
@ -1138,7 +1192,7 @@ static void SlSaveChunks()
|
||||||
uint p;
|
uint p;
|
||||||
|
|
||||||
for (p = 0; p != CH_NUM_PRI_LEVELS; p++) {
|
for (p = 0; p != CH_NUM_PRI_LEVELS; p++) {
|
||||||
for (chsc = _sl.chs; (ch = *chsc++) != NULL;) {
|
for (chsc = _chunk_handlers; (ch = *chsc++) != NULL;) {
|
||||||
while (true) {
|
while (true) {
|
||||||
if (((ch->flags >> CH_PRI_SHL) & (CH_NUM_PRI_LEVELS - 1)) == p)
|
if (((ch->flags >> CH_PRI_SHL) & (CH_NUM_PRI_LEVELS - 1)) == p)
|
||||||
SlSaveChunk(ch);
|
SlSaveChunk(ch);
|
||||||
|
@ -1162,7 +1216,7 @@ static const ChunkHandler *SlFindChunkHandler(uint32 id)
|
||||||
{
|
{
|
||||||
const ChunkHandler *ch;
|
const ChunkHandler *ch;
|
||||||
const ChunkHandler *const *chsc;
|
const ChunkHandler *const *chsc;
|
||||||
for (chsc = _sl.chs; (ch = *chsc++) != NULL;) {
|
for (chsc = _chunk_handlers; (ch = *chsc++) != NULL;) {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (ch->id == id) return ch;
|
if (ch->id == id) return ch;
|
||||||
if (ch->flags & CH_LAST) break;
|
if (ch->flags & CH_LAST) break;
|
||||||
|
@ -1197,7 +1251,7 @@ static void SlFixPointers()
|
||||||
|
|
||||||
DEBUG(sl, 1, "Fixing pointers");
|
DEBUG(sl, 1, "Fixing pointers");
|
||||||
|
|
||||||
for (chsc = _sl.chs; (ch = *chsc++) != NULL;) {
|
for (chsc = _chunk_handlers; (ch = *chsc++) != NULL;) {
|
||||||
while (true) {
|
while (true) {
|
||||||
if (ch->ptrs_proc != NULL) {
|
if (ch->ptrs_proc != NULL) {
|
||||||
DEBUG(sl, 2, "Fixing pointers for %c%c%c%c", ch->id >> 24, ch->id >> 16, ch->id >> 8, ch->id);
|
DEBUG(sl, 2, "Fixing pointers for %c%c%c%c", ch->id >> 24, ch->id >> 16, ch->id >> 8, ch->id);
|
||||||
|
@ -1454,62 +1508,6 @@ static void UninitWriteZlib()
|
||||||
************* END OF CODE *****************
|
************* END OF CODE *****************
|
||||||
*******************************************/
|
*******************************************/
|
||||||
|
|
||||||
/* these define the chunks */
|
|
||||||
extern const ChunkHandler _gamelog_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _map_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _misc_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _name_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _cheat_chunk_handlers[] ;
|
|
||||||
extern const ChunkHandler _setting_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _company_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _engine_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _veh_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _waypoint_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _depot_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _order_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _town_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _sign_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _station_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _industry_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _economy_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _subsidy_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _ai_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _animated_tile_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _newgrf_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _group_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _cargopacket_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _autoreplace_chunk_handlers[];
|
|
||||||
extern const ChunkHandler _labelmaps_chunk_handlers[];
|
|
||||||
|
|
||||||
static const ChunkHandler * const _chunk_handlers[] = {
|
|
||||||
_gamelog_chunk_handlers,
|
|
||||||
_map_chunk_handlers,
|
|
||||||
_misc_chunk_handlers,
|
|
||||||
_name_chunk_handlers,
|
|
||||||
_cheat_chunk_handlers,
|
|
||||||
_setting_chunk_handlers,
|
|
||||||
_veh_chunk_handlers,
|
|
||||||
_waypoint_chunk_handlers,
|
|
||||||
_depot_chunk_handlers,
|
|
||||||
_order_chunk_handlers,
|
|
||||||
_industry_chunk_handlers,
|
|
||||||
_economy_chunk_handlers,
|
|
||||||
_subsidy_chunk_handlers,
|
|
||||||
_engine_chunk_handlers,
|
|
||||||
_town_chunk_handlers,
|
|
||||||
_sign_chunk_handlers,
|
|
||||||
_station_chunk_handlers,
|
|
||||||
_company_chunk_handlers,
|
|
||||||
_ai_chunk_handlers,
|
|
||||||
_animated_tile_chunk_handlers,
|
|
||||||
_newgrf_chunk_handlers,
|
|
||||||
_group_chunk_handlers,
|
|
||||||
_cargopacket_chunk_handlers,
|
|
||||||
_autoreplace_chunk_handlers,
|
|
||||||
_labelmaps_chunk_handlers,
|
|
||||||
NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pointers cannot be saved to a savegame, so this functions gets
|
* Pointers cannot be saved to a savegame, so this functions gets
|
||||||
* the index of the item, and if not available, it hussles with
|
* the index of the item, and if not available, it hussles with
|
||||||
|
@ -1851,7 +1849,6 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb, boo
|
||||||
_sl.bufe = _sl.bufp = NULL;
|
_sl.bufe = _sl.bufp = NULL;
|
||||||
_sl.offs_base = 0;
|
_sl.offs_base = 0;
|
||||||
_sl.action = (mode != 0) ? SLA_SAVE : SLA_LOAD;
|
_sl.action = (mode != 0) ? SLA_SAVE : SLA_LOAD;
|
||||||
_sl.chs = _chunk_handlers;
|
|
||||||
|
|
||||||
/* General tactic is to first save the game to memory, then use an available writer
|
/* General tactic is to first save the game to memory, then use an available writer
|
||||||
* to write it to file, either in threaded mode if possible, or single-threaded */
|
* to write it to file, either in threaded mode if possible, or single-threaded */
|
||||||
|
|
Loading…
Reference in New Issue