X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=src%2Fmisc.c;h=50fee6407854469819a691ccb8826943f55fd08a;hb=550d22ec0c3f530f5d317746f3f7e75251a1de4b;hp=697c182f7ae2b856c96e15a1727ddac84c8c46b0;hpb=55178f6102ba0cba96e52b03edb226e8f7ad686c;p=plomrogue diff --git a/src/misc.c b/src/misc.c index 697c182..50fee64 100644 --- a/src/misc.c +++ b/src/misc.c @@ -1,75 +1,114 @@ /* misc.c */ #include "misc.h" -#include /* for rename() */ +#include /* for errno */ #include /* for unlink(), acess() */ -#include /* for calloc(), free() */ +#include /* for size_t, calloc(), free() */ #include /* for strlen(), strcmp(), memcpy() */ -#include /* for uint8_t */ -#include "windows.h" /* for suspend_win(), append_win(), reset_pad_offset(), - * resize_active_win(), cycle_active_win(), - * shift_active_win(), struct Win, struct WinMeta - */ -#include "keybindings.h" /* for get_action_key(), save_keybindings(), - * keyswin_move_selection(), keyswin_mod_key() - */ -#include "readwrite.h" /* for [read/write]_uint[8/16/32][_bigendian]() */ +#include /* for uint8_t, uint16_t */ +#include "readwrite.h" /* for [read/write]_uint[8/16/32][_bigendian](), + * try_fopen(), try_fclose() + */ #include "map_objects.h" /* for struct Monster, write_map_objects(), */ #include "map_object_actions.h" /* for is_passable(), move_monster() */ -#include "map.h" /* for map_scroll(),map_center_player(), Map struct,dir enum */ +#include "map.h" /* for Map struct */ #include "main.h" /* for World struct */ -#include "yx_uint16.h" /* for yx_uint16 */ +#include "yx_uint16.h" /* for yx_uint16 struct */ #include "rrand.h" /* for rrand(), rrand_seed() */ #include "rexit.h" /* for exit_err() */ -extern void textfile_sizes(FILE * file, uint16_t * linemax_p, - uint16_t * n_lines_p) + +extern char * trouble_msg(struct World * w, 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 = malloc(size); + exit_err(NULL == msg, w, "malloc() in trouble_msg() failed."); + sprintf(msg, "%s%s%s%s%s", p1, parent, p2, child, p3); + return msg; +} + + + +extern void * try_malloc(size_t size, struct World * w, char * f) +{ + char * msg = trouble_msg(w, f, "malloc()"); + void * p = malloc(size); + exit_err(NULL == p, w, msg); + free(msg); + return p; +} + + + +extern void * try_calloc(size_t size1, size_t size2, struct World * w, char * f) +{ + char * msg = trouble_msg(w, f, "calloc()"); + void * p = calloc(size1, size2); + exit_err(NULL == p, w, msg); + free(msg); + return p; +} + + + +extern void check_files_xor(char * p1, char * p2, struct World * w) { - uint16_t n_lines = 0; - int c = 0; - uint16_t linemax = 0; - uint16_t c_count = 0; - while (EOF != c) + 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)) { - c_count++; - c = getc(file); - if ('\n' == c) - { - if (c_count > linemax) - { - linemax = c_count + 1; - } - c_count = 0; - if (n_lines_p) - { - n_lines++; - } - } + sprintf(msg, "%s%s%s%s%s", msg1, p1, msg2, p2, msg3); + errno = 0; + exit_err(1, w, msg); } - fseek(file, 0, SEEK_SET); - * linemax_p = linemax; - if (n_lines_p) + else if (access(p1, F_OK) && !access(p2, F_OK)) { - * n_lines_p = n_lines; + sprintf(msg, "%s%s%s%s%s", msg1, p2, msg2, p1, msg3); + errno = 0; + exit_err(1, w, msg); } } +extern void check_tempfile(char * path, struct World * w) +{ + 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), w, msg); +} + + + extern void update_log(struct World * world, char * text) { - static char * last_msg; - if (0 == last_msg) - { - last_msg = calloc(1, sizeof(char)); + char * f_name = "update_log()"; + static char * last_msg; /* TODO: valgrind is dissatisfied */ + if (0 == last_msg) /* with this calloc'd pointer not */ + { /* being freed. Rectify this? */ + last_msg = try_calloc(1, sizeof(char), world, f_name); } char * new_text; uint16_t len_old = strlen(world->log); if (0 == strcmp(last_msg, text)) { uint16_t len_whole = len_old + 1; - new_text = calloc(len_whole + 1, sizeof(char)); + new_text = try_calloc(len_whole + 1, sizeof(char), world, f_name); memcpy(new_text, world->log, len_old); memcpy(new_text + len_old, ".", 1); } @@ -77,10 +116,10 @@ extern void update_log(struct World * world, char * text) { uint16_t len_new = strlen(text); uint16_t len_whole = len_old + len_new + 1; - new_text = calloc(len_whole, sizeof(char)); + new_text = try_calloc(len_whole, sizeof(char), world, f_name); memcpy(new_text, world->log, len_old); memcpy(new_text + len_old, text, len_new); - last_msg = calloc(len_new + 1, sizeof(char)); + last_msg = try_calloc(len_new + 1, sizeof(char), world, f_name); memcpy(last_msg, text, len_new); } free(world->log); @@ -114,11 +153,26 @@ extern uint16_t center_offset(uint16_t pos, uint16_t mapsize, extern void turn_over(struct World * world, char action) { + char * f_name = "turn_over()"; + char * err_write = "Trouble in turn_over() with write_uint8() " + "writing to opened file 'record_tmp'."; + + char * recordfile_tmp = "record_tmp"; + char * recordfile = "record"; if (1 == world->interactive) { - FILE * file = fopen("record", "a"); - exit_err(write_uint8(action, file), world, "Record writing failure."); - fclose(file); + FILE * file_old = try_fopen(recordfile, "r", world, f_name); + FILE * file_new = try_fopen(recordfile_tmp, "w", world, f_name); + char c = fgetc(file_old); + while (EOF != c) + { + exit_err(write_uint8(c, file_new), world, err_write); + c = fgetc(file_old); + } + try_fclose(file_old, world, f_name); + exit_err(write_uint8(action, file_new), world, err_write); + try_fclose_unlink_rename(file_new, recordfile_tmp, recordfile, + world, f_name); } world->turn++; rrand_seed(world->seed * world->turn); @@ -135,86 +189,25 @@ extern void turn_over(struct World * world, char action) extern void save_game(struct World * world) { + char * f_name = "save_game()"; + char * err_write = "Trouble in save_game() " + "writing to opened file 'savefile_tmp'."; + char * savefile_tmp = "savefile_tmp"; - char * savefile = "savefile"; - FILE * file = fopen(savefile_tmp, "w"); - exit_err(0 == file, world, "Error saving game: " - "Unable to open new savefile for writing."); + char * savefile = "savefile"; + FILE * file = try_fopen(savefile_tmp, "w", world, f_name); if ( write_uint32_bigendian(world->seed, file) || write_uint32_bigendian(world->turn, file) + || write_uint16_bigendian(world->score, file) || write_uint16_bigendian(world->player->pos.y + 1, file) || write_uint16_bigendian(world->player->pos.x + 1, file) || write_uint8(world->player->hitpoints, file) || write_map_objects(world, world->monster, file) || write_map_objects(world, world->item, file)) { - exit_err(1, world, "Error saving game: " - "Trouble writing to opened new savefile."); - } - exit_err(fclose(file), world, "Error saving game: " - "Unable to close opened new savefile."); - if (!access(savefile, F_OK)) - { - exit_err(unlink(savefile), world, "Error saving game: " - "Unable to unlink old savefile."); - } - exit_err(rename(savefile_tmp, "savefile"), world, "Error saving game: " - "Unable to rename 'savefile_tmp' to 'savefile'."); -} - - - -extern void toggle_window(struct WinMeta * win_meta, struct Win * win) -{ - if (0 != win->frame.curses_win) - { - suspend_win(win_meta, win); - } - else - { - append_win(win_meta, win); - } -} - - - -extern void scroll_pad(struct WinMeta * win_meta, char dir) -{ - if ('+' == dir) - { - reset_pad_offset(win_meta, win_meta->pad_offset + 1); - } - else if ('-' == dir) - { - reset_pad_offset(win_meta, win_meta->pad_offset - 1); - } -} - - - -extern void growshrink_active_window(struct WinMeta * win_meta, char change) -{ - if (0 != win_meta->active) - { - struct yx_uint16 size = win_meta->active->frame.size; - if (change == '-') - { - size.y--; - } - else if (change == '+') - { - size.y++; - } - else if (change == '_') - { - size.x--; - } - else if (change == '*') - { - size.x++; - } - resize_active_win (win_meta, size); + exit_err(1, world, err_write); } + try_fclose_unlink_rename(file, savefile_tmp, savefile, world, f_name); } @@ -229,109 +222,3 @@ extern struct yx_uint16 find_passable_pos(struct Map * map) } return pos; } - - - -extern uint8_t meta_keys(int key, struct World * world, - struct WinMeta * win_meta, struct Win * win_keys, - struct Win * win_map, struct Win * win_info, - struct Win * win_log) -{ - if (key == get_action_key(world->keybindings, "quit")) - { - return 1; - } - else if (key == get_action_key(world->keybindings, "scroll pad right")) - { - scroll_pad (win_meta, '+'); - } - else if (key == get_action_key(world->keybindings, "scroll pad left")) - { - scroll_pad (win_meta, '-'); - } - else if (key == get_action_key(world->keybindings, "toggle keys window")) - { - toggle_window(win_meta, win_keys); - } - else if (key == get_action_key(world->keybindings, "toggle map window")) - { - toggle_window(win_meta, win_map); - } - else if (key == get_action_key(world->keybindings, "toggle info window")) - { - toggle_window(win_meta, win_info); - } - else if (key == get_action_key(world->keybindings, "toggle log window")) - { - toggle_window(win_meta, win_log); - } - else if (key == get_action_key(world->keybindings, "cycle forwards")) - { - cycle_active_win(win_meta, 'n'); - } - else if (key == get_action_key(world->keybindings, "cycle backwards")) - { - cycle_active_win(win_meta, 'p'); - } - else if (key == get_action_key(world->keybindings, "shift forwards")) - { - shift_active_win(win_meta, 'f'); - } - else if (key == get_action_key(world->keybindings, "shift backwards")) - { - shift_active_win(win_meta, 'b'); - } - else if (key == get_action_key(world->keybindings, "grow horizontally")) - { - growshrink_active_window(win_meta, '*'); - } - else if (key == get_action_key(world->keybindings, "shrink horizontally")) - { - growshrink_active_window(win_meta, '_'); - } - else if (key == get_action_key(world->keybindings, "grow vertically")) - { - growshrink_active_window(win_meta, '+'); - } - else if (key == get_action_key(world->keybindings, "shrink vertically")) - { - growshrink_active_window(win_meta, '-'); - } - else if (key == get_action_key(world->keybindings, "save keys")) - { - save_keybindings(world); - } - else if (key == get_action_key(world->keybindings, "keys nav up")) - { - keyswin_move_selection (world, 'u'); - } - else if (key == get_action_key(world->keybindings, "keys nav down")) - { - keyswin_move_selection (world, 'd'); - } - else if (key == get_action_key(world->keybindings, "keys mod")) - { - keyswin_mod_key (world, win_meta); - } - else if (key == get_action_key(world->keybindings, "map up")) - { - map_scroll (world->map, NORTH, win_map->frame.size); - } - else if (key == get_action_key(world->keybindings, "map down")) - { - map_scroll (world->map, SOUTH, win_map->frame.size); - } - else if (key == get_action_key(world->keybindings, "map right")) - { - map_scroll (world->map, EAST, win_map->frame.size); - } - else if (key == get_action_key(world->keybindings, "map left")) - { - map_scroll (world->map, WEST, win_map->frame.size); - } - else if (key == get_action_key(world->keybindings, "map center player")) - { - map_center_player (world->map, world->player, win_map->frame.size); - } - return 0; -}