From dc0ecd40ae54d742fad513474d7e47b398a00146 Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Sat, 17 May 2014 11:32:19 +0100
Subject: [PATCH] [Change] A little cleanup and optimization.

---
 src/space.c | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/src/space.c b/src/space.c
index 0e7e66b..ee5018b 100644
--- a/src/space.c
+++ b/src/space.c
@@ -696,16 +696,14 @@ static int planets_load(void) {
  *    @return 0 on success.
  */
 static int planet_parse(Planet* planet, const xmlNodePtr parent) {
-  int i;
+  int i, mem;
   char str[PATH_MAX];
   xmlNodePtr node, cur, ccur;
-  int len;
   unsigned int flags;
 
   /* Clear up memory for sane defaults. */
   memset(planet, 0, sizeof(Planet));
   planet->faction = -1;
-  str[0] = '\0';
   flags = 0;
 
   /* Get the name. */
@@ -721,9 +719,8 @@ static int planet_parse(Planet* planet, const xmlNodePtr parent) {
               PLANET_GFX_SPACE"%s", 1, 1, 0);
         }
         else if(xml_isNode(cur, "exterior")) { /* Load land gfx. */
-          len = strlen(xml_raw(cur)) + sizeof(PLANET_GFX_EXTERIOR);
-          planet->gfx_exterior = malloc(len);
-          snprintf(planet->gfx_exterior, len, PLANET_GFX_EXTERIOR"%s", xml_get(cur));
+          snprintf(str, PATH_MAX, PLANET_GFX_EXTERIOR"%s", xml_get(cur));
+          planet->gfx_exterior = strdup(str);
         }
       } while(xml_nextNode(cur));
     }
@@ -779,15 +776,23 @@ static int planet_parse(Planet* planet, const xmlNodePtr parent) {
         }
         else if(xml_isNode(cur, "commodities")) {
           ccur = cur->children;
+          mem = 0;
           do {
             if(xml_isNode(ccur, "commodity")) {
-              planet->commodities = realloc(planet->commodities,
-                  (planet->ncommodities+1) * sizeof(Commodity*));
-              planet->commodities[planet->ncommodities] =
-                commodity_get(xml_get(ccur));
               planet->ncommodities++;
+              /* Memory must grow. */
+              if(planet->ncommodities > mem) {
+                mem += CHUNK_SIZE_SMALL;
+                planet->commodities = realloc(planet->commodities,
+                    mem * sizeof(Commodity*));
+              }
+              planet->commodities[planet->ncommodities - 1] =
+                commodity_get(xml_get(ccur));
             }
           } while(xml_nextNode(ccur));
+          /* Shrink to minimum size. */
+          planet->commodities = realloc(planet->commodities,
+              planet->ncommodities * sizeof(Commodity*));
         }
       } while(xml_nextNode(cur));
     }