[Add] Added propper unidiff cleanup.
This commit is contained in:
parent
fdd5e930f5
commit
80c45c3067
@ -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>
|
||||
|
@ -51,6 +51,7 @@
|
||||
#include "mission.h"
|
||||
#include "misn_lua.h"
|
||||
#include "lfile.h"
|
||||
#include "unidiff.h"
|
||||
#include "nebulae.h"
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
17
src/space.c
17
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;
|
||||
}
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user