From 80c45c3067baa5ba5f7a35078e1cc6b47e22ca7f Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Wed, 11 Dec 2013 20:27:07 +0000
Subject: [PATCH] [Add] Added propper unidiff cleanup.

---
 dat/unidiff.xml |  6 ++++++
 src/lephisto.c  |  1 +
 src/player.c    |  2 ++
 src/space.c     | 17 +++++++++++++----
 src/unidiff.c   | 19 ++++++++++++++-----
 5 files changed, 36 insertions(+), 9 deletions(-)

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