home · contact · privacy
Refactored similar array append activities into array_append().
authorChristian Heller <c.heller@plomlompom.de>
Sat, 25 Jan 2014 22:06:19 +0000 (23:06 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Sat, 25 Jan 2014 22:06:19 +0000 (23:06 +0100)
src/client/command_db.c
src/client/misc.c
src/client/misc.h
src/client/windows.c

index 27a3b6dc8d942552019a42e10c876daabc457ada..00a907b3c9d73470ebf781a38d156e48f3930678 100644 (file)
@@ -14,6 +14,7 @@
 #include "cleanup.h" /* set_cleanup_flag() */
 #include "world.h" /* global world */
 
+#include "misc.h"
 
 
 /* Point "ch_ptr" to next strtok() string in "line" delimited by "delim".*/
@@ -79,13 +80,8 @@ extern void init_command_db()
         char * arg_string = strtok(NULL, delim);
         cmd.arg = arg_string[0];
         copy_tokenized_string(NULL, &cmd.dsc_long, "\n");
-        uint32_t old_size = i * sizeof(struct Command);
-        uint32_t new_size = old_size + sizeof(struct Command);
-        struct Command * new_cmds = try_malloc(new_size, f_name);
-        memcpy(new_cmds, world.commandDB.cmds, old_size);
-        new_cmds[i] = cmd;
-        free(world.commandDB.cmds);
-        world.commandDB.cmds = new_cmds;
+        array_append(i, sizeof(struct Command), (void *) &cmd,
+                     (void **) &world.commandDB.cmds);
         i++;
     }
     try_fclose(file, f_name);
index a8cf0532e21c3aa767033e99124a3b8a2134b391..4f967dfdcbf764b6e5854f687664fcbe7426e05c 100644 (file)
@@ -22,6 +22,7 @@
                       */
 #include "world.h" /* global world */
 
+#include "../common/try_malloc.h" /* try_malloc() */
 
 
 extern void obey_argv(int argc, char * argv[])
@@ -136,3 +137,18 @@ extern void nav_inventory(char dir)
     world.player_inventory_select = world.player_inventory_select
                                     + (world.player_inventory_select < n_elems);
 }
+
+
+
+extern void array_append(uint32_t old_n, size_t region_size, void * new_region,
+                        void ** ptr_old_array)
+{
+    char * f_name = "array_append()";
+    uint32_t old_size = old_n * region_size;
+    uint32_t new_size = old_size + region_size;
+    void * new_array = try_malloc(new_size, f_name);
+    memcpy(new_array, * ptr_old_array, old_size);
+    memcpy(new_array + (old_n * region_size), new_region, region_size);
+    free(* ptr_old_array);
+    * ptr_old_array = new_array;
+}
index 5fb3e71e3e45aebd4bfb54fbd999cf79fc097978..30f171027bdc76e53acf5a8e26cbc326f8fcf0b2 100644 (file)
@@ -7,6 +7,9 @@
 #ifndef MISC_H
 #define MISC_H
 
+#include <stddef.h> /* size_t */
+#include <stdint.h> /* uint32_t */
+
 
 
 /* Parses command line argument -i into client configuration. */
@@ -26,6 +29,11 @@ extern void reload_interface_conf();
 /* Move world.inventory_sel up ("dir"="u") or down (else) as far as possible. */
 extern void nav_inventory(char dir);
 
+/* Append to array pointed to by "ptr_old_array" of "old_n" elements of
+ * "region_size" "new region".
+ */
+extern void array_append(uint32_t old_n, size_t region_size, void * new_region,
+                         void ** ptr_old_array);
 
 
 #endif
index 2fd51313405e1c4d9ebedaa33ff1273e4947be4a..ee74528f80c66271c7fe7e484875f525de4a18a6 100644 (file)
@@ -27,6 +27,7 @@
 #include "keybindings.h" /* free_keybindings(), write_keybidings_to_file(),
                           * read_keybindings_from_file()
                           */
+#include "misc.h" /* array_append() */
 #include "world.h" /* global world */
 
 
@@ -100,9 +101,6 @@ static void draw_wins(struct Win * w);
 static void append_win(struct Win * w);
 static void suspend_win(struct Win * w);
 
-/* Copy Win content pointed to by "win" into appendend world.winDB.wins area. */
-static void add_win_to_winDB(struct Win * win);
-
 
 
 static uint8_t get_pos_in_order(char c)
@@ -554,33 +552,6 @@ static void suspend_win(struct Win * w)
 
 
 
-static void add_win_to_winDB(struct Win * win)
-{
-    char * f_name = "add_win_to_winDB()";
-    if (world.winDB.ids)
-    {
-        uint8_t old_ids_size = strlen(world.winDB.ids);
-        char * new_ids = try_malloc(old_ids_size + 1 + 1, f_name);
-        sprintf(new_ids, "%s%c", world.winDB.ids, win->id);
-        free(world.winDB.ids);
-        world.winDB.ids = new_ids;
-        uint16_t old_wins_size = old_ids_size * sizeof(struct Win);
-        uint16_t new_wins_size = old_wins_size + sizeof(struct Win);
-        struct Win * new_wins = try_malloc(new_wins_size, f_name);
-        memcpy(new_wins, world.winDB.wins, old_wins_size);
-        new_wins[old_ids_size] = *win;
-        free(world.winDB.wins);
-        world.winDB.wins = new_wins;
-        return;
-    }
-    world.winDB.ids = try_malloc(2, f_name);
-    sprintf(world.winDB.ids, "%c", win->id);
-    world.winDB.wins = try_malloc(sizeof(struct Win), f_name);
-    world.winDB.wins[0] = *win;
-}
-
-
-
 extern uint16_t center_offset(uint16_t position, uint16_t mapsize,
                               uint16_t frame_size)
 {
@@ -644,7 +615,21 @@ extern uint8_t read_winconf_from_file(char * line, uint32_t linemax,
     win.target_width = atoi(line);
     win.target_width_type = (0 >= win.target_width);
     read_keybindings_from_file(line, linemax, file, &win.kb);
-    add_win_to_winDB(&win);
+    if (world.winDB.ids)
+    {
+        uint8_t old_ids_size = strlen(world.winDB.ids);
+        char * new_ids = try_malloc(old_ids_size + 1 + 1, f_name);
+        sprintf(new_ids, "%s%c", world.winDB.ids, win.id);
+        free(world.winDB.ids);
+        world.winDB.ids = new_ids;
+        array_append(old_ids_size, sizeof(struct Win), (void *) &win,
+                     (void **) &world.winDB.wins);
+        return 1;
+    }
+    world.winDB.ids = try_malloc(2, f_name);
+    sprintf(world.winDB.ids, "%c", win.id);
+    world.winDB.wins = try_malloc(sizeof(struct Win), f_name);
+    world.winDB.wins[0] = win;
     return 1;
 }