From 00a7727e37e2d80ff115f03e7971a92c66edcd96 Mon Sep 17 00:00:00 2001
From: Christian Heller <c.heller@plomlompom.de>
Date: Mon, 25 Nov 2013 04:05:33 +0100
Subject: [PATCH] Some code-stylistic improvements to rexit library; also moved
 exit_trouble() into it.

---
 src/command_db.c |  3 ++-
 src/main.c       |  2 +-
 src/misc.c       | 17 +--------------
 src/misc.h       |  3 ---
 src/readwrite.c  |  3 +--
 src/rexit.c      | 54 ++++++++++++++++++++++++++++++------------------
 src/rexit.h      | 23 +++++++++++----------
 src/wincontrol.c |  4 ++--
 8 files changed, 53 insertions(+), 56 deletions(-)

diff --git a/src/command_db.c b/src/command_db.c
index 7e60b1d..fd7f4dc 100644
--- a/src/command_db.c
+++ b/src/command_db.c
@@ -7,7 +7,8 @@
 #include <string.h> /* for strlen(), strtok() */
 #include "main.h" /* for world global */
 #include "readwrite.h" /* for textfile_sizes(), try_fopen(), try_fclose() */
-#include "misc.h" /* for try_malloc(), exit_trouble */
+#include "misc.h" /* for try_malloc() */
+#include "rexit.h" /* exit_trouble() */
 
 
 
diff --git a/src/main.c b/src/main.c
index 4571438..9bb983d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -41,7 +41,7 @@ int main(int argc, char *argv[])
     init_command_db();
     set_cleanup_flag(CLEANUP_COMMAND_DB);
     init_map_object_actions();
-    set_cleanup_flag(CLEANUP_MAPOBJACTS);
+    set_cleanup_flag(CLEANUP_MAP_OBJECT_ACTS);
 
     /* Check for corrupted savefile / recordfile savings. */
     char * recordfile = "record";
diff --git a/src/misc.c b/src/misc.c
index 06c6a30..2cf9e62 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -16,7 +16,7 @@
 #include "map.h" /* for Map struct, is_passable() */
 #include "main.h" /* for world global */
 #include "yx_uint16.h" /* for yx_uint16 struct */
-#include "rexit.h" /* for exit_err() */
+#include "rexit.h" /* for exit_err(), exit_trouble() */
 #include "wincontrol.h" /* for init_winconfs(), init_wins(), free_winconfs(),
                          * sorted_wintoggle_and_activate()
                          */
@@ -34,21 +34,6 @@ extern uint16_t rrand()
 
 
 
-extern void exit_trouble(uint8_t test, char * parent, char * child)
-{
-    char * p1 = "Trouble in ";
-    char * p2 = " with ";
-    char * p3 = ".";
-    uint16_t size = strlen(p1) + strlen(parent) + strlen(p2) + strlen(child)
-                    + strlen(p3) + 1;
-    char msg[size];
-    exit_err(NULL == msg, "malloc() in trouble_msg() failed.");
-    sprintf(msg, "%s%s%s%s%s", p1, parent, p2, child, p3);
-    exit_err(test, msg);
-}
-
-
-
 extern void * try_malloc(size_t size, char * f)
 {
     void * p = malloc(size);
diff --git a/src/misc.h b/src/misc.h
index ddc6be6..24f36b5 100644
--- a/src/misc.h
+++ b/src/misc.h
@@ -20,9 +20,6 @@ struct Map;
  */
 extern uint16_t rrand();
 
-/* Do exit_err() with message: "Trouble in ".parent." with ".child."." */
-extern void exit_trouble(uint8_t test, char * parent, char * child);
-
 /* Wrappers to malloc(), calloc() from function called "f" calling exit_err()
  * with trouble_msg() error message if necessary.
  */
diff --git a/src/readwrite.c b/src/readwrite.c
index 531409e..e5db306 100644
--- a/src/readwrite.c
+++ b/src/readwrite.c
@@ -7,8 +7,7 @@
 #include <stdint.h> /* for uint8_t, uint16_t, uint32_t */
 #include <string.h> /* for strlen()*/
 #include <unistd.h> /* for unlink() */
-#include "rexit.h"  /* for exit_err() */
-#include "misc.h"   /* for exit_trouble() */
+#include "rexit.h"  /* for exit_err(), exit_trouble() */
 #include "main.h"   /* for world global */
 
 
diff --git a/src/rexit.c b/src/rexit.c
index 691cb68..f79eac7 100644
--- a/src/rexit.c
+++ b/src/rexit.c
@@ -2,14 +2,14 @@
 
 #include "rexit.h"
 #include <stdlib.h> /* for exit(), free(), defines EXIT_SUCESS, EXIT_FAILURE */
-#include <stdio.h> /* for printf(), perror() */
+#include <stdio.h> /* for printf(), perror(), sprintf() */
 #include <stdint.h> /* for uint8_t */
+#include <string.h> /* for strlen() */
 #include <errno.h> /* for errno */
 #include "main.h" /* for world global */
-#include "map.h" /* for Map struct */
-#include "keybindings.h" /* for free_keybindings() */
+#include "map.h" /* for Map struct ("free(world.map->cells)") */
 #include "command_db.h" /* for free_command_db() */
-#include "windows.h" /* for Win struct, free_winmeta_and_endwin() */
+#include "windows.h" /* for free_winmeta_and_endwin() */
 #include "map_objects.h" /* for free_map_objects, free_map_object_defs() */
 #include "misc.h" /* for unload_interface_conf() */
 #include "map_object_actions.h" /* for free_map_object_actions() */
@@ -24,14 +24,6 @@ static void cleanup();
 
 static void cleanup()
 {
-    if (cleanup_flags & CLEANUP_MAP_OBJECTS)
-    {
-        free_map_objects(world.map_objs);
-    }
-    if (cleanup_flags & CLEANUP_MAP_OBJECT_DEFS)
-    {
-        free_map_object_defs(world.map_obj_defs);
-    }
     if (cleanup_flags & CLEANUP_LOG)
     {
         free(world.log);
@@ -40,21 +32,29 @@ static void cleanup()
     {
         free_command_db();
     }
-    if (cleanup_flags & CLEANUP_MAPOBJACTS)
-    {
-        free_map_object_actions(world.map_obj_acts);
-    }
     if (cleanup_flags & CLEANUP_MAP)
     {
         free(world.map->cells);
     }
-    if (cleanup_flags & CLEANUP_INTERFACE)
+    if (cleanup_flags & CLEANUP_MAP_OBJECTS)
+    {
+        free_map_objects(world.map_objs);
+    }
+    if (cleanup_flags & CLEANUP_MAP_OBJECT_DEFS)
     {
-        unload_interface_conf();
+        free_map_object_defs(world.map_obj_defs);
     }
-    if (cleanup_flags & CLEANUP_NCURSES)
+    if (cleanup_flags & CLEANUP_MAP_OBJECT_ACTS)
     {
-        free_winmeta_and_endwin();
+        free_map_object_actions(world.map_obj_acts);
+    }
+    if (cleanup_flags & CLEANUP_INTERFACE) /* Only cleaning-up order          */
+    {                                      /* dependency known so far:        */
+        unload_interface_conf();           /* unload_interface_conf() must    */
+    }                                      /* come before                     */
+    if (cleanup_flags & CLEANUP_NCURSES)   /* free_winmeta_and_endwin()       */
+    {                                      /* since it depends on world.wmeta */
+        free_winmeta_and_endwin();         /* for closing all windows.        */
     }
 }
 
@@ -94,3 +94,17 @@ extern void exit_err(uint8_t err, char * msg)
     }
     exit(EXIT_FAILURE);
 }
+
+
+
+extern void exit_trouble(uint8_t err, char * parent, char * child)
+{
+    char * p1 = "Trouble in ";
+    char * p2 = " with ";
+    char * p3 = ".";
+    uint16_t size = strlen(p1) + strlen(parent) + strlen(p2) + strlen(child)
+                    + strlen(p3) + 1;
+    char msg[size];
+    sprintf(msg, "%s%s%s%s%s", p1, parent, p2, child, p3);
+    exit_err(err, msg);
+}
diff --git a/src/rexit.h b/src/rexit.h
index ab8e8ec..1c5c59d 100644
--- a/src/rexit.h
+++ b/src/rexit.h
@@ -7,8 +7,6 @@
 #ifndef REXIT_H
 #define REXIT_H
 
-
-
 #include <stdint.h> /* for uint8_t */
 
 
@@ -19,20 +17,20 @@
  */
 enum cleanup_flag
 {
-    CLEANUP_NCURSES         = 0x0001,
-    CLEANUP_MAP             = 0x0002,
-    CLEANUP_LOG             = 0x0004,
-    CLEANUP_COMMAND_DB      = 0x0008,
-    CLEANUP_MAPOBJACTS      = 0x0010,
-    CLEANUP_MAP_OBJECTS     = 0x0020,
-    CLEANUP_MAP_OBJECT_DEFS = 0x0040,
-    CLEANUP_INTERFACE       = 0x0080
+    CLEANUP_LOG             = 0x0001,
+    CLEANUP_COMMAND_DB      = 0x0002,
+    CLEANUP_MAP             = 0x0004,
+    CLEANUP_MAP_OBJECTS     = 0x0008,
+    CLEANUP_MAP_OBJECT_DEFS = 0x0010,
+    CLEANUP_MAP_OBJECT_ACTS = 0x0020,
+    CLEANUP_INTERFACE       = 0x0040,
+    CLEANUP_NCURSES         = 0x0080
 };
 extern void set_cleanup_flag(enum cleanup_flag flag);
 
 
 
-/* Exit orderly, clean up. */
+/* Exit orderly, clean up in an order respecting resource dependencies. */
 extern void exit_game();
 
 /* If "err" == 0, do nothing. Else, clean up and exit with an error message that
@@ -42,6 +40,9 @@ extern void exit_game();
  */
 extern void exit_err(uint8_t err, char * msg);
 
+/* Do exit_err() with "msg" as: "Trouble in ".parent." with ".child."." */
+extern void exit_trouble(uint8_t err, char * parent, char * child);
+
 
 
 #endif
diff --git a/src/wincontrol.c b/src/wincontrol.c
index aa705ec..4eca93b 100644
--- a/src/wincontrol.c
+++ b/src/wincontrol.c
@@ -12,7 +12,7 @@
 #include "readwrite.h" /* for get_linemax(), try_fopen(), try_fclose(),
                         * try_fgets(), try_fclose_unlink_rename(), try_fwrite()
                         */
-#include "rexit.h" /* for exit_err() */
+#include "rexit.h" /* for exit_err(), exit_trouble() */
 #include "draw_wins.h" /* for draw_win_map(), draw_win_info(), draw_win_log(),
                         * draw_win_available_keybindings(),
                         * draw_win_inventory(), draw_win_keybindings_global(),
@@ -20,7 +20,7 @@
                         * draw_win_keybindings_winconf_keybindings(),
                         * draw_winconf_geometry(), draw_winconf_keybindings()
                         */
-#include "misc.h" /* for try_malloc(), exit_trouble() */
+#include "misc.h" /* for try_malloc() */
 #include "dirent.h" /* for opendir(), closedir(), readdir() */
 #include "errno.h" /* for errno */
 #include "keybindings.h" /* for KeyBinding struct, free_keybindings() */
-- 
2.30.2