diff --git a/include/wincurs.h b/include/wincurs.h index be79256b7..43fdb9de6 100644 --- a/include/wincurs.h +++ b/include/wincurs.h @@ -8,7 +8,7 @@ /* Global declarations for curses interface */ extern int term_rows, term_cols; /* size of underlying terminal */ -extern int orig_cursor; /* Preserve initial cursor state */ +extern int orig_cursor; /* Preserve initial cursor state */ extern WINDOW *base_term; /* underlying terminal window */ extern boolean counting; /* Count window is active */ extern WINDOW *mapwin, *statuswin, *messagewin; /* Main windows */ @@ -35,7 +35,7 @@ extern WINDOW *mapwin, *statuswin, *messagewin; /* Main windows */ #define MESG_HISTORY_MAX 200 #if !defined(__APPLE__) || !defined(NCURSES_VERSION) # define USE_DARKGRAY /* Allow "bright" black; delete if not visible */ -#endif /* !__APPLE__ && !PDCURSES */ +#endif /* !__APPLE__ && !PDCURSES */ #define CURSES_DARK_GRAY 17 #define MAP_SCROLLBARS #ifdef PDCURSES @@ -56,209 +56,134 @@ typedef enum orient_type UNDEFINED } orient; +#ifdef GCC_WARN +int wprintw(WINDOW *, const char *, ...) PRINTF_F(2, 3); +int mvwprintw(WINDOW *, int, int, const char *, ...) PRINTF_F(4, 5); +#endif /* cursmain.c */ extern struct window_procs curses_procs; extern void curses_init_nhwindows(int* argcp, char** argv); - extern void curses_player_selection(void); - extern void curses_askname(void); - extern void curses_get_nh_event(void); - extern void curses_exit_nhwindows(const char *str); - extern void curses_suspend_nhwindows(const char *str); - extern void curses_resume_nhwindows(void); - extern winid curses_create_nhwindow(int type); - extern void curses_clear_nhwindow(winid wid); - extern void curses_display_nhwindow(winid wid, BOOLEAN_P block); - extern void curses_destroy_nhwindow(winid wid); - extern void curses_curs(winid wid, int x, int y); - extern void curses_putstr(winid wid, int attr, const char *text); - -extern void curses_display_file(const char *filename,BOOLEAN_P must_exist); - +extern void curses_display_file(const char *filename, BOOLEAN_P must_exist); extern void curses_start_menu(winid wid); - extern void curses_add_menu(winid wid, int glyph, const ANY_P * identifier, - CHAR_P accelerator, CHAR_P group_accel, int attr, - const char *str, BOOLEAN_P presel); - + CHAR_P accelerator, CHAR_P group_accel, int attr, + const char *str, BOOLEAN_P presel); extern void curses_end_menu(winid wid, const char *prompt); - extern int curses_select_menu(winid wid, int how, MENU_ITEM_P **selected); - extern void curses_update_inventory(void); - extern void curses_mark_synch(void); - extern void curses_wait_synch(void); - extern void curses_cliparound(int x, int y); - -extern void curses_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,int glyph, int bkglyph); - +extern void curses_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, + int glyph, int bkglyph); extern void curses_raw_print(const char *str); - extern void curses_raw_print_bold(const char *str); - extern int curses_nhgetch(void); - extern int curses_nh_poskey(int *x, int *y, int *mod); - extern void curses_nhbell(void); - extern int curses_doprev_message(void); - -extern char curses_yn_function(const char *question, const char *choices, CHAR_P def); - +extern char curses_yn_function(const char *question, const char *choices, + CHAR_P def); extern void curses_getlin(const char *question, char *input); - extern int curses_get_ext_cmd(void); - extern void curses_number_pad(int state); - extern void curses_delay_output(void); - extern void curses_start_screen(void); - extern void curses_end_screen(void); - extern void curses_outrip(winid wid, int how); - extern void genl_outrip(winid tmpwin, int how, time_t when); - extern void curses_preference_update(const char *pref); - /* curswins.c */ extern WINDOW *curses_create_window(int width, int height, orient orientation); - extern void curses_destroy_win(WINDOW *win); - extern WINDOW *curses_get_nhwin(winid wid); - extern void curses_add_nhwin(winid wid, int height, int width, int y, - int x, orient orientation, boolean border); - + int x, orient orientation, boolean border); extern void curses_add_wid(winid wid); - extern void curses_refresh_nhwin(winid wid); - extern void curses_refresh_nethack_windows(void); - extern void curses_del_nhwin(winid wid); - extern void curses_del_wid(winid wid); - -extern void curses_putch(winid wid, int x, int y, int ch, int color, int attrs); - +extern void curses_putch(winid wid, int x, int y, int ch, + int color, int attrs); extern void curses_get_window_size(winid wid, int *height, int *width); - extern boolean curses_window_has_border(winid wid); - extern boolean curses_window_exists(winid wid); - extern int curses_get_window_orientation(winid wid); - extern void curses_get_window_xy(winid wid, int *x, int *y); - extern void curses_puts(winid wid, int attr, const char *text); - extern void curses_clear_nhwin(winid wid); - extern void curses_alert_win_border(winid wid, boolean onoff); - extern void curses_alert_main_borders(boolean onoff); - extern void curses_draw_map(int sx, int sy, int ex, int ey); - extern boolean curses_map_borders(int *sx, int *sy, int *ex, int *ey, - int ux, int uy); - + int ux, int uy); /* cursmisc.c */ extern int curses_read_char(void); - -extern void curses_toggle_color_attr(WINDOW *win, int color, int attr, int onoff); - +extern void curses_toggle_color_attr(WINDOW *win, int color, int attr, + int onoff); extern void curses_bail(const char *mesg); - extern winid curses_get_wid(int type); - extern char *curses_copy_of(const char *s); - extern int curses_num_lines(const char *str, int width); - extern char *curses_break_str(const char *str, int width, int line_num); - extern char *curses_str_remainder(const char *str, int width, int line_num); - extern boolean curses_is_menu(winid wid); - extern boolean curses_is_text(winid wid); - extern int curses_convert_glyph(int ch, int glyph); - extern void curses_move_cursor(winid wid, int x, int y); - extern void curses_prehousekeeping(void); - extern void curses_posthousekeeping(void); - extern void curses_view_file(const char *filename, boolean must_exist); - extern void curses_rtrim(char *str); - extern int curses_get_count(int first_digit); - extern int curses_convert_attr(int attr); - extern int curses_read_attrs(char *attrs); - extern int curses_convert_keys(int key); - extern int curses_get_mouse(int *mousex, int *mousey, int *mod); /* cursdial.c */ -extern void curses_line_input_dialog(const char *prompt, char *answer, int buffer); - -extern int curses_character_input_dialog(const char *prompt, const char *choices, CHAR_P def); - +extern void curses_line_input_dialog(const char *prompt, + char *answer, int buffer); +extern int curses_character_input_dialog(const char *prompt, + const char *choices, CHAR_P def); extern int curses_ext_cmd(void); - extern void curses_create_nhmenu(winid wid); -extern void curses_add_nhmenu_item(winid wid, int glyph, const ANY_P *identifier, - CHAR_P accelerator, CHAR_P group_accel, int attr, const char *str, - BOOLEAN_P presel); - +extern void curses_add_nhmenu_item(winid wid, int glyph, + const ANY_P *identifier, CHAR_P accelerator, + CHAR_P group_accel, int attr, + const char *str, BOOLEAN_P presel); extern void curses_finalize_nhmenu(winid wid, const char *prompt); - extern int curses_display_nhmenu(winid wid, int how, MENU_ITEM_P **_selected); - extern boolean curses_menu_exists(winid wid); - extern void curses_del_menu(winid wid); - /* cursstat.c */ extern void curses_status_init(void); -extern void curses_status_update(int, genericptr_t, int, int, int, unsigned long *); +extern void curses_teardown_status(void); +extern void curses_status_update(int, genericptr_t, int, int, int, + unsigned long *); /* cursinvt.c */ @@ -268,38 +193,25 @@ extern void curses_add_inv(int, int, CHAR_P, attr_t, const char *); /* cursinit.c */ extern void curses_create_main_windows(void); - extern void curses_init_nhcolors(void); - extern void curses_choose_character(void); - -extern int curses_character_dialog(const char** choices, const char *prompt); - +extern int curses_character_dialog(const char **choices, const char *prompt); extern void curses_init_options(void); - extern void curses_display_splash_window(void); - extern void curses_cleanup(void); - /* cursmesg.c */ extern void curses_message_win_puts(const char *message, boolean recursed); - extern int curses_block(boolean require_tab); /* for MSGTYPE=STOP */ - extern int curses_more(void); - extern void curses_clear_unhighlight_message_window(void); - -extern void curses_message_win_getline(const char *prompt, char *answer, int buffer); - +extern void curses_message_win_getline(const char *prompt, + char *answer, int buffer); extern void curses_last_messages(void); - extern void curses_init_mesg_history(void); - +extern void curses_teardown_messages(void); extern void curses_prev_mesg(void); - extern void curses_count_window(const char *count_text); #endif /* WINCURS_H */ diff --git a/win/curses/cursmesg.c b/win/curses/cursmesg.c index 8f3368f0a..49567bafd 100644 --- a/win/curses/cursmesg.c +++ b/win/curses/cursmesg.c @@ -266,6 +266,21 @@ curses_init_mesg_history() } } +/* Delete message history at game end. */ + +void +curses_teardown_messages(void) +{ + nhprev_mesg *current_mesg; + + while ((current_mesg = first_mesg) != 0) { + first_mesg = current_mesg->next_mesg; + free(current_mesg->str); + free(current_mesg); + } + last_mesg = (nhprev_mesg *) 0; + num_messages = 0; +} /* Display previous message window messages in reverse chron order */ diff --git a/win/curses/cursmisc.c b/win/curses/cursmisc.c index 4842804a9..b4b3764d7 100644 --- a/win/curses/cursmisc.c +++ b/win/curses/cursmisc.c @@ -270,8 +270,8 @@ curses_break_str(const char *str, int width, int line_num) int last_space, count; char *retstr; int curline = 0; - int strsize = strlen(str) + 1; -#if __STDC_VERSION__ >= 199901L + int strsize = (int) strlen(str) + 1; +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L char substr[strsize]; char curstr[strsize]; char tmpstr[strsize]; @@ -317,7 +317,7 @@ curses_break_str(const char *str, int width, int line_num) if (substr[count] == '\0') { break; } - for (count = (last_space + 1); (size_t) count < strlen(substr); count++) { + for (count = (last_space + 1); count < (int) strlen(substr); count++) { tmpstr[count - (last_space + 1)] = substr[count]; } tmpstr[count - (last_space + 1)] = '\0'; diff --git a/win/curses/cursstat.c b/win/curses/cursstat.c index a4f708163..f1ad01741 100644 --- a/win/curses/cursstat.c +++ b/win/curses/cursstat.c @@ -57,6 +57,20 @@ curses_status_init() genl_status_init(); } +void +curses_teardown_status() +{ +#ifdef STATUS_HILITES + int i; + + for (i = 0; i < MAXBLSTATS; ++i) { + free(status_vals_long[i]); + status_vals_long[i] = (char *) 0; + } +#endif /* STATUS_HILITES */ + return; +} + /* * *_status_update() * -- update the value of a status field. diff --git a/win/curses/curswins.c b/win/curses/curswins.c index f62cb7423..45cd0f7ef 100644 --- a/win/curses/curswins.c +++ b/win/curses/curswins.c @@ -312,7 +312,11 @@ curses_del_nhwin(winid wid) wid); return; } - + if (wid == MESSAGE_WIN) { + curses_teardown_messages(); + } else if (wid == STATUS_WIN) { + curses_teardown_status(); + } nhwins[wid].curwin = NULL; nhwins[wid].nhwin = -1; } @@ -562,11 +566,11 @@ curses_alert_main_borders(boolean onoff) static boolean is_main_window(winid wid) { - if ((wid == MESSAGE_WIN) || (wid == MAP_WIN) || (wid == STATUS_WIN) || wid == INV_WIN) { + if (wid == MESSAGE_WIN || wid == MAP_WIN + || wid == STATUS_WIN || wid == INV_WIN) return TRUE; - } else { - return FALSE; - } + + return FALSE; }