[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 Drone" chance="80">remove</fleet>
</system>
<system name="C-59">
<planet name="S72839">remove</planet>
</system>
<system name="C-43">
<planet name="S23491">remove</planet>
</system>
</unidiff>
</unidiffs>

View File

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

View File

@ -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);

View File

@ -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;
}

View File

@ -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];
}