[Add] Added propper unidiff cleanup.

This commit is contained in:
Allanis 2013-12-11 20:27:07 +00:00
parent fdd5e930f5
commit 80c45c3067
5 changed files with 36 additions and 9 deletions

View File

@ -7,5 +7,11 @@
<fleet name="Collective Sml Swarm" chance="60">remove</fleet> <fleet name="Collective Sml Swarm" chance="60">remove</fleet>
<fleet name="Collective Drone" chance="80">remove</fleet> <fleet name="Collective Drone" chance="80">remove</fleet>
</system> </system>
<system name="C-59">
<planet name="S72839">remove</planet>
</system>
<system name="C-43">
<planet name="S23491">remove</planet>
</system>
</unidiff> </unidiff>
</unidiffs> </unidiffs>

View File

@ -51,6 +51,7 @@
#include "mission.h" #include "mission.h"
#include "misn_lua.h" #include "misn_lua.h"
#include "lfile.h" #include "lfile.h"
#include "unidiff.h"
#include "nebulae.h" #include "nebulae.h"

View File

@ -29,6 +29,7 @@
#include "map.h" #include "map.h"
#include "lfile.h" #include "lfile.h"
#include "spfx.h" #include "spfx.h"
#include "unidiff.h"
#include "player.h" #include "player.h"
#define XML_GUI_ID "GUIs" /**< XML section identifier for GUI document. */ #define XML_GUI_ID "GUIs" /**< XML section identifier for GUI document. */
@ -547,6 +548,7 @@ void player_cleanup(void) {
int i; int i;
player_clear(); player_clear();
diff_clear();
/* Clean up name. */ /* Clean up name. */
if(player_name != NULL) free(player_name); if(player_name != NULL) free(player_name);

View File

@ -755,7 +755,7 @@ int system_addPlanet(StarSystem* sys, char* planetname) {
/* Add planet <-> star system to name stack. */ /* Add planet <-> star system to name stack. */
spacename_nstack++; spacename_nstack++;
if(spacename_nstack > spacename_mstack) { if(spacename_nstack > spacename_mstack) {
spacename_stack += CHUNK_SIZE; spacename_mstack += CHUNK_SIZE;
planetname_stack = realloc(planetname_stack, planetname_stack = realloc(planetname_stack,
sizeof(char*) * spacename_mstack); sizeof(char*) * spacename_mstack);
systemname_stack = realloc(systemname_stack, systemname_stack = realloc(systemname_stack,
@ -776,11 +776,13 @@ int system_addPlanet(StarSystem* sys, char* planetname) {
* @return 0 on success. * @return 0 on success.
*/ */
int system_rmPlanet(StarSystem* sys, char* planetname) { int system_rmPlanet(StarSystem* sys, char* planetname) {
int i; int i, found;
Planet* planet; Planet* planet;
if(sys == NULL) if(sys == NULL) {
WARN("Unable to remove planet '%s' from NULL system.", planetname);
return -1; return -1;
}
/* Try to find planet. */ /* Try to find planet. */
planet = planet_get(planetname); planet = planet_get(planetname);
@ -789,14 +791,17 @@ int system_rmPlanet(StarSystem* sys, char* planetname) {
break; break;
/* Planet not found. */ /* 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; return -1;
}
/* Remove planet from system. */ /* Remove planet from system. */
sys->nplanets--; sys->nplanets--;
memmove(&sys->planets[i], &sys->planets[i+1], sizeof(Planet*) * (sys->nplanets-i)); memmove(&sys->planets[i], &sys->planets[i+1], sizeof(Planet*) * (sys->nplanets-i));
/* Remove from the name stack thingy. */ /* Remove from the name stack thingy. */
found = 0;
for(i = 0; i < spacename_nstack; i++) for(i = 0; i < spacename_nstack; i++)
if(strcmp(planetname, planetname_stack[i])==0) { if(strcmp(planetname, planetname_stack[i])==0) {
spacename_nstack--; spacename_nstack--;
@ -804,8 +809,12 @@ int system_rmPlanet(StarSystem* sys, char* planetname) {
sizeof(char*) * (spacename_nstack-i)); sizeof(char*) * (spacename_nstack-i));
memmove(&systemname_stack[i], &systemname_stack[i+1], memmove(&systemname_stack[i], &systemname_stack[i+1],
sizeof(char*) * (spacename_nstack-i)); sizeof(char*) * (spacename_nstack-i));
found = 1;
break; break;
} }
if(found == 0)
WARN("Unable to find planet '%s' and system '%s' in planet<->system stack.",
planetname, sys->name);
return 0; return 0;
} }

View File

@ -153,6 +153,7 @@ int diff_apply(char* name) {
return 0; return 0;
buf = pack_readfile(DATA, DIFF_DATA, &bufsize); buf = pack_readfile(DATA, DIFF_DATA, &bufsize);
doc = xmlParseMemory(buf, bufsize);
node = doc->xmlChildrenNode; node = doc->xmlChildrenNode;
if(strcmp((char*)node->name, "unidiffs")) { if(strcmp((char*)node->name, "unidiffs")) {
@ -173,6 +174,7 @@ int diff_apply(char* name) {
if(strcmp(diffname, name)==0) { if(strcmp(diffname, name)==0) {
diff_patch(node); diff_patch(node);
free(diffname); free(diffname);
DEBUG("Unidiff '%s' applied.", name);
return 0; return 0;
} }
free(diffname); free(diffname);
@ -215,7 +217,8 @@ static int diff_patch(xmlNodePtr parent) {
cur = node->xmlChildrenNode; cur = node->xmlChildrenNode;
do { do {
if(xml_isNode(cur, "planet")) { 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. */ /* Get the planet to modify. */
xmlr_attr(cur, "name", hunk.u.name); xmlr_attr(cur, "name", hunk.u.name);
@ -235,7 +238,8 @@ static int diff_patch(xmlNodePtr parent) {
diff_hunkSuccess(diff, &hunk); diff_hunkSuccess(diff, &hunk);
} }
else if(xml_isNode(cur, "fleet")) { 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. */ /* Get the planet to modify. */
xmlr_attr(cur, "name", hunk.u.name); xmlr_attr(cur, "name", hunk.u.name);
@ -255,6 +259,10 @@ static int diff_patch(xmlNodePtr parent) {
diff_hunkSuccess(diff, &hunk); diff_hunkSuccess(diff, &hunk);
} }
} while(xml_nextNode(cur)); } while(xml_nextNode(cur));
/* Clean up some stuff. */
free(base.target.u.name);
base.target.u.name = NULL;
} }
} while(xml_nextNode(node)); } while(xml_nextNode(node));
@ -304,7 +312,7 @@ static void diff_hunkFailed(UniDiff_t* diff, UniHunk_t* hunk) {
diff->mfailed += CHUNK_SIZE; diff->mfailed += CHUNK_SIZE;
diff->failed = realloc(diff->failed, sizeof(UniHunk_t) * diff->mfailed); 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->mapplied += CHUNK_SIZE;
diff->applied = realloc(diff->applied, sizeof(UniHunk_t) * diff->mapplied); 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; return;
diff_removeDiff(diff); diff_removeDiff(diff);
DEBUG("Unidiff '%s' removed.", name);
} }
/** /**
@ -363,7 +372,7 @@ static UniDiff_t* diff_newDiff(void) {
if(diff_stack == NULL) { if(diff_stack == NULL) {
diff_mstack = CHUNK_SIZE; diff_mstack = CHUNK_SIZE;
diff_stack = malloc(diff_mstack * sizeof(UniDiff_t)); diff_stack = malloc(diff_mstack * sizeof(UniDiff_t));
diff_nstack = 0; diff_nstack = 1;
return &diff_stack[0]; return &diff_stack[0];
} }