diff options
Diffstat (limited to 'web/web_scoreboard.c')
| -rw-r--r-- | web/web_scoreboard.c | 28 | 
1 files changed, 23 insertions, 5 deletions
| diff --git a/web/web_scoreboard.c b/web/web_scoreboard.c index ed25b33..a5001f7 100644 --- a/web/web_scoreboard.c +++ b/web/web_scoreboard.c @@ -16,11 +16,26 @@  static struct {  	bufstr name, rem, sugg, avg;  } *bufs; +static int n_bufs;  #define NUM_SLOTS 2  static int slots[NUM_SLOTS];  static int active_pn; +static void free_bufs() +{ +	for (int i = 0; i < n_bufs; ++i) { +		bufstr_clear(&bufs[i].name); +		bufstr_clear(&bufs[i].rem); +		bufstr_clear(&bufs[i].sugg); +		bufstr_clear(&bufs[i].avg); +	} + +	free(bufs); +	bufs = NULL; +	n_bufs = 0; +} +  static void flush_slot(int slot)  {  	int pn = slots[slot - 1]; @@ -212,8 +227,10 @@ void update_player_rem(int pn, int rem)  void scoreboard_show_info(int num_players)  { -	if (bufs) free(bufs); -	bufs = calloc(num_players, sizeof(*bufs)); +	if (bufs) +		free_bufs(); +	n_bufs = num_players; +	bufs = calloc(n_bufs, sizeof(*bufs));  	for (int i = 1; i <= num_players && i <= NUM_SLOTS; ++i) {  		set_slot_player(i, i); @@ -231,8 +248,8 @@ void scoreboard_show_info(int num_players)  void scoreboard_hide_info()  { -	free(bufs); -	bufs = NULL; +	if (bufs) +		free_bufs();  	memset(slots, 0, sizeof(slots));  	dom_set_uniq_class(NULL, "visible", ".info-slot .inner"); @@ -379,7 +396,8 @@ void draw_visits()  	if (state->m->n_players != 1 && state->m->legs[1]->n_visits > n_visits)  		n_visits = state->m->legs[1]->n_visits; -	struct dom_elem **elemv = malloc(7 * (n_visits + 1) * sizeof(*elemv)); +	struct dom_elem **elemv = malloc( +		(9 + (7 * n_visits)) * sizeof(*elemv));  	int elemc = 0;  	elemv[elemc++] = create_div("", "visit-p1-spacer"); | 
