diff --git a/dat/unidiff.xml b/dat/unidiff.xml index fcdd2a5..44f836c 100644 --- a/dat/unidiff.xml +++ b/dat/unidiff.xml @@ -7,5 +7,11 @@ remove remove + + remove + + + remove + diff --git a/src/lephisto.c b/src/lephisto.c index 5ab05fd..466d883 100644 --- a/src/lephisto.c +++ b/src/lephisto.c @@ -51,6 +51,7 @@ #include "mission.h" #include "misn_lua.h" #include "lfile.h" +#include "unidiff.h" #include "nebulae.h" diff --git a/src/player.c b/src/player.c index 3aff6b8..00fdf1a 100644 --- a/src/player.c +++ b/src/player.c @@ -29,6 +29,7 @@ #include "map.h" #include "lfile.h" #include "spfx.h" +#include "unidiff.h" #include "player.h" #define XML_GUI_ID "GUIs" /**< XML section identifier for GUI document. */ @@ -547,6 +548,7 @@ void player_cleanup(void) { int i; player_clear(); + diff_clear(); /* Clean up name. */ if(player_name != NULL) free(player_name); diff --git a/src/space.c b/src/space.c index e66181c..4deb7e4 100644 --- a/src/space.c +++ b/src/space.c @@ -755,7 +755,7 @@ int system_addPlanet(StarSystem* sys, char* planetname) { /* Add planet <-> star system to name stack. */ spacename_nstack++; if(spacename_nstack > spacename_mstack) { - spacename_stack += CHUNK_SIZE; + spacename_mstack += CHUNK_SIZE; planetname_stack = realloc(planetname_stack, sizeof(char*) * spacename_mstack); systemname_stack = realloc(systemname_stack, @@ -776,11 +776,13 @@ int system_addPlanet(StarSystem* sys, char* planetname) { * @return 0 on success. */ int system_rmPlanet(StarSystem* sys, char* planetname) { - int i; + int i, found; Planet* planet; - if(sys == NULL) + if(sys == NULL) { + WARN("Unable to remove planet '%s' from NULL system.", planetname); return -1; + } /* Try to find planet. */ planet = planet_get(planetname); @@ -789,14 +791,17 @@ int system_rmPlanet(StarSystem* sys, char* planetname) { break; /* Planet not found. */ - if(i >= sys->nplanets) + if(i >= sys->nplanets) { + WARN("Planet '%s' not found in system '%s' for removal.", planetname, sys->name); return -1; + } /* Remove planet from system. */ sys->nplanets--; memmove(&sys->planets[i], &sys->planets[i+1], sizeof(Planet*) * (sys->nplanets-i)); /* Remove from the name stack thingy. */ + found = 0; for(i = 0; i < spacename_nstack; i++) if(strcmp(planetname, planetname_stack[i])==0) { spacename_nstack--; @@ -804,8 +809,12 @@ int system_rmPlanet(StarSystem* sys, char* planetname) { sizeof(char*) * (spacename_nstack-i)); memmove(&systemname_stack[i], &systemname_stack[i+1], sizeof(char*) * (spacename_nstack-i)); + found = 1; break; } + if(found == 0) + WARN("Unable to find planet '%s' and system '%s' in planet<->system stack.", + planetname, sys->name); return 0; } diff --git a/src/unidiff.c b/src/unidiff.c index b719858..34469bf 100644 --- a/src/unidiff.c +++ b/src/unidiff.c @@ -153,6 +153,7 @@ int diff_apply(char* name) { return 0; buf = pack_readfile(DATA, DIFF_DATA, &bufsize); + doc = xmlParseMemory(buf, bufsize); node = doc->xmlChildrenNode; if(strcmp((char*)node->name, "unidiffs")) { @@ -173,6 +174,7 @@ int diff_apply(char* name) { if(strcmp(diffname, name)==0) { diff_patch(node); free(diffname); + DEBUG("Unidiff '%s' applied.", name); return 0; } free(diffname); @@ -215,7 +217,8 @@ static int diff_patch(xmlNodePtr parent) { cur = node->xmlChildrenNode; do { if(xml_isNode(cur, "planet")) { - memcpy(&hunk, &base, sizeof(UniHunk_t)); + hunk.target.type = base.target.type; + hunk.target.u.name = strdup(base.target.u.name); /* Get the planet to modify. */ xmlr_attr(cur, "name", hunk.u.name); @@ -235,7 +238,8 @@ static int diff_patch(xmlNodePtr parent) { diff_hunkSuccess(diff, &hunk); } else if(xml_isNode(cur, "fleet")) { - memcpy(&hunk, &base, sizeof(UniHunk_t)); + hunk.target.type = base.target.type; + hunk.target.u.name = strdup(base.target.u.name); /* Get the planet to modify. */ xmlr_attr(cur, "name", hunk.u.name); @@ -255,6 +259,10 @@ static int diff_patch(xmlNodePtr parent) { diff_hunkSuccess(diff, &hunk); } } while(xml_nextNode(cur)); + + /* Clean up some stuff. */ + free(base.target.u.name); + base.target.u.name = NULL; } } while(xml_nextNode(node)); @@ -304,7 +312,7 @@ static void diff_hunkFailed(UniDiff_t* diff, UniHunk_t* hunk) { diff->mfailed += CHUNK_SIZE; diff->failed = realloc(diff->failed, sizeof(UniHunk_t) * diff->mfailed); } - memcpy(&diff->failed[diff->nfailed-1], &hunk, sizeof(UniHunk_t)); + memcpy(&diff->failed[diff->nfailed-1], hunk, sizeof(UniHunk_t)); } /** @@ -323,7 +331,7 @@ static void diff_hunkSuccess(UniDiff_t* diff, UniHunk_t* hunk) { diff->mapplied += CHUNK_SIZE; diff->applied = realloc(diff->applied, sizeof(UniHunk_t) * diff->mapplied); } - memcpy(&diff->applied[diff->napplied-1], &hunk, sizeof(UniHunk_t)); + memcpy(&diff->applied[diff->napplied-1], hunk, sizeof(UniHunk_t)); } /** @@ -341,6 +349,7 @@ void diff_remove(char* name) { return; diff_removeDiff(diff); + DEBUG("Unidiff '%s' removed.", name); } /** @@ -363,7 +372,7 @@ static UniDiff_t* diff_newDiff(void) { if(diff_stack == NULL) { diff_mstack = CHUNK_SIZE; diff_stack = malloc(diff_mstack * sizeof(UniDiff_t)); - diff_nstack = 0; + diff_nstack = 1; return &diff_stack[0]; }