+extern uint16_t rrand()
+{ /* Constants as recommended by POSIX.1-2001 (see man page rand(3)). */
+ world.seed = ((world.seed * 1103515245) + 12345) % 4294967296;
+ return (world.seed >> 16); /* Ignore less random least significant bits. */
+}
+
+
+
+extern void * try_malloc(size_t size, char * f)
+{
+ void * p = malloc(size);
+ exit_trouble(NULL == p, f, "malloc()");
+ return p;
+}
+
+
+
+extern void * try_calloc(size_t size1, size_t size2, char * f)
+{
+ void * p = calloc(size1, size2);
+ exit_trouble(NULL == p, f, "calloc()");
+ return p;
+}
+
+
+
+extern void check_files_xor(char * p1, char * p2)
+{
+ char * msg1 = "A file '";
+ char * msg2 = "' exists, but no file '";
+ char * msg3 = "'. If everything was in order, both or noe would exist. "
+ "The game won't start until this is corrected.";
+ uint16_t size = strlen(msg1) + strlen(p1) + strlen(msg2) + strlen(p2)
+ + strlen(msg3);
+ char msg[size];
+ if (!access(p1, F_OK) && access(p2, F_OK))
+ {
+ sprintf(msg, "%s%s%s%s%s", msg1, p1, msg2, p2, msg3);
+ errno = 0;
+ exit_err(1, msg);
+ }
+ else if (access(p1, F_OK) && !access(p2, F_OK))
+ {
+ sprintf(msg, "%s%s%s%s%s", msg1, p2, msg2, p1, msg3);
+ errno = 0;
+ exit_err(1, msg);
+ }
+}
+
+
+
+extern void check_tempfile(char * path)
+{
+ char * msg1 = "A file '";
+ char * msg2 = "' exists, probably from a corrupted previous file saving "
+ "process. To avoid corruption of game files, the game won't "
+ "start until it is removed or renamed.";
+ uint16_t size = strlen(msg1) + strlen(path) + strlen(msg2);
+ char msg[size];
+ sprintf(msg, "%s%s%s", msg1, path, msg2);
+ exit_err(!access(path, F_OK), msg);
+}
+
+
+
+extern void save_interface_conf()
+{
+ save_keybindings("config/keybindings_global", &world.kb_global);
+ save_keybindings("config/keybindings_wingeom", &world.kb_wingeom);
+ save_keybindings("config/keybindings_winkeys", &world.kb_winkeys);
+ save_win_configs();
+}
+
+
+
+extern void load_interface_conf()
+{
+ init_keybindings("config/keybindings_global", &world.kb_global);
+ init_keybindings("config/keybindings_wingeom", &world.kb_wingeom);
+ init_keybindings("config/keybindings_winkeys", &world.kb_winkeys);
+ init_winconfs();
+ init_wins();
+ sorted_wintoggle_and_activate();
+}
+
+
+
+extern void unload_interface_conf()
+{
+ free_keybindings(world.kb_global.kbs);
+ free_keybindings(world.kb_wingeom.kbs);
+ free_keybindings(world.kb_winkeys.kbs);
+ while (0 != world.wmeta->active)
+ {
+ suspend_win(world.wmeta->active);
+ }
+ free_winconfs();
+}
+
+
+
+extern void reload_interface_conf()